简单的串行通讯。和使用C

问题描述 投票:0回答:1
计算CRC16
我有一个传感器,希望从中获取一些数据。我想询问日期或询问数据。

传感器使用RS-232; 9600 8N1进行通信。

通信包由

header,payloadCRC组成。该手册提供了标题和有效载荷,您可以执行任何操作。每个通信包的组成如下:

<SOH> header <STX> payload <ETB> CRC16 <ETX>

    <SOH>:0x01
  • <STX>:0x02
  • <ETB>:0x17
  • <ETX>:0X03
  • 本手册提供了一个示例,如果您想询问日期,它告诉您标题为0x31,有效载荷为0x41。

    因此,发送传感器的命令是:\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代码在做什么,谢谢!
  • c serial-port crc
    1个回答
    0
    投票
    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的细节非常有用,因为存在多种标准变体,包括初始值,因此又对节省时间节省了大量时间,对他们有利...

    © www.soinside.com 2019 - 2024. All rights reserved.