端口Modbus RTU CRC从C到python#

2024-04-20 12:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将Modbus RTU的CRC计算功能从C移植到Python。在

C#

private static ushort CRC(byte[] data)
{
    ushort crc = 0xFFFF;
    for (int pos = 0; pos < data.Length; pos++)
    {
        crc ^= (UInt16)data[pos];
        for (int i = 8; i != 0; i--)
        {
           if ((crc & 0x0001) != 0)
           {
               crc >>= 1;
               crc ^= 0xA001;
           }
           else
           {
               crc >>= 1;
           }
       }
    }
    return crc;
}

我是这样运行的:

^{pr2}$

Python

def CalculateCRC(data):
    crc = 0xFFFF
    for pos in data:
        crc ^= pos
        for i in range(len(data)-1, -1, -1):
            if ((crc & 0x0001) != 0):
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
    return crc

我是这样运行的:

data = bytearray.fromhex("010300010001")
crc = CalculateCRC(data)
print("%04X"%(crc))
  • C示例的结果是:0xCAD5。在
  • Python示例的结果是:0x8682。在

根据其他应用程序的事实,我知道CRC应该是0xCAD5,正如C#示例所提供的那样。在

当我逐步调试这两个示例时,变量“crc”在以下代码行后具有不同的值:

crc ^= (UInt16)data[pos];

crc ^= pos

我错过了什么?在

/麦玉黄玉


Tags: inpos示例fordatareturnifelse
1条回答
网友
1楼 · 发布于 2024-04-20 12:44:47

内部循环使用数据数组的大小,而不是固定的8次迭代。试试这个:

def calc_crc(data):
    crc = 0xFFFF
    for pos in data:
        crc ^= pos 
        for i in range(8):
            if ((crc & 1) != 0):
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
    return crc

data = bytearray.fromhex("010300010001")
crc = calc_crc(data)
print("%04X"%(crc))

相关问题 更多 >