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

继续谈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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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