树莓派RS485/RS422串口通信:收发数据不一致问题求助
树莓派RS485/RS422收发数据不符问题解决思路
嘿,遇到这种收发数据对不上的情况,大概率是硬件接线或者串口参数没配对,咱们一步步来排查:
1. 先核对硬件接线和工作模式
你现在用的是交叉接线(A端子1接B端子2,A端子2接B端子1),这个得看你的转换器是RS485半双工还是RS422全双工模式:
- 如果是RS485半双工:这种模式下应该用直连线(A的A端接B的A端,A的B端接B的B端),交叉接线会把差分信号反相,直接导致接收端识别错数据。
- 如果是RS422全双工:交叉接线是对的,但要确认转换器的拨码开关有没有切到RS422模式——很多USB转485/422设备默认是RS485,要是没切换模式,交叉接线就会出问题。
2. 确保串口参数完全匹配
你当前的代码只设置了波特率,但串口通信有几个关键参数必须两端完全一致,哪怕一个不匹配都会乱码:
- 数据位、停止位、奇偶校验、流控制,这些参数默认值可能因设备或库版本有差异,最好显式指定。
给你调整后的代码,把参数都明确写出来:
write.py 修改版
import serial import time # 显式指定所有串口参数,避免默认值不一致 ser = serial.Serial( port='port 1', baudrate=9600, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE, parity=serial.PARITY_NONE, timeout=1 ) message = "Te".encode('ascii') while True: ser.write(message) print(f"已发送原始字节: {message}") time.sleep(1)
read.py 修改版
import serial ser = serial.Serial( port='port 2', baudrate=9600, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE, parity=serial.PARITY_NONE, timeout=1 ) while True: # 发送的是2字节,直接读对应长度更精准,避免读多余的空字节 serial_line = ser.read(2) if serial_line: print(f"收到字节: {serial_line}") try: print(f"转字符串结果: {serial_line.decode('ascii')}") except UnicodeDecodeError: print("无法解码,说明数据仍有错误")
3. 硬件排查小技巧
- 先把两个转换器接到同一台电脑上测试,用同样的代码收发,排除树莓派USB口供电或干扰的问题。
- 检查转换器是否需要额外供电,有些便宜的USB转485设备依赖USB口供电,树莓派USB口供电不足可能导致信号不稳定。
- 试试降低波特率(比如改成4800),高波特率下信号衰减或干扰更容易导致数据错误。
内容的提问来源于stack exchange,提问作者Fastas
相关产品推荐
相关产品推荐

