传感器使用RS-232; 9600 8N1进行通信。
通信包由
header,payload和CRC组成。该手册提供了标题和有效载荷,您可以执行任何操作。每个通信包的组成如下:
<SOH> header <STX> payload <ETB> CRC16 <ETX>
<SOH>
:0x01<STX>
:0x02<ETB>
:0x17<ETX>
:0X03因此,发送传感器的命令是:\x01\x31\x02\x41\x17\CRC16\x03
现在作为示例,手册
也为您计算CRC16,以ASCII表示为A0D5。 CRC16需要传输的是低位字节序。
所以完整的命令现在是:\x01\x31\x02\x41\x17\x44\x35\x41\x30\x03
该手册未提供任何其他CRC16计算,它希望用户可以这样做:)
每个数据包均通过以十六进制ASCII编码(四个字符)传输的16位CRC进行验证。 CRC是从标头+有效负载串联中计算得出的
WORD CRC16_Compute( BYTE *pBuffer, WORD length )
{
BYTE i;
BOOL bs;
WORD crc=0;
while( length-- )
{
crc ^= *pBuffer++;
for( i = 0; i < 8; i++ )
{
bs = crc & 1;
crc >>= 1;
if( bs )
{
crc ^= 0xA001;
}
}
}
return crc;
}
那是C语言中的CRC计算器,我不太了解,但是此代码段是他们提供的,没有上下文。
在ASCII中,他们使用1 + A(0x31 + 0x41)获得2字节A0D5。有人可以向我解释CRC代码在做什么,谢谢!
gcc so.c -o so
./so
0xA0D5
01 31 02 41 17 44 35 41 30 03
正确答案怎么样?...您需要知道的一切都在您的问题中,只要按照它说的去做即可。粗略地整理了几分钟。
CRC是根据标头+有效负载计算的
data[0]=0x31; data[1]=0x41;
即报头和有效负载,它根据所提供的CRC代码给出正确的答案。然后,您将用其他物品组装包装。如果您使用google ASCII表,则可以看到'D''A''0''5'的值,并且可以弄清楚如何从0xD到0x44以及从0xA到0x41,但首先要看一下0x0到0x30和0x5到0x35, 0-9很简单,但是0x0A给出0x3A,但需要为0x41,因此您可以进行调整。
这应该是一个stackoverflow问题,您可能会对此有更进一步的了解,但这是编程问题的错误stackexchange网站。因此,代码根据描述的注释进行工作,我不知道该传感器,看起来像他们那样愚蠢,但是对于提供示例和crc16的细节非常有用,因为存在多种标准变体,包括初始值,因此又对节省时间节省了大量时间,对他们有利...