双机通信协议

来源:互联网 发布:邵逸夫的慈善事业知乎 编辑:程序博客网 时间:2024/06/10 16:29

背景

在做一些物联网项目的时候,会涉及到几个mcu之间通信交互,比如我们做的设备,是一款智能家居设备,我们的设备中有两颗mcu,而这两颗mcu之间是需要进行通信联调的。

需求分析

做的每一款产品,客户体验要好,就要求这个产品稳定型要好,就要求两颗mcu之间地通信必须稳定可靠,这就需要它们之间高效地进行信息交互。

 

系统介绍

在嵌入式应用中,目前常用的硬件接口有UARTSPII2C等串行接口。这里我们以最简单地uart为例,来详解两种MCU间的通信协议设计。

整体产品设计框架,当两个MCU之间需要进行通信的时候,发送方将API接口的数据信息A,丢给通信协议,通信协议按照特定帧格式把数据打包,通过UART接口发送给对方。接收方收到数据时,MCU运行相应的通信协议,把数据解包,就可以得到发送方的原始数据,将其交付给上层程序。体系结构如图所示。

底层uart驱动

设备产品要求不同,UART的工作方式也有所区别,主要表现在波特率、停止位、数据字长度等参数的设置。当两个mcu通过UART连接时,所有参数必须完全一致,否则通信出错。在此,要特别注意波特率的设置:当线路质量好的时候,波特率可以设置得高点,以获得较高的传输速率;线路质量差的时候,就要减小波特率,以降低误码率。
    
波特率不应设置得太高,避免造成寄存器数据溢出,进而造成死机或者接受数据异常。

数据缓存

我们在应用层处理数据的时候,可能此刻底层uart又会接受到数据,如果用同一组定义的数组,那应用层的数据,就会被改。所以定义接受缓存。

通信协议解析

一般的通信协议格式:T + L+V+C

T:

命令标志(1个字节)0x5A代表a设备发送给b设备,0xa5代表b设备发送给a设备

L

数据长度:(1个字节,虽然使用L位可以表示很长的数据帧,但在应用中应尽量采用短帧,以避免各种干扰因素造成少数数据位出错,导致大量数据无效,影响通信效率。同时,应该设置一个最大发送长度,以便设置超时重传计时器的值。

V

数据(N个字节,最大长度200

C:

CRC 校验,用于校验接收到的数据是否在传输过程中出错。

将缓存里收到的数据,按规定的协议解析。同理,若要发送数据,将要发送的数据添加起始标识符和长度后,计算CRC-16校验码,附在最后,形成一个完整的数据帧,然后通过UART发送出去。

数据信息

将接受到的数据,通过规定的通信协议格式解析以后,收到的V,就是应用层需要的数据信息。

API接口

应用层接口,将接受到的数据信息,去做一些逻辑处理。


mcu之间,能高效通信,执行有效命令,命令解析是重点,这里介绍做命令解析的思路。

我们使用的是uart dma接受方式,所以中断接受后的数据在dma地址里放着,长度最大值为10个字节。

大概思路是:

1.     从第一个字节开始,找帧头0x5a,如果第一个字节不是帧头,以此类推,从第二个字节开始找。如果没有在收到的这包数据里,没有找到包头,丢掉这包数据。

2.     如果在这包数据里,找到帧头,则对这包数据做crc校验。如果crc校验成功,则把这包数据,存在接受缓存,让上层应用层使用,如果crc校验不过,则重新找帧头,

 

 有问题及建议,联系jy1231_10@163.com



原创粉丝点击