Modbus协议ASCII模式下数据的LRC校验

       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));
}

 

posted @ 2024-06-21 11:26  牵手晴天  阅读(527)  评论(0)    收藏  举报