好多同学第一次定义通信协议的时候比较懵,包括我第一次搞串口通信的时候,好长时间都没想明白应该怎么进行两块开发板之间进行数据通信,如何通过一块开发板去操控另外一块开发板,因此写此文章,以供大家参考
首先明白啥是通信协议,参考百度百科 通信协议_百度百科 给出的定义,通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。其实光看这个定义绝对云里雾里的,不知所云。下面按照我的理解进行分解吧。
通信协议总共分三部分:
一:规定通信硬件接口方式,如通过串口,网络,蓝牙或者其它方式进行通信
二:规定硬件通信的语法,如:串口需要规定 波特率 数据位 停止位 奇偶校验位(比较常用的就是 115200 8 N 1 或 9600 8 N 1两种),在比如 网络规定TCP传输还是UDP传输,传输端口号为多少等
三:规定通信规则,如
帧头 (2字节) | 功能码 (1字节) | 参数 (1字节) | 数据长度 (1字节) | 数据 (N字节) | crc校验 (2字节) | 帧尾 (1字节) | |||
一帧数据的开头2字节,定义为帧头,比如为0x5A和0x54 | 这一字节分为高低四位 | 参数标号0x01~0x07分别表示不同的参数,例如参数1为IP地址,参数2为子网掩码,参数3为默认网关,参数4为http端口号 | 数据长度+数据(取值1~255) | 要发送的数据内容,存储顺序全部为网络字节序 | CRC_16校验,循环冗余校验码(CRC),用来检验数据是否正确,如果数据有误则弃包。 | 一帧 结束 标志 0xEE | |||
高四位为读写位: | |||||||||
低四位为回复位。 | |||||||||
读取0x10* | |||||||||
下置0x20* | |||||||||
回复读取0x01* | |||||||||
回复下置0x02* |
上面为总括规则,后面则根据上面规则进行详细的数据定义。比如:想定义一条设置IP的通信协议,则 可以如下设置
帧头 (2字节) | 功能码 (1字节) | 参数 (1字节) | 数据长度 (1字节) | 数据 (4字节) | crc校验 (2字节) | 帧尾 (1字节) | |||
0x5A,0x54 | 设置网络参数:0x11 | IP地址: 0x01 | 5 | IP地址 | CRC_16校验 | 结束0xee |
上面的通信协议仅仅是举例,实际协议则根据自己的项目需求进行对应更改即可。比如帧尾变成两个字节,功能码和参数合二为一,CRC校验采用1个字节的累加校验,超过255就溢出,只保留低八位即可等等