statserial 是一个Linux命令行工具,用于显示和监控串行端口(RS-232)的实时状态信息。它可以显示串行端口的硬件引脚状态、数据统计和通信参数,是调试串行通信设备的重要工具。
在基于Debian/Ubuntu的系统上安装:
sudo apt-get update
sudo apt-get install statserial
在基于RHEL/CentOS的系统上安装:
sudo yum install statserial
# 或者
sudo dnf install statserial
从源码编译安装:
# 下载源码
wget http://www.ibiblio.org/pub/Linux/system/serial/statserial-1.1.tar.gz
# 解压
tar -xzvf statserial-1.1.tar.gz
cd statserial-1.1
# 编译安装
make
sudo make install
statserial [选项] 串行设备
| 选项 | 说明 |
|---|---|
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
-d, --device=DEVICE |
指定串行设备(如/dev/ttyS0) |
-n, --interval=SECONDS |
设置更新间隔(秒),默认2秒 |
-c, --continuous |
连续模式,不退出 |
-s, --summary |
只显示一次状态信息,然后退出 |
-r, --raw |
显示原始寄存器值 |
-x, --hex |
以十六进制显示寄存器值 |
Linux系统中的串行端口设备文件:
| 设备文件 | 说明 |
|---|---|
/dev/ttyS0 |
COM1,第一个串行端口 |
/dev/ttyS1 |
COM2,第二个串行端口 |
/dev/ttyS2 |
COM3,第三个串行端口 |
/dev/ttyS3 |
COM4,第四个串行端口 |
/dev/ttyUSB0 |
第一个USB转串口设备 |
/dev/ttyACM0 |
第一个ACM USB串行设备(如Arduino) |
/dev/ttyAMA0 |
Raspberry Pi上的GPIO串行端口 |
# 查看串行端口设备
ls -l /dev/ttyS*
# 查看USB串行设备
ls -l /dev/ttyUSB*
# 查看所有串行设备
dmesg | grep tty
# 查看串行端口配置
setserial -g /dev/ttyS*
以2秒间隔(默认)监控COM1端口:
sudo statserial /dev/ttyS0
输出示例:
Device: /dev/ttyS0
Signal Pin Pin Direction Status
Name (25) (9) (computer)
--- --- --- --------- ------
FG 1 - - -
TxD 2 3 out High
RxD 3 2 in High
RTS 4 7 out High
CTS 5 8 in High
DSR 6 6 in High
GND 7 5 - -
DCD 8 1 in High
DTR 20 4 out High
RI 22 9 in High
Counters: tx:0 rx:0 fe:0 pe:0 ov:0 brk:0
UART: 16550A, Port: 0x03f8, IRQ: 4
sudo statserial -n 1 /dev/ttyS0
sudo statserial -s /dev/ttyS0
sudo statserial /dev/ttyUSB0
sudo statserial -x /dev/ttyS0
| 字段/信号 | 引脚(DB-25) | 引脚(DB-9) | 方向 | 说明 |
|---|---|---|---|---|
| FG | 1 | - | - | Frame Ground(屏蔽地) |
| TxD | 2 | 3 | out | Transmit Data(发送数据) |
| RxD | 3 | 2 | in | Receive Data(接收数据) |
| RTS | 4 | 7 | out | Request To Send(请求发送) |
| CTS | 5 | 8 | in | Clear To Send(清除发送) |
| DSR | 6 | 6 | in | Data Set Ready(数据设备就绪) |
| GND | 7 | 5 | - | Signal Ground(信号地) |
| DCD | 8 | 1 | in | Data Carrier Detect(数据载波检测) |
| DTR | 20 | 4 | out | Data Terminal Ready(数据终端就绪) |
| RI | 22 | 9 | in | Ring Indicator(振铃指示) |
# 监控调制解调器端口
sudo statserial /dev/ttyS0
# 拨号时观察信号变化
# 当调制解调器拨号时,会看到DTR、RTS、CTS等信号的变化
# 监控串行控制台端口
sudo statserial /dev/ttyS1
# 观察系统启动时串行端口的活动
# 可看到启动消息通过TxD发送
# 连续监控端口状态
sudo statserial -c -n 0.5 /dev/ttyS0
# 在另一个终端发送数据
echo "Test" > /dev/ttyS0
# 观察tx计数器增加
| 命令 | 说明 |
|---|---|
setserial |
配置串行端口参数 |
stty |
设置终端参数,包括串行端口 |
screen |
串行终端模拟器 |
minicom |
串行通信程序 |
cu |
呼叫另一个Unix系统(串行) |
socat |
多用途中继工具,支持串行 | tr>
picocom |
简单的串行终端程序 |
stat serial: cannot open /dev/ttyS0: Permission denied
解决方案:
# 使用sudo
sudo statserial /dev/ttyS0
# 或添加用户到dialout组
sudo usermod -aG dialout $USER
# 注销重新登录后生效
stat serial: cannot open /dev/ttyS0: No such file or directory
解决方案:
# 检查可用串行设备
ls /dev/ttyS*
ls /dev/ttyUSB*
# 加载串行端口模块
sudo modprobe 8250
sudo modprobe serial8250
# 检查内核消息
dmesg | grep tty
stat serial: cannot open /dev/ttyS0: Device or resource busy
解决方案:
# 检查哪些进程在使用该设备
sudo lsof /dev/ttyS0
# 停止使用该设备的进程
# 或使用未使用的串行端口
虽然statserial对于传统串行设备调试很有用,但现代系统有更多工具:
自动化监控串行端口状态的脚本:
#!/bin/bash
# serial_monitor.sh - 监控串行端口状态
DEVICE="${1:-/dev/ttyS0}"
INTERVAL="${2:-2}"
echo "Monitoring serial port: $DEVICE"
echo "Press Ctrl+C to exit"
echo ""
while true; do
clear
echo "=== Serial Port Status: $(date) ==="
echo "Device: $DEVICE"
echo ""
# 使用setserial获取基本信息
setserial -a $DEVICE 2>/dev/null || echo "Cannot query device info"
echo ""
echo "--- Real-time Status ---"
# 使用stat serial获取实时状态
sudo statserial -s $DEVICE 2>/dev/null || {
echo "Error: Cannot access $DEVICE"
echo "Make sure you have proper permissions"
}
sleep $INTERVAL
done
运行脚本:
chmod +x serial_monitor.sh
./serial_monitor.sh /dev/ttyS0 5