1.需求说明
现有硬件设备arm,上有网板,通过socket客户端发送指令与接收数据并做crc校验,指令类型"01 24 3F 4D EC"等组合的16进制数据,且指令也需要做crc校验,并附加到指令后面。
2.python如何做crc校验
def crc16(data, length):
my_data = bytearray(2)
xda = 0xFFFF
x_poly = 0xA001
for z in range(length):
xda ^= data[z]
for j in range(8):
x_bit = int(xda & 0x01)
xda >>= 1
if x_bit == 1:
xda ^= x_poly
my_data[0] = xda & 0xFF
my_data[1] = xda >> 8
return my_data
此代码是从C转换过来的,所以可以很好的与底层硬件切合。
3.如何发送指令并使用crc16函数
SendStr = '01 24'
hexValuesSplit = SendStr.split(' ')
bs = bytearray(4) #一般是1024,不过为了数据整洁,确定大小后可以直接设置大小
i = 0
for my_hex in hexValuesSplit:
if my_hex != "":
value = int(my_hex, 16)
bs[i] = value
i += 1
tempB = crc16(bs, i) # 获取校验结果
bs[i] = tempB[0]
bs[i + 1] = tempB[1]
i = i + 2 # 这个是记录数据长度,有时候需要发送
for item in bs:
print(hex(item)) # 最后两位是校验结果 0x0 0x3b
socket.send(bs) # 发送