1. 项目概述:将X86主机改造为串口开发终端
去年调试一块嵌入式开发板时,我遇到了一个典型困境:手头没有多余的显示器,而开发板需要通过串口输出调试信息。正当准备下单购买USB转串口模块时,突然意识到其实我的Ubuntu台式机本身就具备COM端口。这个发现促使我探索如何将闲置的X86主机改造成全功能的串口调试终端,整个过程不仅节省了硬件成本,还意外发现了许多实用技巧。
传统认知中,X86架构的PC主机与ARM开发板属于完全不同的设备类型。但事实上,通过合理的配置,普通电脑完全可以模拟开发板的串口通信环境。这种改造特别适合以下场景:
- 嵌入式开发初期需要频繁查看启动日志
- 实验室多设备调试时显示器资源紧张
- 需要长期稳定运行的自动化测试环境
- 教学演示时需要同时展示代码和硬件输出
2. 硬件准备与串口识别
2.1 确认主机串口资源
现代X86主机通常通过两种方式提供串口:
- 主板自带DB9串口(较老机型)
- 通过USB转串口芯片(如CH340、PL2303)实现
使用以下命令检查可用串口设备:
bash复制dmesg | grep tty
ls -l /dev/tty*
典型输出示例:
code复制[ 2.372288] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 3.458921] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
重要提示:如果使用USB转串口设备但未显示,可能需要安装驱动。常见芯片驱动安装命令:
- CH340:
sudo apt install build-essential linux-headers-$(uname -r)- PL2303:
sudo apt install pl2303-dkms
2.2 串口线序适配
开发板常用3线制串口(TX/RX/GND),与PC串口的连接方式如下:
| PC端(DB9) | 开发板端 | 备注 |
|---|---|---|
| 第3脚(TX) | RX | 数据发送端接接收端 |
| 第2脚(RX) | TX | 交叉连接 |
| 第5脚(GND) | GND | 必须共地 |
对于没有原生串口的现代主机,建议选用FT232RL芯片的USB转串口模块,其稳定性实测优于廉价方案。我曾用某宝15元的CH340模块连续工作2天后出现数据丢包,更换FTDI方案后问题消失。
3. Ubuntu下的串口终端配置
3.1 基础工具安装
推荐安装screen作为基础串口工具,它比minicom更轻量:
bash复制sudo apt install screen
连接串口的基本命令格式:
bash复制screen /dev/ttyUSB0 115200
退出screen会话的快捷键:Ctrl+A然后按K,最后按Y确认。
3.2 高级终端方案配置
对于需要长时间监控的场景,建议使用tmux+picocom组合:
- 安装增强工具:
bash复制sudo apt install tmux picocom
- 创建持久化会话:
bash复制tmux new -s serial
picocom -b 115200 /dev/ttyUSB0
这样即使SSH断开,会话也会保持。重新连接只需:
bash复制tmux attach -t serial
3.3 波特率自适应技巧
不同开发板可能使用非标准波特率,通过以下方法可以自动检测:
bash复制stty -F /dev/ttyUSB0 115200
cat /dev/ttyUSB0 &
echo -ne "\n" > /dev/ttyUSB0
观察输出是否乱码,逐步调整波特率值(9600、19200、38400、57600、115200、230400等)。
4. 开发板级别的功能扩展
4.1 模拟U-Boot环境
通过socat工具可以创建虚拟串口对,模拟开发板交互:
bash复制sudo apt install socat
socat -d -d pty,raw,echo=0 pty,raw,echo=0
输出示例:
code复制2023/08/15 14:30:45 socat[3128] N PTY is /dev/pts/2
2023/08/15 14:30:45 socat[3128] N PTY is /dev/pts/3
在一个终端连接pts/2,另一个连接pts/3,即可实现双向通信测试。
4.2 内核消息重定向
让开发板内核消息通过串口输出,需修改内核启动参数:
bash复制sudo nano /etc/default/grub
修改为:
code复制GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
更新配置:
bash复制sudo update-grub
4.3 自动化日志收集
使用rsyslog将串口消息存入文件:
bash复制sudo nano /etc/rsyslog.d/10-serial.conf
添加:
code复制$ModLoad imtcp
$InputTCPServerRun 514
$template RemoteLogs,"/var/log/serial/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs
5. 实战问题排查与优化
5.1 权限问题解决方案
普通用户访问串口设备常遇权限拒绝错误,永久解决方案:
bash复制sudo usermod -a -G dialout $USER
sudo nano /etc/udev/rules.d/50-myusb.rules
添加:
code复制SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP="dialout", MODE="0666"
重新加载规则:
bash复制sudo udevadm control --reload-rules
sudo udevadm trigger
5.2 数据流控制配置
高速传输时可能出现数据丢失,需启用硬件流控:
bash复制stty -F /dev/ttyUSB0 crtscts
查看当前设置:
bash复制stty -a -F /dev/ttyUSB0
确认输出中包含crtscts标志。
5.3 终端编码问题处理
遇到乱码时,可尝试调整终端编码:
bash复制screen /dev/ttyUSB0 115200,cs8,-ixon,-ixoff
参数说明:
cs8: 8位数据位-ixon: 禁用软件流控输入-ixoff: 禁用软件流控输出
6. 高级应用场景拓展
6.1 多设备并行监控
使用multitail同时监控多个串口:
bash复制sudo apt install multitail
multitail -s 2 /dev/ttyUSB0 /dev/ttyUSB1
6.2 网络化串口访问
通过socat将本地串口转为网络服务:
bash复制socat tcp-l:54321,reuseaddr,fork file:/dev/ttyUSB0,nonblock,waitlock=/var/run/ttyUSB0.lock
远程访问:
bash复制screen /dev/tcp/192.168.1.100/54321
6.3 自动化测试集成
结合expect脚本实现自动化交互:
expect复制#!/usr/bin/expect -f
spawn screen /dev/ttyUSB0 115200
expect "login:"
send "root\r"
expect "Password:"
send "password\r"
expect "#"
send "ls /tmp\r"
expect "#"
send "exit\r"
7. 性能调优与稳定性保障
长期运行中发现几个关键优化点:
- 禁用getty服务占用串口:
bash复制sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
- 调整内核串口缓冲区(针对高速率):
bash复制sudo sysctl -w kernel.printk_ratelimit=0
sudo sysctl -w kernel.printk_ratelimit_burst=1000
- 使用硬件看门狗防死锁(需主板支持):
bash复制sudo apt install watchdog
sudo nano /etc/watchdog.conf
取消注释:
code复制watchdog-device = /dev/watchdog
经过这些配置后,我的旧笔记本已经连续运行了3个月作为智能家居网关的调试终端,期间通过串口捕获了多次设备异常重启的日志,为问题定位提供了关键证据。这种改造不仅让闲置设备重获新生,还创造了一个比商业调试工具更灵活的定制化环境。
