Lazy loaded image
🌉开发框架搭建
二、通讯协议制订原则与样例
Words 1771Read Time 5 min
2024-10-14
2024-12-12
type
date
slug
category
icon
password
 
本节介绍自定义通讯协议制定原则,数据帧格式,并解释 Modbus-RTU 和 Mavlink协议。

数据帧设计原则

  • 简洁性:通讯协议应尽量简单,便于开发人员理解与实现。复杂的协议容易引入错误,增加维护难度。
  • 可扩展性:随着需求的变化,通讯协议可能需要新增功能。设计时应考虑到未来的扩展性,避免重构带来的成本。
  • 兼容性:新协议需与现有系统兼容,避免因不兼容导致的通信失败。设计时应遵循行业标准。

数据帧格式

notion image
  • START: 固定值0xAA,代表帧头。
    • 常用帧头 0x5AA5,两个字节,可以提高帧头的独特性
  • FROM: 可选,长度可变,标志数据帧源头ID,从哪个设备发送出来。对于总线通讯,用于区分不同设备
  • TO: 可选,长度可变,标志数据帧目标ID,发送到哪个设备。
    • 0xFF代表广播。
  • FLAGS: 可选,长度可变(uint_32 max),可选的用户标志,可以用标志协议版本兼容性等。
  • CMD: 功能码,需要做好划分,比如单字节表示CMD,前2位代表大类,后6位代表子类。
    • notion image
    • 信息类:从机主动上传数据,比如实时数据、检测数据等。
    • 命令类:主机控制设备命令,比如动作执行,设备自检等。
    • 参数类:从机运行参数查询和配置,比如设备配置、用户设备参数等。
      • 子类 0XXXXX: 查询参数,XXXXX为paramterID,011111为查询所有参数。
      • 子类 1XXXXX:修改参数,XXXXX为paramterID,修改值放置在DATA数据域。
    • 特殊类:用于其他特殊用途。
  • LEN: 数据长度。
    • 错误的长度数据可能导致栈帧或者全局变量被破坏,需要进行安全检查。
  • DATA: 数据域。
  • CRC: 8-bit CRC校验,去除START和STOP。
  • STOP: 固定值0x55,代表帧尾。
    •  对于固定长度报文,并且报文头部已经包括报文长度,可以不添加帧尾,有力提高通讯效率。比如Mavlink协议。
 

示例1:Modbus-RTU

Modbus 是应用层协议,不对下层指定物理层,可以用RS232,RS485 作为物理层,也可以用Ethernet 定义物理层、链路层。
  1. UART作为链路层指挥RS232,RS485 物理层
  1. TCP/IP 分别作为网络层和传输层,Ethernet链路层物理层
Modbus 常用协议,包括:MODBUS-RTU、MODBUS-ASCII、MODBUS-TCP。RTU相比较ASCII具备更紧凑的报文流,传输效率更高,目前MODBUS-ASCII已经应用较少。
notion image

数据帧格式

notion image

功能码说明

MODBUS 数据模型有四种,通过不同的功能码来读写这些数据对象。
对象类别
对象类型
访问类型
内容
离散量输入
单个比特
只读
I/O 系统提供这种类型数据
线圈
单个比特
读写
通过应用程序改变这种类型数据
输入寄存器
16-比特字
只读
I/O 系统提供这种类型数据
保持寄存器
16-比特字
读写
通过应用程序改变这种类型数据
notion image

读多个寄存器

发送命令格式:[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
例:[11][03][00][6B][00][03][CRC低][CRC高]
各字段含义如下:
  • 11:设备地址,样例中的地址是11,溶氧传感器端默认的地址是1,。
  • 03:读模拟量的命令号固定为03,这是Modbus协议规定的。
  • 00、6B:起始地址高8位(00)、低8位(6B):表示想读取的模拟量的起始地址,比方样例中的起始地址为107。这个006B表示一个完整的地址,注意这里的地址是高8位在前,低8位在后。
  • 00、03:寄存器数高8位(00)、低8位(03):表示从起始地址开始读多少个模拟量(返回的每个模拟量是用两个字节表示的)。样例中为3个模拟量。注意,在返回的信息中一个模拟量须要返回两个字节同一时候这里的地址也是高8位在前,低8位在后。
  • [CRC低][CRC高]:帧尾的CRC-16校验,尤其须要注意的一点是校验结果的低8位在前,高8位在后,这个顺序不同于起始地址以及读取深度的地址顺序。
设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8位] [CRC校验的高8位]
例:[11][03][06][02][2B][00][00][00][64][CRC低][CRC高]
各字段含义如下:
  • 11:设备地址(从机地址)。
  • 03:命令号。
  • 06:返回的字节个数(不高扩两字节的校验码):表示数据的字节个数,也就是数据1,2...n中的n的值。样例中返回了3个模拟量的数据,由于一个模拟量须要2个字节所以共6个字节。
  • 数据1...n:当中[数据1][数据2]各自是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。样例中返回的值各自是555,0,100。
  • [CRC低][CRC高]:CRC校验同上。
 

写单个模拟量寄存器

发送命令(主机向从机)格式:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
例:[11][06][00][01][00][03][CRC低][CRC高]
各字段含义如下:
  • 11:设备地址和上面的同样。
  • 06:写模拟量的命令号固定为06。
  • 00、01:要被写入的寄存器地址高8位,低8位。
  • 00、03:要被写入的数据高8位,低8位。比方样例中就把1号寄存器的值设为3。
    • 注意此命令一条仅仅能写入一个模拟量的状态。
  • [CRC校验的低8位] [CRC校验的高8位]:同上。
设备响应:假设成功把计算机发送的命令原样返回,否则不响应

示例2:MAVLink

 
 

 
上一篇
模板设计模式:让你的代码结构更清晰
下一篇
Guide to Linux System

Comments
Loading...