一、与Modbus TCP的区别
在一般工业场景使用modbus RTU的场景还是更多一些,modbus RTU基于串行协议进行收发数据,包括RS232/485等工业总线协议。与modbus TCP不同的是RTU没有报文头MBAP字段,保留从机地址,在尾部增加了两个CRC检验字节(CRC16),因为网络协议中自带校验,所以在 ModbusTCP协议中不需要使用CRC校验码。RTU和TCP的总体使用方法基本一致,只是在创建modbus对象时有所不同,TCP需要传入网络socket信息;而RTU需要传入串口相关信息
二、Modbus RTU特点
Modbus RTU也是主从问答协议,由主机发起,一问一答
三、Modbus RTU协议格式
ModbusRTU数据帧包含:从站地址 功能码 数据 CRC校验码
地址码:从机ID
功能码:同TCP
数据:起始地址 数量 数据
校验码:2个字节,对 地址码 功能码 数据进行校验,可以通过函数自动生成
四、报文详解
03功能码为例
主机--》从机
01 03 00 00 00 01 84 0A
01 : 从机地址
03:功能码,读取保持寄存器
00 00 :起始地址
00 01:读取的个数,1个。
84 0A:CRC校验码
从机---》主机
01 03 02 00 14 B4 44
01:从机地址
03:功能码
02:字节计数
00 14:数据
B4 44 :CRC校验码
五、linux端使用代码实现和串口连接
标签:RTU,00,01,03,Modbus,CRC,串口 From: https://blog.csdn.net/weixin_63207763/article/details/142367388#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include "Crc_Calc.h"
#include <unistd.h>
int main(int argc, char const *argv[])
{
// 1.打开COM1口
// 打开串口文件( /dev/ttyS1)
int fd=open("/dev/ttyS1",O_RDWR);
if (fd < 0)
{
perror("open err");
return -1;
}
// 2.串口初始化
uart_init(fd);// 使用专用函数即可
// 3.创建要发送的03功能数组
// 4.根据所要实现的功能,拼接好数组
//RTU 01 03 00 00 00 01
uint8_t req[12]={0x01,0x03,0x00,0x00,0x00,0x01};
uint8_t buf[32]={0};
// 5.加上CRC校验码
uint16_t Crc;
Crc=GetCRC16(req,6);//CRC=5;
req[6]=Crc >> 8; // y=CRC+1;
req[7]=Crc;
// 6.串口发送----向串口文件写数据
write(fd,req,8);
// 7.串口接收----读取串口文件
int ret=read(fd,buf,sizeof(buf));
// 8.打印收到的数据
for (int i = 0; i < ret; i++)
{
printf("%02x ",buf[i]);
}
printf("\n");
return 0;
}