自定义串口通信协议,如何实现?
作者:发布时间:2021-06-05 20:28:52点击:1550
一.什么通信协议?通信协议不难理解,就是两个(或多个)设备之间进行通信,必须要遵循的一种协议。
百度百科的解释:通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。相应该有很多读者都买过一些基于串口通信的模块,市面上很多基于串口通信的模块都是自定义通信协议,有的比较简单,有的相对复杂一点。二.过于简单的通信协议引发的问题上面那种只有三个字节的通信协议,相信大家都看明白了。虽然它也能通信,也能传输数据,但它存在一系列的问题。比如:多个设备连接在一条总线(比如485)上,怎么判断传输给谁?(没有设备信息)还比如:处于一个干扰环境,你能保障传输数据正确吗?(没有校验信息)再比如:我想传输多个不确定长度的数据,该怎么办?(没有长度信息)。上面这一系列问题,相信做过自定义通信的朋友都了解。所以,在通信协议里面要约定更多的“协议信息”,这样才能保证通信的完整。三.通信协议常见内容基于串口的通信协议通常不能太复杂,因为串口通信速率、抗干扰能力以及其他各方面原因,相对于TCP/IP这种通信协议,是一种很轻量级的通信协议。所以,基于串口的通信,除了一些通用的通信协议(比如:Modubs、MAVLink)之外,很多时候,工程师都会根据自己项目情况,自定义通信协议。四.通信协议代码实现自定义通信协议,代码实现的方式有很多种,怎么说呢,“条条大路通罗马”你只需要按照你协议要写实现代码就行。当然,实现的同时,需要考虑你项目实际情况,比如通信数据比较多,要用消息队列(FIFO),还比如,如果协议复杂,最好封装结构体等。1.消息数据发送a.通过串口直接发送每一个字节b.通过消息队列发送在上面基础上,用一个buf装下消息,然后“打包”到消息队列,通过消息队列的方式(FIFO)发送出去。c.用“结构体”代替“数组SendBuf”方式结构体对数组更方便引用,也方便管理,所以,结构体方式相比数组buf更高级,也更实用。(当然,如果成员比较多,如果用临时变量方式也会导致占用过多堆栈的情况).其他更多串口发送数据的方式有很多,比如用DMA的方式替代消息队列的方式。五.最后以上自定义协议内容仅供参考,最终用哪些、占用几个字节都与你实际需求有关。基于串口的自定义通信协议,有千差万别,比如:MCU处理能力、设备多少、通信内容等都与你自定义协议有关。有的可能只需要很简单的通信协议就能满足要求。有的可能需要更复杂的协议才能满足。