源:安卓能用的modebus CRC16计算,附上对应的C语言的CRC16
“源”即是原文地址,想了解作都更多文章及思想请移步到“源”。转过只是为了本人感兴趣的文章查找方便。
正文:
最近写安卓串口通信需要用到modebus 的crc16通信,网上找了很多都是字符串的,我需要byte的,由于java没有无符号数,转换有点小麻烦,对着C一部一部测试
代码如下:
//java
int CRC16_Check(byte Pushdata[],int length) { int Reg_CRC=0xffff; int temp; int i,j; for( i = 0; i<length; i ++) { temp = Pushdata[i]; if(temp < 0) temp += 256; temp &= 0xff; Reg_CRC^= temp; for (j = 0; j<8; j++) { if ((Reg_CRC & 0x0001) == 0x0001) Reg_CRC=(Reg_CRC>>1)^0xA001; else Reg_CRC >>=1; } } return (Reg_CRC&0xffff); }
//C
u16 CRC16_Check(u8 *Pushdata,u16 length) { u16 Reg_CRC=0xffff; u8 Temp_reg=0x00; u16 i,j; for( i = 0; i<length; i ++) { Reg_CRC^= *Pushdata++; for (j = 0; j<8; j++) { if (Reg_CRC & 0x0001) Reg_CRC=Reg_CRC>>1^0xA001; else Reg_CRC >>=1; } } return (Reg_CRC); }