0.前言

项目中所用到的DI数字开关模块通信方式为串口通信,内置数据校验方式为Modbus CRC16。

这种校验方式第一次遇到,于是百度了一下,找到这篇文章,按照步骤,自己写了下代码,对比了下文中代码,基本一样。

1.实现步骤及代码

实现步骤

代码实现

#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{unsigned short CRC = 0xffff;//(1)CRC寄存器初值0xffffunsigned char data[6] = { 0x01,0x03,0x61,0x00,0x00,0x02 };//待校验的数据for (int i = 0; i < 6; i++)//(5)重复步骤2~4{CRC = CRC^data[i];//(2)数据与CRC异或for (int j = 0; j < 8; j++)//(4)重复8次步骤3{//(3)检测低位是否为1。方法:与1相与,低位为1则结果为1,低位为0则结果为0if (CRC & 1)//如果低位为1,则先右移一位,再与A001H相异或{CRC >>= 1;CRC ^= 0xA001;}else//低位为0,则右移一位CRC >>= 1;}}cout << CRC << endl;printf("%X", CRC);return 0;
}

之后,将该校验方法进行了封装:

#include<iostream>
#include <stdio.h>
#include<vector>
using namespace std;unsigned int modbusCRC16(const vector<unsigned char> &data)
{unsigned short CRC = 0xffff;//(1)CRC寄存器初值0xffffint dataSize = data.size();for (int i = 0; i < dataSize; i++)//(5)重复步骤2~4{CRC = CRC^data[i];//(2)数据与CRC异或for (int j = 0; j < 8; j++)//(4)重复8次步骤3{//(3)检测低位是否为1。方法:与1相与,低位为1则结果为1,低位为0则结果为0if (CRC & 1)//如果低位为1,则先右移一位,再与A001H相异或{CRC >>= 1;CRC ^= 0xA001;}else//低位为0,则右移一位CRC >>= 1;}}return CRC;
}
int main()
{vector<unsigned char> vec{ 0x01,0x02,0x02,0x03,0xFF };unsigned int CRC = modbusCRC16(vec);printf("%X", CRC);return 0;
}

2.测试

对上位机接收到的01 02 02 03 FF数据进行校验

结果如下:

这里,DI模块先发送低字节,再发送高字节,所以收到的是F9 08。windows下计算机为小端模式,低字节在前,可将08 F9转换为大端,再与F9 08进行比较。
关于小端转大端,Qt中可直接使用自带库函数qFromBigEndian(),需包含头文件#include<QtEndian>
其他可参照C/C++ —— 小端转大端函数的使用

Modbus CRC16校验方法及实现代码相关推荐

  1. php实现 crc16 xmode校验,基于Modbus三种CRC16校验方法的性能对比

    [toc] #1.背景介绍 主要应用场景在物联网中,底端设备注册报文的上报,需要对报文的有效载荷(data)进行CRC16的复验,验证与设备端的CRC校验是否相等,如果相等,报文有效,设备上报就会注册 ...

  2. java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

    ModBus 的Crc16校验 package testCase; public class CRC16M { static final String HEXES = "0123456789 ...

  3. Modbus crc16校验

    CRC-16 / MODBUS : 1)CRC寄存器初始值为 FFFF:即16位全为1: 2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) 'H'表示 ...

  4. python Modbus CRC16 校验计算公式加源码

    使用Python的确能快速的推进项目,特别是做工业控制和自动化控制程序,最近在忙富X康的一个SMT AGV项目,采用了Python直接通过串口,TCP/IP等,与远程IO,485IO等模块通讯并实现调 ...

  5. crc16校验c语言程序源码,CRC16代码(C语言实现)

    Modbus CRC16校验代码 嵌入式系统crc16校验码计算函数记录 /************************************************** * CRC 高位字节值 ...

  6. MODBUS RTU通信协议 CRC16校验

    MODBUS RTU通信协议 CRC16校验 方法1:查表法 方法2:c语言计算法 方法1:查表法 (1) C查表法版本: 特点:速度快,语句少,但表格占用一定的程序空间. *pucFrame 为待校 ...

  7. VS 2019 MFC CRC16校验算法例程总结(计算法/查表法以及CRC16校验表自动生成)

            工程需要,根据网上例程对CRC16校验方法进行了总结.CRC16为通讯领域常用的校验算法,其原理想必大家都很清楚.下面为相关的总结和封装类代码.被例程将CRC16校验的方法分为及算法和 ...

  8. c语言rtu crc16,Modbus-RTU-crc16校验方法C语言实现

    为确保消息数据的完整性,除了验证消息CRC之外,建议实现检查串行端口(UART)成帧错误的代码.如果接收消息中的CRC与接收设备计算的CRC不匹配,则应忽略该消息.下面的C语言代码片段显示了如何使用逐 ...

  9. stm32 CRC-16校验代码,单片机ModBUS-CRC16校验

    stm32系列内部均带有硬件CRC,不过为了方便移植,建议使用纯计算的方式,进行CRC-16计算.可用于ModBUS通信. 提供两种实现方法的代码: 1. 实时计算 CRC-16(耗时多) (这种方式 ...

最新文章

  1. 解决fstream不能打开带有中文路径文件的问题
  2. 设计模式(十一)桥梁模式(结构型)
  3. 关于i++和++i的实验结果解释
  4. C/C++ strict-aliasing
  5. linux 错误处理命令,Linux运行脚本命令提示No such file or directory错误的解决办法
  6. esper_Twitter4j和Esper:在Twitter上跟踪用户情绪
  7. c++【深度剖析shared_ptr】
  8. java做 binggo,Linux启动与停止spring boot工程的脚本示例
  9. c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt
  10. setInterval()与setTimeout()计时器
  11. 绘图的尺寸_Auto CAD机械绘图尺寸标注教程10(标注多重引线)
  12. 从你的全世界路过-人到难处需放胆
  13. 局部内部类使用局部变量应注意什么?
  14. 超星学习通 吉林大学 程序设计基础 实验07 递归程序设计(2022级)
  15. mysql导出表数据到文件_MySQL导出数据到文件中的方法
  16. 已知一/27网络中有一个地址是167.199.170.82,问这个网络的网络掩码、网络前缀长度和网络后缀长度是多少,求这个地址块的地址数、首地址以及末地址是多少
  17. 我叔叔愿意从事计算机工作英语翻译,我的叔叔作文
  18. smbd配置windows访问linux centos的共享文件
  19. linux执行可执行命令程序ls,linux运行可执行程序命令
  20. Windows应急响应

热门文章

  1. 常见分辨率和码率对应关系
  2. 玩转Java高并发?请先说明下并发下的惊群效应
  3. 98%的人都不会使用这6种地图可视化方法,学会直接涨薪5K
  4. 自动驾驶毫米波雷达的原理分析和应用案例
  5. Python爬一爬世界杯赛程
  6. MDK5__配色方案
  7. 找桌面背景(win10的和360的)
  8. 如何有效预防万象网管客户端被破解?
  9. DG保护模式--3种
  10. 让开发头疼的“验证码”有什么用?