OpenEdv-开源电子网

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

对正点原子stm32F103串口通信模拟寄存器变量实现一个简单通信协议的理解

[复制链接]

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2019-5-27
在线时间
16 小时
发表于 2019-10-30 14:53:30 | 显示全部楼层 |阅读模式
  1. void USART1_IRQHandler(void)                        //串口1中断服务程序
  2.         {
  3.      u8 Res;//用于接收每次发送来的数据(一个数据帧)
  4.      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //满足条件说明接收到了一个数据帧,触发了接收中断,这时数据已经传入数据寄存器可以被读取
  5.     {
  6.         Res =USART_ReceiveData(USART1);        //读取接收到的数据,暂存到Res中  根据手册25.6.1这一节对寄存器 RXNE位的描述可知,读操作会将该标志位清0
  7.                
  8.         if((USART_RX_STA&0x8000)==0)//接收未完成,最高位没有得到接收完成标志,说明还在接收有效数据,这里认为还没有到达数据末尾,他是全局变量,初始化值为0,所以进入执行语句
  9.         {
  10.             if(USART_RX_STA&0x4000)//第一次接收,判断是否接收到了0x0d     ,第一次接收是没有收到回车字符的前半个字符的,直接跳到对应的else
  11.             {
  12.                  if(Res!=0x0a)USART_RX_STA=0;//接到了回车符的前半个字符却没有接收到后半个,说明接收错误,重新开始记录接收状态
  13.                                
  14.                 else USART_RX_STA|=0x8000;        //接收到了回车符的第二个字节,表明接收完成了
  15.              }
  16.             else //还没收到0X0D
  17.              {       
  18.                   if(Res==0x0d)USART_RX_STA|=0x4000;      
  19.                   else
  20.                   {
  21.                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//BUF的下标记录数据的存贮位置,讲RES的数据存在对应下标的数组元素中
  22.                        USART_RX_STA++;//更新下标值,等待存取下一个数据
  23.                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据超出了数组的最大容量,表示数据接收错误,重新开始接收
  24.                   }                  
  25.               }
  26.           }                    
  27.      }
  28. }
复制代码
在以上代码中进行了详细的注释,对串口接收中断记录接收数据状态的模拟寄存器进行了理解
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 09:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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