例如我要往一个串口发送
01 03 00 01 00 08 ,他的校验15 CC是怎么计算来的?找了不少资料,来来去去就那么一两句话,什么或运算,冗余的,看的懵懵懂懂,希望有一个详细的解释,步骤清楚一点的,(能多清楚就多清楚吧)如果可以,最好希望有注解的C++语言代码,满意可加分!
请问有相关的C语言或者C++语言的代码么?那样我好理解些,简单的一句话,我没弄太懂!
我就是有些这样的偏执,想知道所以然!根据C语言代码和别人说的解释,感觉完全不对头!好困惑!
追答循环冗余校验(CRC)生成步骤比较复杂 貌似要根据前面的数据位串生成多项式 然后用前面的数据位串除以多项式的系数生成的数据位 所得的余数不满16的添0
先拿01与11111111 11111111的前八个1异或,得到结果1111111011111111,然后这里是先移位,再检测执行第4步码?我右移一位,得到结果0111111101111111,此时LSB为1,异或0xA001,得到11011111 01111110,这算执行一次移位操作,再执行到移位七次,得到0110 0000 0011 1110,此时需要检测LSB为0,并对它再一次移位么?还是执行第八次移位后,就不判断LSB是否为零执行后续操作了?
还有就是高低位还弄不懂
你的理解有问题,首先要明白MSB是指bit15,LSB是指bit0;高字节是指bit15~bit8,低字节是指bit7~bit0。01若是报文第一个字节值(16进制,其2进制是00000001),那么:
第2步,01H与11111111 11111111的低字节异或,结果是11111111 11111110。
第3步,右移一位就成为01111111 11111111,检测的LSB原意是右移出来的位(即右移之前的LSB)。
第4步,判断LSB=0就直接返回第3步;LSB=1则把CRC寄存器与多项式值 0xA001异或,再返回第3步。
第5步,由于01H有8个bit,所以必须进行8 次”右移-判断是否要异或“操作,一个字节的处理才完毕。
第6步,按照第2~5步的操作处理第2个、第3个......字节,直至所有的报文字节被处理完毕。
字数太多了,只好截图了!
第一次的是引用资料,先右移再检测(移出的)LSB。
第二次说的也没错,先右移再检测右移之前的LSB,其实与第一次操作是一样的。
请注意:原资料的描述不够准确,因为右移出来的位不能再称为LSB。我加上括号的3个字就清楚了。
modbus协议CRC校验计算方式?该怎么计算?
把要发送的数据所有BIT首尾相连,变成一个8bit乘字节长度的大数,然后约定一个除数,计算最后的余数就是CRC。做二进制除法,每除一位时要做减法,商为1时减除数,商为零时不减除数,然后移到下一位继续算(这段不懂回忆一下小学10进制除法)。在实际应用中,为适应高速通信,二进制除法采用简易算法...
modbus中如何计算CRC效验(人工计算)
CRC计算方法是:1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。4、 如果移出位为零,则...
Modbus RTU CRC校验详细步骤CRC值怎么计算
CRC计算方法是:1、 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器 2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低八位相异或,吧结果存放于CRC寄存器。3、 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检测右移后的移出位。4...
Modbus CRC校验算法
1. 计算法:\/\/ modbus计算16位crc uint16 calcrc16(uint8 *p, uint8 len)...2. 查表法:\/\/ 高CRC字节初始化...uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];uchCRCLo = auchCRCLo[uIndex];3. 简单查表法2:const uint16 wCRCTalbeAbs[]...uint16 CRC16_2(uint8* pchMsg, ui...
MODBUS通讯CRC校验码怎么算,有那位能告诉我呀
V(x)=A(x)g(x)=xRm(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR 发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。3 | 评论 向TA求助 回答者: WTAO...
modbus. crc校验问题,请帮我具体计算下00和01分别的crc校验码是多少...
Modbus一般采用CRC16校验,特征多项式取0xA001。你可以用标准的CRC16算法代码,不过要更改特征多项式。所以一般大家都是用查表法处理Modbus的CRC校验部分的,反正也就512个字节。具体的代码你上网搜索“Modbus CRC16”,一抓一大把,我在这里就不贴了。十六进制数0x00的校验码为0x40BF,0x11的校验码为...
求助关于modbus协议crc效验的问题。。。
你这个不是MODBUS协议的问题,而是对CRC校验的概念不明确,CRC是循环的,全称是循环冗余校验码。针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,校验字是这样得到的 0x00-0xAB=0x55,发送方...
modbus协议的CRC循环冗余校验位,校验的究竟是什么,是数据位吗
所以MODBUS利用了一种方法,就是把每一个BYTE的数据和一个固定值(16位数值)进行一次运算(循环的,比如上面的数据中01运算完结果用在03上运算,再往下以此类推),最后得到一个2BYTE的数值(16位)。也就是经过这一系列的运算,发送方和接收方算出来的CRC数值应该相同的;如果传送中数据的某一位...
Modbus通讯协议的数据校验方式
X↑16+X↑15+X↑2+1可以表示为二进制数11000,0000,0000,0101。整数商位忽略不记,16位余数加入该报文(MSB先发送),成为2个CRC校验字节。余数中的1全部初始化,以免所有的零成为一条报文被接收。经上述处理而含有CRC字节的报文,若无错误,到接收设备后再被同一多项式(...
modbus协议RTU模式校验码怎么计算
modbus协议RTU模式校验码是CRC16-2编码。它由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或 (异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0) ,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(...