Linux statserial命令

statserial 是一个Linux命令行工具,用于显示和监控串行端口(RS-232)的实时状态信息。它可以显示串行端口的硬件引脚状态、数据统计和通信参数,是调试串行通信设备的重要工具。

注意:stat serial 通常用于调试传统串行设备(如调制解调器、串行控制台、老式终端等),在现代系统中可能不默认安装。

安装statserial

在基于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串行端口

使用示例

示例1:查看系统中可用的串行端口

# 查看串行端口设备
ls -l /dev/ttyS*

# 查看USB串行设备
ls -l /dev/ttyUSB*

# 查看所有串行设备
dmesg | grep tty

# 查看串行端口配置
setserial -g /dev/ttyS*

示例2:监控第一个串行端口状态

以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

示例3:以1秒间隔监控串行端口

sudo statserial -n 1 /dev/ttyS0

示例4:只显示一次状态信息

sudo statserial -s /dev/ttyS0

示例5:监控USB串行设备

sudo statserial /dev/ttyUSB0

示例6:以十六进制显示寄存器值

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(振铃指示)

状态指示说明

  • High:信号为高电平(通常+3V到+15V)
  • Low:信号为低电平(通常-3V到-15V)
  • -:不适用或无信号

计数器说明

  • tx:发送的字节数
  • rx:接收的字节数
  • fe:帧错误数
  • pe:奇偶校验错误数
  • ov:溢出错误数
  • brk:中断检测次数

常见应用场景

场景1:调试调制解调器连接

# 监控调制解调器端口
sudo statserial /dev/ttyS0

# 拨号时观察信号变化
# 当调制解调器拨号时,会看到DTR、RTS、CTS等信号的变化

场景2:串行控制台调试

# 监控串行控制台端口
sudo statserial /dev/ttyS1

# 观察系统启动时串行端口的活动
# 可看到启动消息通过TxD发送

场景3:诊断串行通信问题

# 连续监控端口状态
sudo statserial -c -n 0.5 /dev/ttyS0

# 在另一个终端发送数据
echo "Test" > /dev/ttyS0

# 观察tx计数器增加

相关命令

tr>
命令 说明
setserial 配置串行端口参数
stty 设置终端参数,包括串行端口
screen 串行终端模拟器
minicom 串行通信程序
cu 呼叫另一个Unix系统(串行)
socat 多用途中继工具,支持串行
picocom 简单的串行终端程序

故障排除

问题1:权限不足

stat serial: cannot open /dev/ttyS0: Permission denied

解决方案:

# 使用sudo
sudo statserial /dev/ttyS0

# 或添加用户到dialout组
sudo usermod -aG dialout $USER
# 注销重新登录后生效

问题2:设备不存在

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

问题3:设备繁忙

stat serial: cannot open /dev/ttyS0: Device or resource busy

解决方案:

# 检查哪些进程在使用该设备
sudo lsof /dev/ttyS0

# 停止使用该设备的进程
# 或使用未使用的串行端口

串行端口基础知识

RS-232信号说明:
  • 控制信号:DTR、DSR、RTS、CTS、DCD、RI
  • 数据信号:TXD(发送数据)、RXD(接收数据)
  • 接地信号:GND(信号地)、FG(屏蔽地)
  • 硬件流控制:通过RTS/CTS实现
  • 软件流控制:通过XON/XOFF字符实现

现代替代方案

虽然statserial对于传统串行设备调试很有用,但现代系统有更多工具:

  • socat:功能强大的中继工具,支持详细的调试输出
  • picocom/minicom:带状态显示的串行终端程序
  • Serial Port Monitor:图形化的串行端口监控工具
  • 逻辑分析仪:硬件级的信号分析工具
  • 示波器:物理信号波形分析
  1. 修改串行端口配置可能中断现有连接
  2. 某些串行设备需要特定波特率、数据位、停止位和奇偶校验设置
  3. USB转串口适配器可能需要额外驱动
  4. 物理串行端口在逐渐被USB、以太网替代

实用示例脚本

自动化监控串行端口状态的脚本:

#!/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