OpenEdv-开源电子网

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

记录自己对于串口实验里面对于USART1_IRQHandler的理解

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-8-19 15:59:17 | 显示全部楼层 |阅读模式
记录自己对于串口服务函数的理解
  1. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //如果USART_IT_RXNE,说明接收到了数据
  2.                 {
  3.                 Res =USART_ReceiveData(USART1);        //读取接收到的数据
  4.                
  5.                 if((USART_RX_STA&0x8000)==0)//该判断一定成立,因为0&任何数结果都是0
  6.                         {
  7.                         if(USART_RX_STA&0x4000)//如果接收到了回车
  8.                                 {
  9.                                 if(Res!=0x0a)                //如果没有接收到换行
  10.                                         USART_RX_STA=0; //接收错误,重新开始接收
  11.                                 else                                 //如果接收到换行
  12.                                         USART_RX_STA|=0x8000;        //接收完成了,USART_RX_STA=0x8000 -->1000 0000 0000 0000
  13.                                 }
  14.                         else //如果没接收到回车
  15.                                 {       
  16.                                 if(Res==0x0d)    //如果接收到换行
  17.                                         USART_RX_STA|=0x4000;  //USART_RX_STA=0x4000 ---->0100 0000 0000 0000
  18.                                 else   //如果没接收到换行
  19.                                         {
  20.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//把接收到的数据保存在数组里面
  21.                                         USART_RX_STA++;//USART_RX_STA自加
  22.                                         if(USART_RX_STA>(USART_REC_LEN-1))//如果接受到数据大于最大字节USART_REC_LEN
  23.                                                 USART_RX_STA=0;//接收数据错误,重新开始接收          
  24.                                         }                 
  25.                                 }
  26.                         }                    
  27.      }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-7 11:47:06 | 显示全部楼层
windowa系统下,按一下Enter其实是 \n\r;unix是\n;mac下是\r
\n \r分别对应着0x0d 0x0a,所以接收到0x0d 0x0a说明数据接收完毕
串口接收/发送数据逻辑:
定义一个变量USART_RX_STA初始化为0,接收到数据之后,将USART_RX_STA&0011 1111 1111 1111结果为0,将接受到的数据保存在BUF[0]里面,然后USART_RX_STA++,变为1&0011 1111 1111 结果为1,将接收到的数据保存在BUF[1]里面,然后然后USART_RX_STA++,变为2&0011 1111 1111 ,将接收到的数据保存在BUF[2]里面…………如果接收到的数据是0x0d,USART_RX_STA=0x4000,如果接收到0x0d之后,接收到了0x0a,USART_RX_STA=0x8000。在main里面判断,如果USART_RX_STA&0x8000为真,判断发送完毕,将接收到的数据打印出来。
USART_RX_STA是一个15位的数,第15位置1说明接收完毕;第14位置1说明接收到0x0d
回复 支持 反对

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-7 11:48:28 | 显示全部楼层
\n\r是换行回车两个功能
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-12-5
在线时间
15 小时
发表于 2020-9-23 21:36:56 | 显示全部楼层
if((USART_RX_STA&0x8000)==0)//该判断一定成立,因为0&任何数结果都是0

  那么   if(USART_RX_STA&0x4000)         这个if语句括号内也恒为0,这个if语句就永远不会执行,是这样吗,-------来自小白的提问。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 21:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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