【发布时间】:2020-09-26 22:59:14
【问题描述】:
我有一个传感器,我希望从中获取一些数据。我想问它日期或要求它提供数据。
传感器使用RS-232; 9600 8N1 进行通讯。
通信包由header、payload和CRC组成。该手册为您想要做的任何事情提供了标头和有效负载。每个通信包的组成如下:
<SOH> header <STX> payload <ETB> CRC16 <ETX>
-
<SOH>: 0x01 -
<STX>:0x02 -
<ETB>: 0x17 -
<ETX>:0X03
手册给出了一个例子,如果你想询问日期,它告诉你header是0x31,payload是0x41。
因此发送传感器的命令是:\x01\x31\x02\x41\x17\CRC16\x03
现在作为一个例子,手册也为你计算CRC16,在ASCII中是A0D5。 CRC16需要小端传输。
所以现在完整的命令是:
\x01\x31\x02\x41\x17\x44\x35\x41\x30\x03
该手册不提供任何其他 CRC16 计算,它希望用户这样做很好:)
来自手册:每个数据包都由一个 16 位 CRC 验证,该 CRC 以十六进制 ASCII 编码(四个字符)传输。 CRC 由 header+payload 连接计算得到
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 计算器,我不太懂,但这个代码 sn-p 是他们提供的全部,没有上下文。
在 ASCII 中,他们使用 1+A (0x31+0x41) 来获得 2 字节,A0D5。谁能给我解释一下 CRC 代码在做什么,谢谢!
【问题讨论】:
-
这是一个纯粹的编程问题。该函数接收数据头和有效负载并计算 CRC16 校验和,这是 CRC16 的许多不同变体之一。你甚至研究过关于 CRC 的维基百科吗? “\x44\x35\x41\x30”是“D5A0”。 "\x01\x31\x02\x41\x17" 被输入 CRC 码。
-
首先阅读关于 CRC 的维基百科文章,然后就您不了解的部分提出一个重点问题。您可以参加 CRC 的整个课程。
-
当然,我理解CRC和按位运算符的前提。我在编程上卡住了——主要是 for 循环和 i++
-
一个好消息;如果创建一个实时应用程序,你从来没有检查过 CRC。
标签: c serial-port crc