Linux 用户态操作 UART
参考连接:【6. 串口通讯-野火电子】,【Linux PL011驱动支持RS485】。
用户态 UART 操作工具
| 工具 | 层级 | 作用 |
|---|---|---|
| stty | 低层配置 | 设置串口参数(波特率等) |
| minicom | 专用应用 | 串口调试终端 |
| screen | 通用工具 | 多用途终端复用,也能连串口 |
👉 ✅ 一句话总结:
Linux 只提供"机制"(TTY + ioctl),这些工具只是不同人写的"用法封装".
如何在用户态简单测试串口功能?
步骤1:先stty配置好串口参数
Understanding Raw Mode vs. Canonical Mode (Buffered Mode)*
规范模式(缓冲模式):只有当检测到换行符(n)、回车符(r)、EOF(结束符)等 "行终止符" 时,才会把缓冲的一整行数据一次性交给cat,此时才能在终端看到打印结果。所以如果想要cat /dev/ttyUSB1获得串口收到的不带换行符数据,需要用stty命令让串口工作在 raw 模式。
原始模式:终端不做任何缓冲,不解析任何字符比如换行符,回车符(全都视为普通字节)。只要串口收到1个字节的数据,终端驱动就立刻把这个字节传给cat,cat读取后马上打印(像是实时打印)。
shell
#切换为原始模式(raw模式)(关闭行缓冲,实时传输)
stty -F /dev/ttyUSB1 raw
#更详细的raw模式命令,配置串口ttyUSB1 、115200波特率、8数据位、1停止位、无奇偶校验、关闭回显
stty -F /dev/ttyUSB1 raw speed 115200 cs8 -cstopb -parenb -echo
#切换为规范模式(需要行缓冲)
stty -F /dev/ttyUSB1 sane
#更详细的规范模式命令,配置串口 ttyUSB1 、115200波特率、8数据位、1停止位、无奇偶校验、关闭回显
stty -F /dev/ttyUSB1 sane speed 115200 cs8 -cstopb -parenb -echo
!NOTE
RS485应使用哪种模式?
答:raw模式。RS485通常用于工业通信,传输的是二进制数据包(如Modbus RTU、自定义协议等),数据中可能包含任意字节值(0x00-0xFF),包括换行符
\n(0x0A),如果使用规范模式,遇到数据中的0x0A会被误认为是行结束符,导致数据截断。
步骤2:对端接好串口测试工具
最好用正点原子XCOM串口测试工具,配置成与串口1同样的波特率,校验,停止位等。
步骤3:echo 操作串口发送
就可以在XCOM串口工具看到收到的数据了。
!IMPORTANT
为什么测试一个串口非得用Windows端测试工具?
因为
echo会默认输入换行符。在讲到通过stty工具测试UART时,参考这个野火链接(https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/40pin/uart/uart.html)告诉大家,`echo "12345" > /dev/ttyUAB0`这个命令中,echo是默认带换行符的。虽然有一些参数可以禁止echo输入换行符,但是因为串口终端模式的影响,也是不保险的。尽量使用Windows一侧的串口发送工具比如正点原子的XCOM,可以真正看到你发送了啥东西。在用 cat /dev/ttyUSB1 测试时遇到的问题:
我发现在执行 cat /dev/ttyUSB0 时(串口工作在RAW模式),如果串口收到数据,串口还会回将数据转发回去。
这并不是
cat命令在转发数据,而是 Linux 内核的终端(TTY)子系统在"帮倒忙"。即使你将串口设置为了 RAW 模式,如果终端配置中的某些标志位没有被彻底关闭,内核在接收到串口数据后,会默认触发"回显(Echo)"机制,自动把收到的数据再写回到串口的发送端。所以需要在接收端打开-echo这个stty命令参数(别整这么麻烦啦,直接用正点原子的XCOM windows工具不香吗)。