Modbus-RTU-crc16验证方法C语言实现

为了确保消息数据的完整性,除了验证消息CRC之外,建议实现一个代码,该代码检查串行端口(UART)中是否存在帧错误。如果接收到的消息中的CRC与接收设备计算出的CRC不匹配,则应忽略该消息。
以下C语言代码段显示了如何使用逐位移位和XOR操作来计算Modbus消息CRC。使用消息帧中的每个字节,除了包含CRC本身的最后两个字节以外,计算CRC。
1. CRC16校验码的使用现在,选择最常用的CRC-16校验来解释如何使用它。根据Modbus协议,常规485通信的信息发送形式如下:地址功能码数据信息校验码1byte 1byte nbyte 2byte CRC check是先前数据内容的校验值,为16位数据,当发送,! ! ! !低8位在前,高8位在后。
这是重要的一点! ! ! !例如:信息字段代码为:1011001,检查字段为:1010。发件人:发送的传输字段为:1 0 1 1 0 0 1 1 0 0信息字段检查字段收件人:使用相同的计算方法进行计算信息字段的校验码,并将其与接收到的实际校验码进行比较,如果信息相等且信息正确,则信息不正确;或者将所有接收到的信息除以多项式,如果可以将其除以则信息是正确的。
2. CRC16校验码的计算方法常用的查表法和计算方法。通常的计算方法为:(1)预设一个16位寄存器值0xFFFF,并将该寄存器称为CRC寄存器; (2)将第一个8位二进制数据(即,通信信息帧的第一个字)段与16位CRC寄存器的低8位进行XOR运算,将结果放入CRC寄存器,然后将结果存入CRC寄存器。
高八位数据保持不变; (3)将CRC寄存器的内容向右移一位(向高位),并用0填充最高位。(4)如果移位的位为0:重复步骤3(再次向右移一位);如果移位的位为1,则将CRC寄存器与多项式(A001)进行XOR运算(5)重复步骤3和4,直到向右移位8次为止,从而已处理了整个8位数据; (6)重复步骤2至5,以处理通信信息帧的下一个字节; (7)按照上述步骤计算出通信信息帧的所有字节后,交换得到的16位CRC寄存器的高字节和低字节; (8)最后获得的CRC寄存器的内容为CRC码。
上述计算步骤中的多项式A001是8005逐位求反的结果。高字节和低字节交换缺少一句话! ! ! -------------------------------------------------未签名整数CRC16; #define SEED 0xFFFF //初始化CRC16 #define GP 0xA001 //生成多项式//对于标准CRC16 //(除法除法)//开始一个新的CRC,设置CRC16 = SEED //然后对每个字节调用Calc_CRC(字节& amp; CRC16); // CRC16将包含结果///(如果计算所有传入数据// INCLUDING CRC,则结果应为0x0000 // //如果要发送CRC,请确保//以正确的顺序发送字节)void Calc_CRC(unsigned byte b,unsigned int * CRC){BOOL进位;我CRC [0] ^ = b& amp; 0xFF;对于(i = 0; i& lt; 8; i ++){进位= CRC [0]& amp; 0x0001; CRC [0]& gt; = 1; if(carry)CRC [0] ^ = GP;}} ----------- ------------------------- -------------这个代码是正确的! ! ! ! unsigned int CRC16_2(unsigned char * buf,int len){unsigned int crc = 0xFFFF; for(int pos = 0; pos& lt; len; pos ++){crc ^ =(unsigned int)buf [pos]; //将XOR字节写入最小sig。
//(int i = 8; i!= 0; i--)的crc字节//循环遍历每个位{if((crc& amp; 0x0001)!= 0)//如果设置了LSB {crc& ; gt;> = 1; //向右移动并XOR 0xA001 crc ^ = 0xA001;}否则//未设置其他LSB {crc& gt;& == 1; //仅向右移动}}} //高低字节转换crc =((crc& amp; 0x00ff)& lt;& lt; 8)| ((crc& amp; 0xff00)& gt; 8);返回crc;您也可以加入并共享。免责声明:本文内容经21ic授权后发布,版权归原作者所有。
该平台仅提供信息存储服务。本文仅代表作者的个人观点,并不代表该平台的立场。
如有任何疑问,请与我们联系,谢谢!

公司: 深圳市捷比信实业有限公司

电话: 0755-29796190

邮箱: ys@jepsun.com

产品经理: 汤经理

QQ: 2057469664

地址: 深圳市宝安区翻身路富源大厦1栋7楼

微信二维码

更多资讯

获取最新公司新闻和行业资料。

  • 铜的电阻温度系数约为0.004/°C 铜是一种常用的导电材料,因其良好的导电性能和相对较低的成本,在电气工程中被广泛应用。铜的电阻温度系数(temperature coefficient of resistance),是指在特定温度范围内,温度每变化1度时,其电阻值相对于基准温度(通常是2...
  • PTTC聚鼎PT08V2DF-C产品特性与应用范围详解 在现代电子技术飞速发展的今天,PTTC聚鼎PT08V2DF-C作为一种高性能的电子元器件,在多个领域中发挥着重要作用。PTTC聚鼎PT08V2DF-C是一种具备高可靠性、高稳定性的保护器件,广泛应用于各种电子设备中,以确保电路的安全运行。...
  • JMV-C积层压敏电阻技术参数及应用领域详解 积层压敏电阻(JMV-C)是一种广泛应用在电子设备中的关键保护元件,它能在瞬间吸收过电压,保护电路不受损害。JMV-C积层压敏电阻具有体积小、响应速度快、可靠性高等特点,特别适合用于电源线路和信号线路的过电压保护。...
  • 元利富气缸行程开关AL-10R, CS1-J, C系列:可靠性能与广泛应用 元利富生产的气缸行程开关AL-10R, CS1-J, C系列是工业自动化领域中的重要组成部分。这些型号的行程开关广泛应用于各种机械和设备中,用于检测气缸的位置变化,从而实现自动化控制的目的。AL-10R型行程开关以其紧凑的设计和可...
  • PT100热电阻温度与电阻值对照表(0°C基准0.385) 根据PT100热电阻的标准特性,其电阻值随温度变化而变化,通常基于0°C时电阻为100Ω作为参考。对于给定的温度系数α=0.385Ω/°C(这指的是每度变化的电阻增量),我们可以构建一个简化版的对照表来展示特定温度下对应的电阻值...
  • 费斯托SMT-8-NS-S-LED-24-B:精准可靠的位置控制解决方案 费斯托的SMT-8-NS-S-LED-24-B是一款高性能行程开关,它在自动化领域中扮演着重要角色。这款行程开关具有8毫米的检测距离,适用于需要精确位置控制的应用场景。其内置的LED指示灯可以直观地显示开关状态,便于用户监控和维护。...
  • ABB塑壳断路器(S系列.T系列): 高效可靠的配电解决方案 ABB塑壳断路器以其卓越的性能和可靠性在电气行业中享有盛誉。S系列和T系列作为ABB断路器中的佼佼者,分别针对不同的应用领域提供了高效且灵活的解决方案。S系列塑壳断路器设计紧凑、功能全面,适用于各种工业及商业环境...
  • 电阻r的大小对谐振频率有无影响 R对频率没有影响,但影响曲线的陡度,即质量因子Q。R越大,Q越低,峰值越慢。...
  • 欧璐O-墙壁开关:简约设计与实用功能的完美结合 欧璐O-墙壁开关是一款结合了实用性和设计感的产品,特别适合现代家居使用。这款开关设计为一开多三孔单的设计模式,意味着一个开关可以控制多个电器的电源,不仅节省了安装空间,还极大地提升了使用的便捷性。其外观简...
  • 实验中,测量输入电阻采用什么方法 输入电阻和输出电阻及其测量方法输入电阻输入电阻是从放大电路输入端看进去的等效电阻。Ri越大,表明放大电路从信号源索取的电流越小,放大电路所得到的输入电压Ui越接近信号源电压Us。然而,若信号源内阻Rs是常量,为使...
  • 爱普瑞BRT-205L-T:高效实用的智能设备 爱普瑞BRT-205L-T是一款高效实用的智能设备。该产品以其卓越的性能和便捷的操作体验,受到了广大用户的青睐。首先,在设计上,爱普瑞BRT-205L-T采用了先进的技术理念,确保了其在同类产品中的领先地位。无论是外观设计还是内...
  • 测量金属丝电阻率实验采用分压还是限流 视情况而定,如果题目明确要求电阻电压要从0开始变化,或者滑动变阻器的最大阻值远小于待测电阻的阻值,以上两种情况必须采用分压式.其次限流法测小电阻,分压式测大电阻(一般与滑动变阻器阻值相比). 希望对你有帮助...
  • 双臂电桥测金属电阻率实验视频 实验内容:用双臂电桥测量金属材料(铜棒、铝棒)的电阻率ρ,先用(3)式测量Rx,再用ρ=S/L*Rx求ρ。1.将铜棒安装在测试架上,按实验电路图接线。选择长度为50cm,调节R1,R2为1000W,调节R使得检流计指示为0,读出此时R的电阻值...
  • 电阻精密度1%能代0.1%吗? 不能!其实,对于不是搞计量的不需要分的那么清楚,可以大体上认为高精密、高准确、低误差等是一个意思。但是,对于“精度”一词,可以分解成分解成三个要素: 1 、温度系数:温度变化是电阻的大敌,温度系数一...
  • 霍尼韦尔行程开关SZL-WLC-B:高效稳定的工业解决方案 霍尼韦尔行程开关SZL-WLC-B是一款高性能的设备,专为满足各种工业应用的需求而设计。该行程开关具备出色的可靠性和耐用性,能够在严苛的工作环境中保持稳定的表现。其设计精巧,安装简便,可以有效减少安装时间和维护成...
  • TVS管是如何实现稳压功能的? TVS管是通过改变其结构和工作原理来实现稳压功能的。TVS管的基本工作原理是利用二极管的单向导电特性,将电路中的电压分成两个部分。其中,一个电压通过二极管,进入到TVS管的阴极,然后从阳极流出;另一个电压则被限制...
  • S.J.X自动压力开关隔膜泵:高效稳定的流体传输解决方案 S.J.X自动压力开关隔膜泵是一种高效、耐用的流体传输设备,广泛应用于化工、制药、食品加工等行业。该泵采用先进的自动压力开关技术,能够根据系统的压力变化自动调节运行状态,有效防止过压或欠压情况的发生,从而保护...
  • 浪涌保护器的专业术语 1.空气终端系统 用于直接接受或承受雷电的金属物体和金属结构,如避雷针、避雷带(线)、避雷网等。 2.引下线系统 连接空气终端和接地装置的金属...
  • 霍尼韦尔行程开关SZL-WL-B:工业自动化中的高效解决方案 霍尼韦尔行程开关SZL-WL-B是一款高性能的设备,专为满足各种工业应用的需求而设计。该行程开关具备出色的可靠性和耐用性,能够在严苛的工作环境中保持稳定的性能表现。它采用先进的技术制造而成,确保了高精度的位置检测...
  • 如何实现IC接口在系统中的应用 在现代计算机系统和软件开发中,接口(Interface)扮演着至关重要的角色,它定义了一组规则和方法,使得不同的组件或系统能够相互协作而无需关心对方的具体实现细节。IC(Integrated Circuit,集成电路)接口是硬件设计中的一个...