前言
最近接了一个项目,需要使用Modbus协议,虽然之前有所耳闻,但一直没有实操过,但实践之后发现其实还是很简单的,我认为它本质上就是对串口传输进行“二次封装”。
建议的入门顺序
- 大神带你秒懂Modbus通信协议——理解基本概念
- STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发——实战演练
相关软件
为了更加方便调试Modbus,这里推荐几个软件:
- SSCOM:串口调试助手,但具有自动添加Modbus校验的功能
- Modbus Poll:模拟Modbus主机,链接为官网下载链接,SN为
5A5742575C5D136F5843535610685C49434C1232131164706378
- Modbus Slave:模拟Modbus从机,链接为官网下载链接,SN为
54554154514756666A655A187D545E505C454F
CRC校验码计算函数
这个是按照协议设定的方式来按过程实现的代码
void CRC16(unsigned char frame[], unsigned char length)
{
unsigned int crc16 = 0xffff;
unsigned char byteIndex, n;
for (byteIndex = 0; byteIndex < length - 2; byteIndex++)
{
crc16 ^= frame[byteIndex];
for (n = 0; n < 8; n++)
{
if (crc16 & 1)
{
crc16 >>= 1;
crc16 ^= 0xA001;
}
else
crc16 >>= 1;
}
}
frame[length - 2] = crc16; //记住,校验码低位在前,高位在后!
frame[length - 1] = crc16 >> 8;
}
网上还有的是根据异或的规律列出所有的可能值,然后直接按下标索引,实际跑起来应该会快些,有兴趣的可以找找相关代码,此处不再列举。