Python3与PySerial串口通信问题:Port 1无法向Port 0发送响应
嘿,我来帮你捋捋这个UART通信的问题!单向能通但反向发不了响应,大概率是配置或者代码细节没处理对,咱们一步步来排查解决:
第一步:先确认两边UART配置完全一致
UART通信的核心要求是两端参数绝对匹配,这是最容易踩的坑:
- 波特率:比如
9600、115200,两边必须设成同一个值,差一个都不行 - 数据位/停止位:通常是8位数据位+1位停止位,别一边设7位一边设8位
- 奇偶校验:如果没用到就都设为
None或者'N'
举个pyserial库的正确配置示例,脚本1和脚本2的初始化代码必须统一:
# 脚本1(Port0)的串口初始化 import serial ser_port0 = serial.Serial( port='/dev/ttyUSB0', # 换成你实际的端口号 baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=1 # 超时设置很重要,避免接收时无限阻塞 ) # 脚本2(Port1)的串口初始化,除了port其他参数必须和上面完全一样 ser_port1 = serial.Serial( port='/dev/ttyUSB1', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=1 )
第二步:检查脚本2的回复逻辑是否正确
很多时候是回复的代码有问题,比如漏了发送步骤、没把字符串转成字节:
- UART只能发送字节数据,不能直接发字符串,必须用
.encode()转换;如果是硬编码的固定响应,要写成字节格式(比如b'YOUR_FIXED_RESPONSE\n') - 要确保接收完消息后确实触发了发送动作,比如有没有判断
in_waiting来触发接收?
给你一个脚本2的正确接收+回复示例:
while True: # 检查有没有待接收的数据 if ser_port1.in_waiting > 0: # 读取并解析收到的消息 received = ser_port1.readline().decode('utf-8').strip() print(f"Port1 Received: {received}") # 构造回复消息,转成字节后发送 # 如果是硬编码内容,直接写b'XXX'就行 reply = f"ACK: {received}\n" ser_port1.write(reply.encode('utf-8')) print(f"Port1 Sent Reply: {reply.strip()}")
第三步:排查硬件连接(如果是物理串口)
如果用的是真实的串口设备(比如USB转TTL模块),一定要确认:
- 交叉接线:脚本1的TX接脚本2的RX,脚本1的RX接脚本2的TX!很多人把TX-TX、RX-RX接反,导致只能单向收
- 共地:两边的GND必须连在一起,否则信号会乱
- 检查串口线有没有损坏,或者接口接触不良
第四步:检查串口权限和占用问题
- Linux/macOS下,要确保运行脚本的用户有串口访问权限,比如把用户加入
dialout组:sudo usermod -aG dialout $USER,然后重启终端生效 - 确认没有其他程序占用这两个串口,比如串口助手、其他测试脚本,Linux可以用
lsof /dev/ttyUSB0查看,Windows看设备管理器里的串口状态
第五步:加调试日志定位问题
如果上面都没问题,就在两个脚本里加更详细的日志,看看到底是发送没执行还是接收没收到:
- 脚本1里加接收回复的逻辑,打印是否收到响应:
# 脚本1发送消息后尝试接收回复 send_msg = "Test from Port0\n" ser_port0.write(send_msg.encode('utf-8')) print(f"Port0 Sent: {send_msg.strip()}") # 等待并读取回复 if ser_port0.in_waiting > 0: reply = ser_port0.readline().decode('utf-8').strip() print(f"Port0 Received Reply: {reply}") else: print("Port0: No reply received")
- 脚本2里打印发送的字节数,确认
write()是否成功:
bytes_sent = ser_port1.write(reply.encode('utf-8')) print(f"Port1 Sent {bytes_sent} bytes: {reply.strip()}")
要是还是解决不了,你可以把两个脚本的完整代码贴出来,我再帮你细查!
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

