You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

串口写入时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:20:33