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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:45:48