树莓派基于PySerial实现RS422通信无响应问题排查
排查RS422通信无响应问题的步骤
针对你用树莓派+Waveshare USB转RS422+PySerial和测量设备通信,发送灯亮但收不到响应的问题,从硬件、协议、代码三个层面逐一排查:
一、RS422硬件连接核心检查
RS422是差分全双工通信,硬件连接错误是最常见的问题:
- 引脚交叉对应:Waveshare转换器的TX+(A)接设备的RX+,TX-(B)接设备的RX-;转换器的RX+(A)接设备的TX+,RX-(B)接设备的TX-,绝对不能接反(接反的话发送灯可能亮,但收不到响应)。
- 终端电阻:如果设备和转换器距离超过2米,或者总线只有这两个节点,必须在两端(设备侧和转换器侧)接入120Ω终端电阻,部分设备有内置终端电阻开关,务必打开。
- 设备供电:确认测量设备已正常供电,多数工业设备需要独立电源,RS422接口不提供供电。
二、串口参数严格匹配
代码中的串口参数必须和设备手册完全一致,差一个都不行:
- 核对设备手册的波特率、奇偶校验、停止位、数据位,比如有些设备可能用19200波特率,或者偶校验;
- 若设备要求硬件流控制(RTS/CTS),需要在Serial初始化时添加
rtscts=True; - 树莓派串口权限:执行
sudo usermod -aG dialout pi将当前用户加入dialout组,重启后避免/dev/ttyUSB0访问权限问题。
三、通信协议细节修正
工业设备的命令格式通常不是纯ASCII字符串,需严格遵循设备手册:
- 命令格式补全:多数设备要求命令加起始/结束符,比如
GETINFO\r\n或GETINFO\n,仅发送GETINFO设备可能不识别; - 响应等待时间:取消代码中
time.sleep(1)的注释,部分设备处理命令需要时间,也可将timeout设为3秒(timeout=3); - 校验位要求:部分设备需要CRC校验或和校验,纯ASCII命令不符合要求的话,设备不会响应。
四、代码优化与调试
调整代码以适配RS422通信特性:
import serial import time # 初始化串口,按需添加流控制 ser = serial.Serial( port='/dev/ttyUSB0', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=3, # rtscts=True # 若设备要求硬件流控制则取消注释 ) # 清空接收缓冲区,避免旧数据干扰 ser.flushInput() # 按设备手册要求构造命令,示例添加换行符 message = 'GETINFO\r\n' message = message.encode('ascii') ser.write(message) # 等待发送缓冲区完全发送 ser.flush() # 给设备足够的处理时间 time.sleep(1) # 循环读取所有响应数据 print("收到响应:") while ser.in_waiting > 0: response = ser.readline().decode('ascii').strip() print(response) ser.close()
五、硬件回环测试验证
先排除转换器和PySerial的问题:
- 将Waveshare转换器的TX+与RX+短接,TX-与RX-短接;
- 运行上述代码,若能收到自己发送的命令,说明转换器和PySerial工作正常,问题出在测量设备或设备侧设置;
- 若收不到,检查转换器驱动(树莓派一般自动识别CH340/PL2303芯片),或换一个USB端口试试。
内容的提问来源于stack exchange,提问作者Ondřej Hojný
相关产品推荐
相关产品推荐

