02 UART串口通信
1 UART子系统
UART是一种串行、异步、全双工、以低位先行(LSB First)为位序的通信接口。设备双方协商好波特率、数据帧长度、是否使用奇偶校验位以及停止位长度后,通过数据发送信号线TX和数据接收信号线RX实现数据发送和接收。TX和RX均是相对于设备自身而言。Linux下UART通常由内核串口驱动管理,用户态通过/dev/ttyS*、/dev/ttyAMA*、/dev/ttyUSB*等设备访问,应用程序一般使用open/read/write/ioctl或termios对UART进行配置。
UART接线图如下:

UART子系统主要由以下几个部分组成:
1. tty子系统接口
Linux UART子系统基于TTY(Teletypewriter)框架实现串口设备管理,为字符终端、控制台以及串口通信提供统一抽象接口。TTY子系统负责完成串口驱动注册、设备管理、数据缓冲及用户空间访问控制等功能。其中,/sys/class/tty目录用于展示系统中已注册的串口设备信息,包括设备名称、驱动绑定关系及运行状态等。用户可通过读取相关sysfs节点,查看UART设备属性、设备号以及驱动信息,从而实现串口设备的管理与调试。
2. UART字符设备节点
Linux内核通常会在/dev目录下创建设备节点,例如/dev/ttyS0、/dev/ttyS1、/dev/ttyAMA0等,对应不同的UART控制器或串口设备。这些字符设备节点为用户空间程序提供标准访问接口,应用程序可通过open()、read()、write()、ioctl()等系统调用与指定串口设备进行通信,从而完成数据发送、数据接收、波特率配置、校验位设置以及流控管理等操作。例如,用户可通过串口终端工具(如minicom、picocom)或自定义应用程序访问UART设备,实现调试日志输出、命令交互以及外设通信等功能。
3. 控制台与串口驱动绑定
UART子系统同时承担Linux控制台(Console)输出功能。系统启动阶段,内核可通过bootargs参数指定控制台设备,例如:
console=ttyS0,115200
表示将内核启动日志及shell输出重定向至ttyS0串口,波特率设置为115200。
UART驱动完成硬件初始化后,会将底层UART控制器注册为TTY设备,并与对应字符设备节点建立映射关系,实现用户空间与硬件串口之间的数据交互。

提示
操作UART前,必须确认对应引脚已在DTS中配置为UART功能,而非GPIO或其他复用功能。🔧[需人工确认:具体串口编号与引脚对应关系]
2 Shell 操作
2.1 查看可用串口设备
# 列出所有 tty 串口设备
ls /dev/tty*预期输出:
/dev/tty /dev/ttyAMA1 /dev/ttyS000 /dev/ttyp1
/dev/ttyAMA0 /dev/ttyAMA2 /dev/ttyp0说明
tty
这是当前终端的控制设备名,通常表示“当前控制台”
ttyAMA0 / ttyAMA1 / ttyAMA2:
这几个一般是 硬件UART串口,分别表示第0、1、2路硬件串口。这类设备通常可以拿来:调试输出、连接MCU、接串口模块、产测通信等
ttyS000:
这也是一个串口设备名,通常表示另一种 UART/串口驱动注册出来的设备。有些平台会把某个串口命名成 ttyS*,有些是 ttyAMA*,具体看驱动和平台
tttp0 / tttp1
这两个是 伪终端,不是硬件串口。一般用于:shell 会话、终端模拟器、本地伪终端连接
2.2 查看串口设备详细信息
cat /proc/tty/driver/<串口驱动名>预期输出:
serinfo:1.0 driver revision:
0: uart:PL011 rev2 mmio:0x12040000 irq:27 tx:12924 rx:454 RTS|CTS|DTR|DSR|CD|RI
1: uart:PL011 rev2 mmio:0x12041000 irq:28 tx:0 rx:0 RI
2: uart:PL011 rev2 mmio:0x12042000 irq:29 tx:0 rx:0 RIlog说明
serinfo:1.0 driver revision:ttyAMA 这个串口驱动当前版本是 1.0
0: uart:PL011 rev2 mmio:0x12040000 irq:27 tx:12924 rx:454 RTS|CTS|DTR|DSR|CD|RI 含义如下:
0:表示第 0 路串口,也就是通常对应 /dev/ttyAMA0uart:PL011 rev2说明这是 PL011 类型串口控制器,版本 rev2mmio:0x12040000这是这个串口控制器的内存映射地址irq:27这个串口使用中断号 27tx:12924已经发送了 12924 个字符/字节计数rx:454已经接收了 454 个字符/字节计数RTS|CTS|DTR|DSR|CD|RI这些是调制解调器控制/状态信号线标志,说明这个串口驱动支持这些硬件握手信号
2.3 使用 stty 查看串口参数
以ttyAMA0为例
# 查看 ttyAMA0 的当前配置
stty -F /dev/ttyAMA0预期输出:
/proc/tty/driver # stty -F /dev/ttyAMA0
speed 115200 baud; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol =
; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-brkint ixoff -imaxbel
-iextenlog说明
speed 115200 baud: 表示当前串口波特率是:115200 也就是 UART 通信速度为 115200 bps。
line = 0: 表示当前使用的是第 0 条 line discipline。
min = 1; time = 0; 这是串口读取相关参数,常用于 read() 行为。 min = 1表示:至少收到 1 个字节才返回 time = 0表示:不设置超时,read() 会一直等到满足 min 的条件,这是一种比较常见的阻塞式读取模式。
2.4 使用 stty 配置串口参数
# 设置波特率为 115200,8N1(8数据位、无校验、1停止位)
stty -F /dev/ttyAMA0 115200 cs8 -cstopb -parenb raw -echo预期输出:
# 命令成功执行无输出# 确认配置已生效
stty -F /dev/ttyAMA0
预期输出:
```text
speed 115200 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost
-isig -icanon -echo2.5 使用 cat 和 echo 收发数据
# 终端1: 接收数据(阻塞等待)
cat /dev/ttyAMA0# 终端2: 发送数据
echo "Hello UART" > /dev/ttyAMA0预期输出(终端):
Hello UART2.6 stty 常用配置命令
# 设置波特率为 9600
stty -F /dev/ttyAMA0 9600
# 设置 7 数据位 + 偶校验
stty -F /dev/ttyAMA0 cs7 parenb -parodd
# 设置 2 停止位
stty -F /dev/ttyAMA0 cstopb
# 恢复为 115200 8N1
stty -F /dev/ttyAMA0 115200 cs8 -cstopb -parenb raw -echo