我正试图在设备和我的服务器之间进行无线电通信.设备中的数据如下所示:
fa-00-01-09-16-aa-00-14-10-01-01-00-01-16-ff-ff-ff-ff-ff-ff-cb-14
Run Code Online (Sandbox Code Playgroud)
最后两个字节是CRC.现在我需要向我的设备发送回复并计算其CRC.设备的数据表没有说太多,它只提供C函数来计算它,但我很难理解我应该为这个函数提供什么
unsigned int CRC_Check(unsigned char *ucCRC_Buf, unsigned char ucBufLength)
{
unsigned int uiX, uiY, uiCRC;
unsigned char ucStart = 0;
uiCRC = 0xFFFF; //set all 1
if (ucBufLength <= 0 || ucStart > ucBufLength)
{
uiCRC = 0;
}
else
{
ucBufLength += ucStart;
for (uiX = (unsigned int)ucStart; uiX < ucBufLength; uiX++)
{
uiCRC = (unsigned int)(uiCRC ^ ucCRC_Buf[uiX]);
for (uiY = 0; uiY <= 7; uiY++)
{
if((uiCRC & 1) != 0)
uiCRC = (unsigned int)((uiCRC >> 1)^0xA001);
else
uiCRC = (unsigned int)(uiCRC >> 1);
}
}
}
return uiCRC;
}
Run Code Online (Sandbox Code Playgroud)
数据手册还说" CRC检查是在数据包上进行的,不包括起始码和校验码 ",表示第一个字节(0xFA)和最后两个字节(CRC).
现在我正在努力理解它所期望的unsigned char *ucCRC_Buf和unsigned char ucBufLength.从我的主要我想做:
unsigned int crc = CRC_Check("00010916aa0014100101000116ffffffffffff",38);
printf("%d\n", crc);
Run Code Online (Sandbox Code Playgroud)
哪个是与开头相同的字符串(没有第一个和最后两个字节),我期待CB14(十六进制).但它给出了不同的数字(54016(dec),即D300(十六进制)).
知道我做错了什么吗?
可能你必须自己传递字节,而不是它们的十六进制表示.
更改
unsigned int crc=CRC_Check("00010916aa0014100101000116ffffffffffff",38);
Run Code Online (Sandbox Code Playgroud)
至
unsigned int crc=CRC_Check("\x00\x01\x09\x16\xaa\x00\x14\x10\x01\x01\x00\x01\x16\xff\xff\xff\xff\xff\xff", 19);
Run Code Online (Sandbox Code Playgroud)
请注意,只有19个字节.(谢谢@alk)