☰
ARM串口调试实战:minicom配置、日志抓取与避坑指南
2026/10/15 15:42:25 网站建设 项目流程

简介:这是一份面向嵌入式开发者的minicom串口调试工具源码包,适用于在Linux环境下对ARM架构设备进行系统移植、内核日志查看与驱动调试的工程师及学习者。资源共包含189个文件,以46个C源文件与22个头文件为核心实现,辅以17个in模板、10个am构建脚本、9个gmo与9个po多语言翻译文件,以及configure、install-sh等构建脚本和readme、changelog、faq等说明文档,压缩包约594KB,结构完整便于编译与二次开发。目前已有781人学习下载。通过该资源,读者可获取minicom的完整源码,深入理解串口通信的波特率、数据位、校验位等参数配置逻辑,掌握日志保存、转义序列、自动应答等高级特性的实现方式,并结合ARM-Linux开发场景,将其用于调试内核启动日志、应用程序输出与设备驱动,从而提升问题定位效率与嵌入式开发能力。

1. 串口调试这件事,为什么 minicom 在 ARM 板子上依然绕不开

做嵌入式 Linux 的同行大概都有过这样的场景:一块 ARM 开发板刚上电,串口终端里刷出一堆启动日志,你手里只有一根 USB 转 TTL 线和一个黑乎乎的终端窗口。图形化的串口助手在 Windows 上点几下就能用,可一旦切到 Linux 主机,尤其是给 ARM 板子做 bring-up 的时候,很多人第一反应还是minicom。它不新,界面也不花哨,但在 ARM 串口调试这个具体场景里,minicom 的稳定性和可脚本化程度,让它成了不少一线工程师的默认选择。这篇文章不打算复述手册,而是把 minicom 在 ARM 串口调试中的完整落地路径拆开:从设备节点确认、参数配置、交互操作,到自动化抓取和常见翻车点,让没碰过的人能照着跑通,让用过的人能补上边界认知。

2. 先搞清楚 minicom 和 ARM 串口之间的那层关系

2.1 minicom 到底替我们做了什么

minicom 本质上是一个面向串行端口的终端仿真程序。它不负责驱动硬件,也不直接操作 ARM 芯片的 UART 控制器,而是通过 Linux 的 TTY 子系统,打开/dev/tty*设备节点,然后在这个文件描述符上做读写。ARM 板子上的 UART 经过板载 USB 转串口芯片(常见的有 CH340、CP2102、FT232 等)或者直接引出 TTL 排针,在主机侧表现为一个字符设备。minicom 的工作就是把这个字符设备包装成一个可交互的终端,让你能发命令、看日志、传文件。

理解这一点很关键:minicom 的配置问题,十有八九不是 minicom 本身的问题,而是设备节点、权限、波特率或者流控没对上。很多人一上来就怀疑 minicom 有 bug,其实翻车点往往在更底层。

2.2 ARM 串口调试的典型链路

一条完整的调试链路通常长这样:ARM 板 UART 控制器 → 板载电平转换 → USB 转串口模块 → 主机 USB 子系统 → 主机 TTY 驱动 →/dev/ttyUSB0或/dev/ttyACM0→ minicom。任何一环出问题,minicom 里就是没输出或者乱码。

常见做法是先用dmesg确认设备有没有被识别,再用ls -l /dev/ttyUSB*看节点是否存在,最后才去配 minicom。我一般会把这个顺序固定下来,因为跳过前两步直接开 minicom,很容易在配置菜单里浪费时间。

2.3 为什么不用 screen 或 picocom

screen /dev/ttyUSB0 115200和picocom -b 115200 /dev/ttyUSB0确实更轻量,一条命令就能连。但 minicom 的优势在于:它有配置文件可以持久化参数,支持多组配置切换,内置文件传输协议(xmodem、zmodem、kermit),还能通过-C参数把输出直接落盘。对于需要反复切换不同板子、不同波特率的调试场景,minicom 的配置管理更省事。picocom 适合快速连一下,minicom 适合当成长期工具用。

3. 把 minicom 在 ARM 调试环境里跑起来的最小步骤

3.1 安装与设备节点确认

在主流发行版上安装 minicom 通常就是一条命令:

# Debian/Ubuntu 系 sudo apt update sudo apt install minicom # RHEL/CentOS/Fedora 系 sudo dnf install minicom

装完之后先别急着开,把 ARM 板子通过 USB 转串口线接到主机,然后确认设备节点:

# 查看内核有没有识别到 USB 转串口设备 dmesg | grep -i -E "ttyUSB|ttyACM|ch341|cp210|ftdi" # 列出当前串口设备节点 ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null

典型输出会看到ch341-uart converter now attached to ttyUSB0这类信息,说明设备节点是/dev/ttyUSB0。如果 dmesg 里没有任何相关行,先换线、换 USB 口,或者确认转串口模块的驱动有没有加载。这一步没确认就往下走,后面全是无用功。

3.2 权限问题:为什么普通用户打不开串口

默认情况下/dev/ttyUSB0的属主是root:dialout,权限是crw-rw----。普通用户不在dialout组里就会报Permission denied。解决办法:

# 把当前用户加入 dialout 组 sudo usermod -aG dialout $USER # 使组变更生效,需要重新登录或执行 newgrp dialout

改完之后用id确认一下dialout已经在组列表里。如果不想改用户组,也可以临时用sudo minicom,但不推荐长期这么干,因为配置文件会写到 root 的 home 目录下,后面切换用户容易乱。

3.3 用配置模式设定 ARM 板串口参数

minicom 第一次运行建议加-s进入配置模式:

sudo minicom -s

会看到一个菜单,选Serial port setup,然后按字母键逐项修改。ARM 板调试最常见的参数组合是:

配置项常见值说明
Serial Device/dev/ttyUSB0按实际节点填
Bps/Par/Bits115200 8N1多数 ARM 板默认
Hardware Flow ControlNo调试口一般不接 RTS/CTS
Software Flow ControlNo除非确认板子端开了 XON/XOFF

改完按回车返回,选Save setup as dfl存成默认配置,再选Exit退出。下次直接minicom就会用这套参数。如果手上有多种板子,可以Save setup as存成不同名字,用minicom <配置名>调用。

3.4 连接后的基本交互与退出

连上之后如果板子正在启动,你会看到 U-Boot 或内核日志滚动。按一下回车通常能唤出命令行。几个必须记住的操作:

  • Ctrl-A Z:调出帮助菜单,列出所有快捷键
  • Ctrl-A X:退出 minicom
  • Ctrl-A C:清屏
  • Ctrl-A S:发送文件(xmodem/zmodem)
  • Ctrl-A R:接收文件

退出时如果卡住没反应,先按Ctrl-A再按X,不要直接关终端窗口,否则串口可能没被正常释放,下次打开会报Device or resource busy。

4. 参数怎么调、日志怎么抓:让 minicom 真正服务于 ARM 调试

4.1 波特率不匹配时的现象与排查

波特率对不上是 ARM 串口调试里最经典的翻车场景。现象是:终端里有字符输出,但全是乱码,或者只有零星几个可读字符。原因通常是板子端 UART 初始化的波特率和 minicom 设置的不一致。ARM 板常见的调试波特率有 115200、921600、1500000 几档,有些 SoC 的 BootROM 阶段用的是 115200,进入 U-Boot 后可能被改掉。

排查方法:先确认板子手册或原理图上标注的调试串口波特率,然后在 minicom 里逐档试。如果 115200 乱码,试 921600;如果完全没输出,检查线序(TX/RX 是否交叉)和地线是否接好。我一般会在 minicom 配置里存两套,一套 115200,一套 921600,切换起来快。

4.2 用 -C 参数把 ARM 启动日志落盘

调试启动问题的时候,日志滚得太快,肉眼根本看不过来。minicom 的-C参数可以把所有串口输出直接写到文件:

# 把串口输出追加写入 boot.log minicom -D /dev/ttyUSB0 -b 115200 -C boot.log

-D指定设备节点,-b指定波特率,-C指定捕获文件。这样即使你不在终端前,板子重启后的完整日志也会被记录下来。分析卡死问题时,直接翻boot.log比在终端里回滚靠谱得多。

注意:-C是覆盖写还是追加写取决于 minicom 版本,常见行为是覆盖。如果需要保留多次启动日志,建议每次手动改文件名,或者用script命令包一层。

4.3 非交互模式抓取:适合脚本化的场景

有些场景不需要交互,只想把串口数据抓下来做分析。可以用 minicom 的非交互模式配合超时:

# 打开串口,10 秒后自动退出,输出重定向到文件 timeout 10 minicom -D /dev/ttyUSB0 -b 115200 -C capture.log

timeout是 coreutils 自带的命令,10 秒后给 minicom 发 TERM 信号。这样可以在 CI 或者自动化脚本里定时抓取 ARM 板的串口输出。如果板子有周期性日志,这种方式比手动开终端高效。

4.4 文件传输:xmodem 在 ARM 调试中的实际用法

ARM 板 bring-up 阶段经常需要往板子里传小文件,比如 U-Boot 阶段传内核镜像或者设备树。minicom 内置 xmodem 发送:

  1. 在板子端准备好接收命令,比如 U-Boot 的loadx或者 Linux 下的rx命令
  2. 在 minicom 里按Ctrl-A S
  3. 选择xmodem,然后输入文件路径
  4. 等待传输完成

xmodem 适合小文件(几 MB 以内),速度受串口波特率限制。115200 下传 1MB 大概要一分半钟。大文件建议用网络或者 USB 存储,不要跟串口较劲。

5. 避坑:minicom 在 ARM 串口调试里最容易踩的五个坑

5.1 现象:打开就报 Device or resource busy

原因:上一次 minicom 没有正常退出,进程还占着串口设备;或者有别的程序(比如另一个终端里的 screen)也在用同一个节点。

解决:先ps aux | grep minicom找到残留进程,kill掉;再用fuser /dev/ttyUSB0确认没有其他进程占用。如果还不行,拔插一下 USB 转串口线,让内核重新枚举设备。

5.2 现象:终端里能看到输出,但键盘输入板子没反应

原因:最常见的是硬件流控被打开了。minicom 默认可能开了 RTS/CTS,而调试线只接了 TX/RX/GND,没有接流控引脚,导致 minicom 认为可以发但实际被阻塞。

解决:进minicom -s的Serial port setup,把Hardware Flow Control改成No,Software Flow Control也改成No。保存后重开。

5.3 现象:中文或者特殊字符显示成方块或乱码

原因:minicom 的字符集设置和板子端输出编码不一致。ARM 板 Linux 通常用 UTF-8,但 minicom 在某些 locale 下会按 ASCII 处理。

解决:确认主机locale是 UTF-8,然后在 minicom 配置里检查Screen and keyboard相关选项。如果板子端输出的是纯 ASCII 日志,这个问题一般不影响;如果涉及中文文件名或提示,建议把 minicom 换成支持更好编码的终端组合,或者用picocom配合--imap参数。

5.4 现象:日志文件里只有一半内容,启动后半段丢了

原因:-C参数在某些 minicom 版本里是覆盖写,如果板子重启导致 minicom 重连,文件会被截断。另外,如果磁盘空间不足或者文件系统权限有问题,写入也会中断。

解决:每次抓取用独立文件名,或者用script -c "minicom ..." output.log包一层。抓之前确认目标目录可写、空间充足。

5.5 现象:Ctrl-A 快捷键没反应

原因:minicom 的转义键默认是Ctrl-A,但如果你的终端或者窗口管理器把Ctrl-A截获了(比如 tmux 的 prefix 也是Ctrl-A),minicom 就收不到。

解决:在 tmux 里先按两次Ctrl-A把前缀传给 minicom,或者改 tmux 的 prefix。也可以在 minicom 启动时用-m参数把转义键改成其他组合,具体看man minicom。

6. 进阶:把 minicom 嵌进 ARM 调试工作流的几个习惯

6.1 用配置文件管理多块板子

我一般会在~/.minirc.dfl之外,给每块常用板子存一个配置,比如~/.minirc.board_a、~/.minirc.board_b。启动时minicom board_a直接加载对应参数。配置文件本质上是纯文本,可以直接编辑:

# 查看当前默认配置内容 cat ~/.minirc.dfl

典型内容包含pu port /dev/ttyUSB0、pu baudrate 115200、pu rtscts No这几行。批量改参数比进菜单点来点去快。

6.2 配合 udev 规则固定设备节点

USB 转串口模块插不同 USB 口,节点号可能从ttyUSB0变成ttyUSB1,每次都要改配置很烦。可以写一条 udev 规则,根据模块的序列号或者端口路径创建固定软链接:

# /etc/udev/rules.d/99-arm-serial.rules # 根据 idVendor 和 idProduct 匹配,创建 /dev/arm_board 软链接 SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="arm_board"

1a86:7523是 CH340 的常见 VID/PID,实际用lsusb确认自己的模块。规则写完后sudo udevadm control --reload-rules && sudo udevadm trigger,之后 minicom 里设备填/dev/arm_board就行,换 USB 口也不影响。

6.3 用 expect 做半自动交互

有些 ARM 板启动后需要按特定按键进 U-Boot,或者输入密码。纯手动盯着太累,可以用 expect 包一层:

#!/usr/bin/expect -f # 等待 U-Boot 提示,自动发送命令 set timeout 30 spawn minicom -D /dev/ttyUSB0 -b 115200 expect "Hit any key to stop autoboot" send "\r" expect "=>" send "printenv\r" expect "=>" send "boot\r"

这个脚本只是示意,实际用的时候要注意 minicom 是交互式程序,expect 和它的配合需要调-o参数或者改用picocom做底层。更稳的做法是用socat或者直接cat /dev/ttyUSB0配合echo重定向,但那就脱离 minicom 的范畴了。我的习惯是:需要自动化的场景,minicom 只负责抓日志,交互部分用 Python 的pyserial写脚本,可控性更好。

6.4 验证 minicom 配置是否生效的快速方法

改完配置不确定对不对,可以用一个回环测试:把 USB 转串口模块的 TX 和 RX 短接,然后开 minicom,随便敲字符,如果能看到自己敲的内容回显,说明设备节点、波特率、流控都对了。这个办法在怀疑线序或者模块有问题的时候特别管用,比对着 ARM 板反复试快得多。

6.5 一个我踩过的坑:别在 minicom 里跑长时间交互

早期我图省事,直接在 minicom 里跑apt update或者编译命令,结果串口输出量一大,minicom 的缓冲区扛不住,终端卡死,板子那边还在跑。后来学乖了:minicom 只用来做启动调试和短交互,长时间任务要么走 SSH,要么把输出重定向到文件再tail -f。串口是调试通道,不是工作通道,这个边界分清楚能省很多后悔药。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询