Python中serial.to_bytes传入bytearray失败,如何匹配列表传参的运行效果
问题根因
两种写法发送的字节序列本身不同,和bytearray的用法无关:
- 你定义的
data = bytearray(b'\x01\x04\x00\x16\x00\x02\x00\xf9')末尾2个字节为0x00 0xF9 - 符合预期的写法末尾2个字节为
0x90 0x0F
这两个末尾字节是Modbus协议的CRC16校验值,你首个bytearray里手动填的校验值错误,才导致运行效果不符合预期。
实现方案
如果你需要从bytearray加载数据,自动生成正确的校验位,达到和第二种写法完全一致的效果,可参考以下实现:
import serial # 定义不含校验位的前缀数据 prefix = bytearray(b'\x01\x04\x00\x16\x00\x02') # Modbus CRC16校验计算函数 def calc_modbus_crc16(data: bytes) -> int: crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc >>= 1 crc ^= 0xA001 else: crc >>= 1 return crc # 拼接校验位生成完整发送数据 crc = calc_modbus_crc16(prefix) full_data = prefix + crc.to_bytes(2, byteorder='little') # 此时发送的内容和符合预期的写法完全一致 ser.write(serial.to_bytes(full_data))
运行后生成的full_data为b'\x01\x04\x00\x16\x00\x02\x90\x0f',和你第二种写法的发送内容完全相同。
内容的提问来源于stack exchange,提问作者Moacir Ferreira
相关产品推荐
相关产品推荐

