Modbus CRC校验字节生成算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

///


/// modbusCRC校验码生成算法(高低八位需要调换)
///

///
///
///
public uint crc16_modbus(byte[] modbusdata, uint length)//length为modbusdata长度
{
uint i, j;
uint crc16 = 0xFFFF;
for (i = 0; i < length; i++)
{
crc16 ^= modbusdata[i];//CRC = BYTE xor CRC
for (j = 0; j < 8; j++)
{
//如果CRC最后一位为1,右移一位后carry=1,则将CRC右移一位后,再与POLY16=0xA001进行xor预算
if ((crc16 & 0x01) == 1)
{
crc16 = (crc16 >> 1) ^ 0xA001;
}
else//如果CRC最后一位为0,则只将CRC右移一位
{
crc16 = crc16 >> 1;
}
}
}
return crc16;
}
public void main(string[] args)
{
byte[] b = new byte[6];
string s=txt_crc.Text.Trim();//s="01 03 00 00 00 14"
s = s.Replace(" ", "");
for (int i = 0; i < b.Length/2; i++)
{
string str = s.Substring(2 * i, 2);
b[i] = Convert.ToByte("0x" + str, 16);
}
//byte[] b = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x14};
txt_show.Text = Convert.ToString(crc16_modbus(b, 6), 16);
}

相关文档
最新文档