你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

继续谈STM32串口通信时自定义协议问题(二)

[复制链接]
只取一瓢 发布时间:2020-10-23 11:01
上一篇我已经给大家介绍过了,不知道有没有人验证过我在上一篇文章中的程序,因为当时没有搭建硬件环境进行试验,程序在实际的板子上是跑不起来的,这篇文章就是来填坑的。

我想明白一个问题:其实具体的代码怎么写是不太重要的,重要的是我实现该功能的思路。只要把思路理顺,代码自然而然就出来了,这可能也是在逛论坛的时候,大家更喜欢分享自己的想法,而不愿意直接贴代码的原因。

说回我们的主题,自定义协议说白了就是协议的格式不同于其他的一些标准协议,但差别也仅仅体现在协议的内容上。在进行串口通信的时候,数据是一个字节一个字节的进行发送和接收的,理论上只要能实现一个字节的发送和接收,这个问题就已经解决了。但是很多人和我刚开始接触这个问题的时候一样,脑子转不过来,想不明白怎么从接收一个数据怎么扩展到接收一帧数据,下面给大家说一下我的思路:

我们先来说数据的接收,要实现这一功能显然离不了串口中断,既然要用到中断自然少不了对STM32进行配置;大致可以分为以下几个步骤:
串口时钟使能,GPIO时钟使能;
设置引脚复用映射;
GPIO初始化设置;
串口参数初始化;
开启中断;
使能串口;
编写中断处理函数;

以上这几个步骤都是些程式化的东西,只需要按照其要求按部就班的配置就可以了。编写中断处理函数是我们的重中之重,因为从这里开始才真正与我们要接受的数据有了联系。
11.png
我们要接收AA 01 01 02 BB这么一帧数据,我们可以按照下面这个流程图的方法来编写中断处理函数.

代码实现如下:
  1. void USART1_IRQHandler(void)                  
  2. {
  3.   u8 Res;//临时变量,存放串口接收的数据
  4.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  5.   {
  6.     Res =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据
  7.     if(rx_stack.head_flag==1)//收到了帧头
  8.     {
  9.         if(Res==rx_stack.tail)//判断当前值是不是帧尾
  10.         {
  11.           rx_stack.finish_flag = 1;
  12.           rx_stack.tail_flag=1;
  13.           rx_stack.head_flag=0;
  14.         }
  15.         else
  16.         {
  17.           rx_stack.recevie_data[rx_stack.data_pt] = Res;
  18.           rx_stack.data_pt++;
  19.           if(rx_stack.data_pt > 9)
  20.           {
  21.             rx_stack.data_pt = 0;
  22.           }
  23.         }                  
  24.     }
  25.     else//没有收到帧头
  26.     {
  27.       if(Res==rx_stack.head)
  28.         rx_stack.head_flag=1;
  29.       else
  30.       {
  31.         CommClr();
  32.         return;  
  33.       }  
  34.     }   
  35.   }
  36.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除接受中断标志
  37. }
复制代码

通过以上操作我们就可以将AA 01 01 02 7B这一帧数据存放到数组中了。那么我们怎么将控制字解析出来呢?这就要用到解包函数。解包函数怎么写相信大家应该有思路了吧!定义一个解包函数,先判断数据接收完成功能的标志位是不是已经置位,如果已经置位就直接把数组里相应位置的数据取出来就完成了。


当然,这种方法是可以实现我们最初制定的目标的,但是如果数据传输过程中出错该怎么办呢?会不会出现取出来的控制字和预期的不一样呢?这个问题小伙伴们可以自己去摸索。当然大家如果有更好的实现方法,也可以给我留言,一起交流一下。

上一篇传送:https://www.stmcu.org.cn/module/forum/thread-627440-1-1.html

收藏 评论0 发布时间:2020-10-23 11:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版