串口写入时bytes()与bytearray()的差异及异常问题排查
问题分析与解决
你遇到的问题不是bytearray和bytes的本质差异导致的——这两个对象在你代码里的字节内容完全一致(都是0x23 0x24),pyserial的write方法对两者的处理逻辑也没有区别。真正的问题大概率出在串口初始化时机上:
核心原因
你刚打开串口就立刻发送第一个bytearray数据,此时串口硬件或连接的设备可能还没完成初始化(比如串口握手流程、设备上电后的准备时间),导致第一次发送的字节没有被设备正确接收,自然没有回复。而第二次发送bytes时,串口已经就绪,数据正常送达设备,所以得到了响应。
验证与解决方法
1. 添加初始化延迟
在打开串口后加短暂延迟,给设备和串口留足准备时间:
import time rsBus = serial.Serial('COM1', 9600, timeout = 1) time.sleep(1) # 延迟1秒,根据设备情况调整时长 commandArray = bytearray([0x23, 0x24]) commandByte = bytes([0x23, 0x24]) rsBus.write(commandArray) print(rsBus.read(1)) rsBus.write(commandByte) print(rsBus.read(1))
2. 调换发送顺序
把发送bytes和bytearray的顺序调换,如果此时两次都能得到b'A'的回复,就完全能证明是时机问题,而非bytearray的问题:
rsBus = serial.Serial('COM1', 9600, timeout = 1) commandArray = bytearray([0x23, 0x24]) commandByte = bytes([0x23, 0x24]) # 先发送bytes rsBus.write(commandByte) print(rsBus.read(1)) # 再发送bytearray rsBus.write(commandArray) print(rsBus.read(1))
3. 检查实际发送字节数
通过write方法的返回值确认是否成功发送了2个字节:
sent_bytes1 = rsBus.write(commandArray) print(f"发送bytearray的字节数:{sent_bytes1}") # 正常应返回2 print(rsBus.read(1)) sent_bytes2 = rsBus.write(commandByte) print(f"发送bytes的字节数:{sent_bytes2}") # 正常应返回2 print(rsBus.read(1))
如果第一次返回0,说明串口确实没发送成功,进一步佐证初始化时机的问题。
补充说明
你提到的bytearray和bytes的差异确实只有可变/不可变,在作为串口发送数据时,只要内容一致,两者的效果完全相同。
内容的提问来源于stack exchange,提问作者Misplaced Southerner
相关产品推荐
相关产品推荐

