OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2798|回复: 7

STM32F103的串口接收显示

[复制链接]

8

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2017-1-12
在线时间
40 小时
发表于 2017-2-24 17:05:12 | 显示全部楼层 |阅读模式
3金钱
我想实现的目的是通过PC上的串口助手给MCU发一个字符,在程序里面可以把这个字符读出来,并且把这个字符付给一个变量,再把这个变量的值付给一个IO口,现在IO口看他的输出波形,不知道这么说你们明不明白,因为刚接触STM32好多地方不懂所以表达的可能也不准确不清楚,找了一个历程,可以实现通过PC给MCU发送字符,MCU在把接收到的字符通过PC上的串口助手显示出来,我就在该程序中串口的接收部分改了一点,程序中的“jieshou”被我定义到了一个IO口,但是串口助手在持续发送,IO口一直是低电平,我也感觉我改的串口接收的这一部分有问题,但是又不知道怎么改才是对的,所以希望大家能给我讲讲该怎么改,其他地方都没改过,之前的程序我也试过了是好的,可以实现PCF发字符给MCU,MCU再将字符返给PC,下面这个是我给的串口中断程序的部分。

QQ图片20170224170230.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2017-2-24 17:12:32 | 显示全部楼层
1、不是很清楚你在说什么
2、我也没看到你程序里有接收完成标志
3、发送程序也是有问题的
4、控制IO直接发hex的就行了
5、注意字符串是多个字节的要有接收完成标志
回复

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2017-2-24 17:20:41 | 显示全部楼层
你这个for循环 速度很快 你IO口哪反应的过来啊。。。
回复

使用道具 举报

8

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2017-1-12
在线时间
40 小时
 楼主| 发表于 2017-2-24 17:23:20 | 显示全部楼层
yijinxiaoyou 发表于 2017-2-24 17:12
1、不是很清楚你在说什么
2、我也没看到你程序里有接收完成标志
3、发送程序也是有问题的

void USART1_IRQHandler(void)
{  int RX_status;  //自己定义一个标志位
RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//读取接收数据标志位,如果装好了一帧数据则硬件将其置一。
if(RX_status == SET) {
USART_SendData(USART1 , USART_ReceiveData(USART1));//将收到的数据再由STM32发送给PC机。
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//等待发送完成。

}
}


这个 是这个程序这部分原来的样子 您看看
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2017-2-24 17:27:49 | 显示全部楼层
你可以参考原子的例程吧

#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        USART_SendData(USART1, (uint8_t)ch);
        return ch;
}
#endif

#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误          
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART_RX_STA = 0;       //接收状态标记          

/*
*********************************************************************************************************
*        函 数 名: bsp_InitUart
*        功能说明: 初始化串口硬件,并对全局变量赋初值.
*        形    参:  bound : 波特率
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_uart_init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
       
        //USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

        //USART1_RX          PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

        USART_DeInit(USART1);  //复位串口1
        //USART 初始化设置
        USART_InitStructure.USART_BaudRate = bound;                 //设置波特率;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;      //一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;         //无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

        USART_Init(USART1, &USART_InitStructure); //初始化串口
#if EN_USART1_RX                  //如果使能了接收  
        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
#endif
        USART_Cmd(USART1, ENABLE);                    //使能串口

}

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u8 Res;
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
                Res = USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据

                if ((USART_RX_STA & 0x8000) == 0)//接收未完成
                {
                        if (USART_RX_STA & 0x4000)//接收到了0x0d
                        {
                                if (Res != 0x0a)USART_RX_STA = 0;//接收错误,重新开始
                                else USART_RX_STA |= 0x8000;        //接收完成了
                        }
                        else //还没收到0X0D
                        {
                                if (Res == 0x0d)USART_RX_STA |= 0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;
                                        USART_RX_STA++;
                                        if (USART_RX_STA>(USART_REC_LEN - 1))USART_RX_STA = 0;//接收数据错误,重新开始接收          
                                }
                        }
                }
        }
}
回复

使用道具 举报

8

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2017-1-12
在线时间
40 小时
 楼主| 发表于 2017-2-24 17:45:26 | 显示全部楼层
aben 发表于 2017-2-24 17:20
你这个for循环 速度很快 你IO口哪反应的过来啊。。。

哦哦  那应该在哪加延时语句呢 大约延时多少啊
回复

使用道具 举报

8

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2017-1-12
在线时间
40 小时
 楼主| 发表于 2017-2-24 17:49:55 | 显示全部楼层
yijinxiaoyou 发表于 2017-2-24 17:27
你可以参考原子的例程吧

#if 1

嗯嗯 谢谢您提供的资料,我的这个程序里面这一部分和这差不多,好像是一样的,就是串口终端程序那里不一样,比这个简单但是没这个严密,这部分是可以用的,我就是想知道怎么把接收的数据在IO口输出来
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2017-2-24 18:16:43 | 显示全部楼层
本帖最后由 yijinxiaoyou 于 2017-2-24 18:17 编辑
浅白 发表于 2017-2-24 17:49
嗯嗯 谢谢您提供的资料,我的这个程序里面这一部分和这差不多,好像是一样的,就是串口终端程序那里不一 ...

如pa0

#define IO_0()        GPIOA->BRR = GPIO_Pin_0
#define IO_1()        GPIOA->BSRR = GPIO_Pin_0


main()
{
for(i=0;i<USART_RX_STA;i++)
{
  temp=read_bufff
for(x=0;x<8;x++)
{
if(temp&0x01)
{
IO_1();
}
else
{
IO_0();
}
temp>>1;
}
}

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 11:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表