打印
[应用相关]

stm32板间串口通信escape协议

[复制链接]
568|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
观海|  楼主 | 2021-8-3 13:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近有使用串口的需求,用于两块板间的TTL串口通信,目前常见的串口通信协议可以归纳为两种模式

使用串口和一个定时器的通信协议【严格限制时间,常见协议为Modbus RTU】
使用单个串口的通信协议【存在数据头、数据尾,常见协议为三菱PLC使用的串口控制协议】
对于上述两种模式的优劣势我是如下理解的:

串口加定时器模式能够较好的限制通信时间,优势是在多设备通信过程中不会存在因某个通信包未发送完而导致通信系统瘫痪的问题;其劣势在于MCU板上资源紧张的情况下可能会无法抽出定时器给串口使用,串口通信效率为100%;
单串口通信的优势也就在于仅需一个串口即可实现数据的正常收发,缺点在于需要对电文进行额外处理,需要严格区分包头和包尾与中间数据,根据不同协议,串口通信效率一般低于100%。
综上即可根据不同的通信场景选择对应的通信模式,能够趋利避害,发挥对应优势

针对于需要多机在同一总线通信的情况下需要使用串口+定时器的通信模式,以防某个设备的通信故障导致其余正常设备无法通信。
针对于单点对单点通信则可以选择单串口通信模式,因为仅存在单设备,若出现通信故障则需要修整,不存在干涉到其它设备的问题。
单串口通信的几种方式
单串口通信的数据包基本可以固定为以下模式


由于通信过程中可能出现的数据位0x00~0xFF,涵盖了所有发送过程会出现的字符,所以在区分包头和包尾有了以下几种解决方案

将数据转换为ASCII码进行发送,例如数据0xA1需要解析成0x41和0x31【A的ASCII码和1的ASCII码】,该方法我是在三菱的串口通信协议中习得,显而易见的是该方法将单个数据拆分为两个数据,而数据仅使用了ASCII码的0-9、A-F,包头选择为0x01,包尾为0x03,数据与包头尾的问题得到解决。但缺点在于通信效率只有正常通讯效率的50%【一个数据拆分为两个字符发送】,可见效率较为低下;
采用关键字进行特殊处理,就是所谓的Escape协议,例如使用关键字0x81,包头变为0x81后接0x01,包尾变为0x81后接0x03,正常数据发送时,若要发送0x81,则发送0x81后接0x81实现,该方法也同样能解决包头包尾与数据内容的冲突,其通讯效率在极端情况下【传递的所有数据都与关键字相同】此时由于包头包尾都带关键字,所以效率会略低于50%,但在正常情况下,其期望通信效率约为99.8%,其通讯效率根据数据包内关键字的数量会出现变动。

Escape协议为串口底层协议,仅用于区分包头与数据内容





如果数据内容与关键字一致,则需要发送一次关键字、一次数据内容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

3912

帖子

1

粉丝