串口为什么容易出问题
串口在物理层就把参数约定死了:波特率、数据位、停止位、校验位、流控必须两端完全一致,任一项不同就表现为乱码或完全无响应。再加上 RS-232 与 RS-485 电气特性不同、接线定义容易接反,串口故障的绝大部分原因落在物理层和参数层,而不在协议层。因此排查顺序应是先接线、再参数、最后报文。
基本信息
| 关键参数 | 波特率、数据位、停止位、校验位、流控(常见 9600 8N1) |
|---|---|
| 电气类型 | RS-232 点对点短距;RS-485 差分、多点、长距 |
| 常见症状 | 完全无数据、乱码、偶发错帧、只能单向通信 |
| 常用工具 | 串口调试助手、USB 转串口线、示波器或串口分析仪、回环插头 |
典型使用场景
- 新接线后完全收不到数据,需要区分线序问题与参数问题
- 能收到可读字符但内容有错,怀疑校验位设置或干扰
- 只能从一侧收到数据,怀疑收发线序或方向控制
- 更换 USB 转串口适配器后出现异常,怀疑驱动或电平兼容
- 现场偶发错帧,需要区分参数边界问题与电磁干扰
症状与原因对照
| 症状 | 常见原因 | 验证方式 |
|---|---|---|
| 完全无数据 | 收发线接反、从设备未上电、参数不匹配 | 用回环插头短接收发针脚自测本端口 |
| 乱码但字节数正常 | 波特率错误、数据位或校验位与对端不同 | 逐项对齐参数后重测同一报文 |
| 偶发错帧 | 校验位不一致、线缆过长或受干扰、接地电位差 | 看误码是否与干扰源动作同步出现 |
| 只能单向通信 | RS-485 方向控制时机不当或差分线反接 | 交换差分线序后复测双向 |
Linux 下验证串口
Linux 下验证串口
stty -F /dev/ttyUSB0 -a # 打印当前参数,与设备手册逐项核对
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb -crtscts # 设为 9600 8N1 且关闭流控
cat /dev/ttyUSB0 | xxd # 以十六进制查看收到的原始字节
printf 'hello\r\n' > /dev/ttyUSB0 # 发送测试字符串
ls -l /dev/serial/by-id/ # 按序列号定位端口,避免编号随插拔漂移
dmesg | tail -20 # 确认 USB 转串口驱动是否正常加载先把线缆与参数两件事排掉再看协议。用回环插头短接收发针脚自测,能一刀切区分是本机端口问题还是线缆与对端问题,比反复猜参数快得多。
/dev/ttyUSB0 这类编号会随插拔顺序变化。脚本与程序应绑定 by-id 路径,否则重启后可能打开错误端口,表现成“时好时坏”的假故障。
RS-485 半双工需要方向控制,切换时机不当会截断报文。主站轮询时应保证发送完毕后留出足够延时再转为接收,具体延时按从站响应特性与官方手册确定。