Linux串口操作指南:3步搞定设置,告别乱码与回显干扰 电子说
在 Linux 系统下调试串口(如 RS232/485)时,新手常面临两类典型问题:发送数据出现乱码、终端回显干扰接收结果。实际上,仅需通过系统自带的 stty 指令完成基础配置,配合双终端测试,即可快速实现稳定的串口通信。本文基于通用操作场景,总结一套“即学即用” 的串口设置与测试方案。
直接使用echo 发送数据、cat 接收数据前,串口默认配置存在三类影响通信的问题:
1.乱码问题:默认启用的onlcr 模式会将“换行符(n)” 自动转换为 “回车 + 换行(rn)”,若对接设备不兼容该格式,接收端会出现乱码;
2.回显干扰:默认echo 模式会重复显示输入字符(如发送“123” 时,终端会额外回显 “123”),导致接收端获取的数据混入冗余内容;
3.缓冲延迟:默认icanon 规范模式下,数据需等待“回车” 指令才会发送,实时性较差,测试过程中无法即时查看传输结果。
针对上述问题,核心配置指令(如stty -F /dev/ttyS0 -echo -onlcr、stty -F /dev/ttyS0 -echo -icanon)可实现精准解决。

首先通过ls 命令查看系统中已识别的串口设备(常见路径为/dev/ttyS* 或/dev/ttyUSB*,前者为硬件串口,后者为 USB 转串口设备),示例如下:
|
# 列出系统中所有 ttyS 类串口设备,确认目标串口存在
ls -l /dev/ttyS*
|
示例输出(确认/dev/ttyS0 串口存在):
|
crw-rw---- 1 root dialout 4, 64 2025-09-01 10:00 /dev/ttyS0
|
注意:若执行命令时提示“Permission denied”,后续所有操作需添加 sudo 权限,或切换至 root 用户(通过 su - 指令)。
基于/dev/ttyS0 串口,针对不同通信需求,分两类场景进行配置,覆盖多数测试场景:
适用于多数串口通信场景,通过关闭回显和换行转换,避免基础通信问题:
|
# 核心指令:配置 /dev/ttyS0,关闭回显(-echo)、关闭换行符转换(-onlcr)
stty -F /dev/ttyS0 -echo -onlcr
|
指令解析:
•stty:Linux 系统自带的串口参数配置工具;
•-F /dev/ttyS0:指定待配置的串口设备路径(-F 为“File” 缩写,用于明确操作对象);
•-echo:关闭“输入回显” 功能 —— 发送数据时,终端不再重复显示发送内容,避免干扰接收端数据读取;
•-onlcr:关闭“输出换行转回车” 功能(onlcr 全称“Output NewLine to Carriage Return”)—— 禁用后,换行符(n)将直接发送,不额外转换为 “回车 + 换行”,解决格式不兼容导致的乱码。
针对传感器数据采集、实时指令下发等对传输延迟要求较高的场景,需额外关闭icanon 规范模式,启用“原始模式”:
|
# 进阶指令:配置 /dev/ttyS0,关闭回显(-echo)、关闭规范模式(-icanon)
stty -F /dev/ttyS0 -echo -icanon
|
关键补充:
•-icanon:关闭规范模式,进入“原始模式”—— 数据无需等待 “回车” 指令,发送后立即传输,实时性显著提升,测试中可即时观察接收结果;
•若需固定波特率(如 9600、115200),可在指令末尾追加波特率参数,示例:stty -F /dev/ttyS0 -echo -icanon 9600(串口波特率需与对接设备保持一致,否则会出现乱码)。
配置完成后,通过stty 指令查看/dev/ttyS0 当前参数,确认目标配置已生效:
|
# 查看 /dev/ttyS0 的当前配置,重点确认 -echo、-onlcr、-icanon 是否存在
stty -F /dev/ttyS0
|
正确输出特征:参数列表中显示-echo(回显关闭)、-onlcr(换行转换关闭)、-icanon(规范模式关闭,若配置该参数),无echo、onlcr、icanon 原始参数。
配置完成后,打开两个终端,分别执行“接收” 和 “发送” 操作,验证 /dev/ttyS0 串口通信是否正常:
将/dev/ttyS0 设为接收端,通过cat 指令持续读取串口数据:
|
# 终端1执行:持续接收 /dev/ttyS0 串口的数据
cat /dev/ttyS0
|
提示:cat 指令会保持阻塞状态以等待数据,需终止时按Ctrl+C 即可。
在另一个终端中,向/dev/ttyS0 串口发送测试数据(如“test_data”):
|
# 终端2执行:向 /dev/ttyS0 串口发送“test_data”(-n 选项避免自动追加换行符)
echo -n "test_data" > /dev/ttyS0
|
预期结果:终端 1 会即时显示 “test_data”,无乱码、无冗余回显内容,表明串口配置正确且通信正常。
若暂无对接设备,可通过“回环测试” 验证串口自身功能是否正常:
1.用导线短接/dev/ttyS0 对应的TX 引脚(发送引脚)与RX 引脚(接收引脚)(需参考硬件手册确认引脚定义,如部分设备中/dev/ttyS0 的 TX 为 PIN10、RX 为 PIN9);
2.终端 1 执行:cat /dev/ttyS0(持续接收数据);
3.终端 2 执行:echo -n "loop_test" > /dev/ttyS0(发送测试数据);
4.若终端 1 成功接收 “loop_test”,说明 /dev/ttyS0 串口硬件功能正常。
1.问题 1:执行指令提示 “Permission denied”
◦原因:当前用户无/dev/ttyS0 串口的读写权限;
◦解决方案:通过chmod 指令临时赋予全用户读写权限,示例:
|
sudo chmod 666 /dev/ttyS0
|
1.问题 2:配置后仍出现乱码
◦原因:串口波特率、数据位、校验位与对接设备不匹配(如本地配置为 9600 波特率,对接设备为 115200 波特率);
◦解决方案:统一双方参数,以 9600 波特率为例,配置指令:
|
stty -F /dev/ttyS0 -echo -onlcr 9600
|
1.问题 3:指令无报错,但接收端无数据
◦原因 1:物理连接异常(如 TX/RX 引脚接反、未共地);
◦原因 2:SELinux 拦截(CentOS、RHEL 等系统默认启用 SELinux,可能限制串口操作);
◦解决方案:检查物理接线是否正确;临时关闭 SELinux(仅用于测试),指令:
|
sudo setenforce 0
|
1.问题 4:发送数据后,接收端延迟较长才显示
◦原因:未关闭icanon 规范模式,数据滞留在缓冲区,需等待“回车” 触发发送;
◦解决方案:添加-icanon 参数配置串口,指令:
|
stty -F /dev/ttyS0 -echo -onlcr -icanon
|
1.简洁高效:无需安装第三方工具(如 minicom),仅依赖系统自带的 stty、echo、cat 指令,新手可在 5 分钟内掌握基础操作;
2.精准避坑:通过-echo 解决回显干扰、-onlcr 解决乱码、-icanon 解决实时性问题,三个核心参数覆盖 90% 以上的串口测试场景;
3.通用性强:适用于硬件串口(/dev/ttyS*)与 USB 转串口(/dev/ttyUSB*),仅需替换串口路径即可复用操作流程。
若在串口调试过程中遇到其他问题,可通过查看系统日志(dmesg | grep ttyS0)进一步定位故障,或参考硬件手册确认串口引脚与参数配置。
全部0条评论
快来发表一下你的评论吧 !