Modbus协议ASCII模式下数据的LRC校验,计算校验时不包括开头的冒号字符,从第2个字符开始。计算LRC时先将原始的ASCII码格式的数据转换为HEX(ASCII码格式数据‘F’转换为0x0F);在将转换后的HEX数据按照高半字节在前低半字节在后的顺序(如a[1] = 0x0F, a[2] = 0x0A,合并后的数据=0xFA),将前后两字节合并成一字节;将上一步得到的数据累加求和(求和的结果放到一个unsigned int变量里面),对求和后的结果进行256求余,用256减去求余结果得到LRC值。基于以上流程的代码计算出来的LRC能够与Modbus Poll工具的校准值对的上,Modbus Poll软件给出的LRC示例代码有问题。
#define HEX2ASC(x) (((x)<=9)?((x)+0x30):((x)+0x37)) #define ASC2HEX(x) (((x)<='9')?((x)-'0'):((x)-'A'+10)) unsigned short CheckLRC(unsigned char *nData, unsigned short wLength) { unsigned char nLRC = 0 ; // LRC char initialized unsigned char *ptr; unsigned short Len,i; unsigned char Data; unsigned int sum = 0; if(wLength <= 1) return 0; ptr = nData+1; Len = wLength - 1; if(Len % 2) return 1; for (i = 0; i < Len; i+=2){ Data = ASC2HEX(*(ptr+i)) * 16; Data += ASC2HEX(*(ptr+i+1)); sum += Data; } nLRC = (unsigned char)(256 - (sum%256)); return (HEX2ASC(nLRC>>4)*256+HEX2ASC(nLRC&0x0F)); }
标签:LRC,字节,ASCII,校验,Modbus,数据 From: https://www.cnblogs.com/csjl2010/p/18260191