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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:15:10