首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRC值计算

CRC值计算
EN

Stack Overflow用户
提问于 2020-12-01 05:09:55
回答 1查看 53关注 0票数 0

我正在研究PLC和第三方设备之间的通信命令协议。

制造商向我提供了以下信息,用于计算CRC值,该值将根据我希望从中读取信息的设备的地址而变化。

代码语言:javascript
复制
A CRC is performed on a block of data, for example the first seven bytes of all transmissions are followed by a two byte CRC for that data. This CRC will be virtually unique for that particular combination of bytes. The process of calculating the CRC follows:

Inputs:
N.BYTES = Number or data bytes to CRC ( maximum 64 bytes )
DATA() = An array of data bytes of quantity N.BYTES
CRC.MASK = 0xC9DA a hexadecimal constant used in the process

Outputs:
CRC = two byte code redundancy check made up of CRC1 (High byte) and CRC2 (Low byte)

Process:
START
CRC = 0xFFFF
FOR N = 1 TO N.BYTES
CRC = CRC XOR ( DATA(N) AND 0xFF )
     FOR I = 1 TO 8
     IF ( CRC AND 0x0001 ) = 0 THEN LSR CRC
     ELSE LSR CRC ; CRC = CRC XOR CRC.MASK
     NEXT I
NEXT N
X = CRC1 ; Change the two bytes in CRC around
CRC1 = CRC2
CRC2 = X
END

他们还为我提供了两个完整的命令字符串,用于前几个设备地址。

代码语言:javascript
复制
RTU #1
05-64-00-02-10-01-00-6C-4B-53-45-EB-F7
RTU #2
05-64-00-02-10-02-00-1C-AE-53-45-EB-F7
RTU #3
05-64-00-02-10-03-00-CC-F2-53-45-EB-F7

前三个命令中的头部CRC字节分别为6C-4B、1C-AE和CC-F2。

当我用Python写出下面的代码时,我手工计算出了前几行代码,以便进行比较。

代码语言:javascript
复制
    byte1 = 05
    byte2 = 100
    byte3 = 00
    byte4 = 02
    byte5 = 16
    byte6 = 01
    byte7 = 00
    byte8 = 00
    
    mask = 51674
    
    hexarray = [byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8]
    
    #print hexarray
    
    CRCdata = 65535
    
    for n in hexarray:
        CRCdata = CRCdata ^ (n & 255)
        print(n, CRCdata)
    
        for i in range(1,8):
            if (CRCdata & 1) == 0:
                CRCdata = CRCdata >> 1
    #           print 'if'
            else:
                CRCdata = CRCdata >> 1
                CRCdata = CRCdata ^ mask
    #           print 'else'
            print(i, CRCdata)
            
    print CRCdata

我添加了byte8,因为我做了一些研究,提到需要在CRC数组的末尾添加一个额外的0字节来进行计算。我手动转换了最终结果并进行了字节交换。我遇到的问题是,我的CRC计算,无论我是否保留byte8,都与提供的三个示例中的任何一个都不匹配。

我不太确定我在这方面做错了什么,任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-12-01 06:02:04

我能够通过将代码更新为range(0,8)并删除byte8来解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65081214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档