minicom 是一个基于文本的串行通信终端程序,类似于Windows的HyperTerminal。它支持串行端口通信,用于连接调制解调器、路由器、交换机、嵌入式设备、Arduino等串行设备。minicom提供了文件传输、脚本自动化、终端仿真等功能,是Linux系统中最常用的串口调试工具之一。
minicom 是嵌入式开发、网络设备管理、工业控制系统和串行设备调试的重要工具,尤其在Linux服务器和无头系统中非常有用。
# 基本格式
minicom [选项] [配置文件]
# 常用格式
minicom # 启动minicom
minicom -s # 进入设置菜单
minicom -o # 不初始化调制解调器
minicom -D /dev/ttyS0 # 指定串行设备
minicom -C capture.log # 开启日志记录
minicom -w # 自动换行模式
串口通信的关键参数:
Linux系统中的串口设备:
/dev/ttyS0 - COM1 (传统串口)/dev/ttyUSB0 - USB转串口适配器/dev/ttyACM0 - USB CDC ACM设备/dev/ttyAMA0 - ARM串口(Raspberry Pi)/dev/ttyO0 - OMAP串口/dev/ttyXRUSB0 - Exar USB串口不同Linux发行版的安装方法:
# 1. 检查是否已安装
which minicom
minicom --version
# 输出示例:minicom version 2.7.1
# 2. Debian/Ubuntu
sudo apt-get update
sudo apt-get install minicom
# 安装开发版本
sudo apt-get install minicom-dev
# 3. RHEL/CentOS/Fedora
# RHEL/CentOS 7
sudo yum install minicom
# RHEL/CentOS 8 / Fedora
sudo dnf install minicom
# 4. Arch Linux
sudo pacman -S minicom
# 5. openSUSE
sudo zypper install minicom
# 6. 从源码编译
wget https://alioth.debian.org/frs/download.php/file/3975/minicom-2.7.1.tar.gz
tar -xzf minicom-2.7.1.tar.gz
cd minicom-2.7.1
./configure
make
sudo make install
# 7. 添加用户到dialout组(串口访问权限)
sudo usermod -a -G dialout $USER
# 或
sudo usermod -a -G tty $USER
# 重新登录使更改生效
# 8. 验证安装
minicom --help
# 测试基本功能
minicom -s
# 应该看到设置菜单
# 9. 配置文件位置
# 全局配置: /etc/minicom/minirc.dfl
# 用户配置: ~/.minirc.dfl
# 脚本目录: /usr/share/minicom/
# 帮助文件: /usr/share/minicom/help/
# 10. 相关工具
# 安装串口工具套件
sudo apt-get install screen picocom putty cutecom gtkterm
# screen: 终端多路复用器,也支持串口
# picocom: 轻量级串口终端
# putty: SSH/Telnet/串口客户端
# cutecom: 图形化串口终端
# gtkterm: 另一个图形化串口终端
使用minicom进行基本的串口通信:
# 1. 启动minicom(默认配置)
minicom
# 或
minicom -w
# -w 启用自动换行
# 2. 指定串口设备
minicom -D /dev/ttyUSB0
# 或
minicom -D /dev/ttyS0
# 3. 指定波特率
minicom -D /dev/ttyUSB0 -b 115200
# 常见波特率:9600, 19200, 38400, 57600, 115200
# 4. 不初始化调制解调器
minicom -D /dev/ttyUSB0 -o
# -o 选项跳过调制解调器初始化字符串
# 5. 进入设置菜单
minicom -s
# 会显示设置菜单:
# +-----[configuration]------+
# | Filenames and paths |
# | File transfer protocols |
# | Serial port setup |
# | Modem and dialing |
# | Screen and keyboard |
# | Save setup as dfl |
# | Save setup as.. |
# | Exit |
# | Exit from Minicom |
# +--------------------------+
# 6. 查看串口设备
ls -la /dev/tty*
# 常见串口设备:
# /dev/ttyS0 # 传统串口COM1
# /dev/ttyUSB0 # USB转串口
# /dev/ttyACM0 # USB CDC ACM设备
# /dev/ttyAMA0 # Raspberry Pi串口
# 7. 检查串口权限
ls -la /dev/ttyUSB0
# 输出:crw-rw---- 1 root dialout 188, 0 Jan 1 00:00 /dev/ttyUSB0
# 如果用户不在dialout组,需要添加
sudo usermod -a -G dialout $USER
# 8. 查看可用串口
dmesg | grep tty
# 或
setserial -g /dev/ttyS*
# 或
sudo cat /proc/tty/driver/serial
# 9. 测试串口回环
# 短接串口的TX和RX引脚
# 启动minicom
minicom -D /dev/ttyS0 -b 115200
# 输入字符应该能回显
# 10. 退出minicom
# 在minicom中按 Ctrl+A,然后按 X
# 或按 Ctrl+A,然后按 Q
# 选择是否重置调制解调器
# 11. 查看minicom状态
# 在minicom中按 Ctrl+A,然后按 D
# 显示连接状态
# 12. 帮助信息
# 在minicom中按 Ctrl+A,然后按 Z
# 显示帮助菜单
# 13. 捕获输出到文件
minicom -D /dev/ttyUSB0 -C capture.log
# 所有输出会保存到capture.log
# 停止捕获:Ctrl+A,然后按 L
# 14. 发送文件
# 在minicom中按 Ctrl+A,然后按 S
# 选择发送协议(如ZMODEM, YMODEM, XMODEM)
# 选择要发送的文件
# 15. 接收文件
# 在minicom中按 Ctrl+A,然后按 R
# 选择接收协议
# 指定保存的文件名
# 16. 切换终端行数
# 在minicom中按 Ctrl+A,然后按 F
# 切换24/48行显示模式
# 17. 清屏
# 在minicom中按 Ctrl+A,然后按 C
# 18. 切换行本地回显
# 在minicom中按 Ctrl+A,然后按 E
# 19. 切换换行模式
# 在minicom中按 Ctrl+A,然后按 W
# 20. 查看端口状态
# 在minicom中按 Ctrl+A,然后按 P
# 显示当前串口设置
配置minicom和使用脚本自动化:
#!/bin/bash
# minicom配置和脚本示例
# 1. 创建自定义配置文件
cat > ~/.minirc.myconfig << 'EOF'
# Minicom配置文件
# 保存为 ~/.minirc.myconfig
pu port /dev/ttyUSB0
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho Yes
pu addlinefeed Yes
pu rts No
pu dtr No
pu updir ~/Downloads
pu downdir ~/Downloads
pu scriptdir ~/.minicom
pu scriptlog ~/.minicom/script.log
pu scriptlogname .minicom.script.log
pu scripttimeout 10
pu minit
pu mreset
pu pinterval 0
pu term vt102
pu colors on
pu wrap on
EOF
# 2. 使用自定义配置启动
minicom myconfig
# 或指定配置文件
minicom -C capture.log -D /dev/ttyUSB0 -c on -w myconfig
# 3. 创建启动脚本
cat > /usr/local/bin/minicom-arduino << 'EOF'
#!/bin/bash
# Arduino串口连接脚本
minicom -D /dev/ttyACM0 -b 9600 -w -c on "$@"
EOF
sudo chmod +x /usr/local/bin/minicom-arduino
# 4. 创建Raspberry Pi串口脚本
cat > /usr/local/bin/minicom-rpi << 'EOF'
#!/bin/bash
# Raspberry Pi串口连接脚本
minicom -D /dev/ttyAMA0 -b 115200 -w "$@"
EOF
sudo chmod +x /usr/local/bin/minicom-rpi
# 5. 自动连接脚本
cat > /tmp/auto-connect.sh << 'EOF'
#!/bin/bash
# 自动检测并连接串口设备
DEVICES=("/dev/ttyUSB0" "/dev/ttyUSB1" "/dev/ttyACM0" "/dev/ttyS0")
BAUD_RATE=115200
for device in "${DEVICES[@]}"; do
if [ -c "$device" ]; then
echo "找到串口设备: $device"
echo "尝试连接,波特率: $BAUD_RATE"
minicom -D "$device" -b "$BAUD_RATE" -w
exit 0
fi
done
echo "未找到可用的串口设备"
exit 1
EOF
# 6. 使用expect自动化交互
cat > /tmp/minicom-expect.exp << 'EOF'
#!/usr/bin/expect
# 使用expect自动化minicom交互
spawn minicom -D /dev/ttyUSB0 -b 115200
expect "Welcome to minicom"
send "\r"
expect "login:"
send "root\r"
expect "Password:"
send "password\r"
expect "#"
send "ls -la\r"
expect "#"
send "exit\r"
expect eof
EOF
expect /tmp/minicom-expect.exp
# 7. 创建minicom宏
cat > ~/.minicom/macros << 'EOF'
# 宏定义文件
# 格式: 键序列=命令
# 示例:
Ctrl-A S=ls -la\r
Ctrl-A D=date\r
Ctrl-A R=reboot\r
Ctrl-A I=ifconfig\r
EOF
# 8. 批量配置多个设备
for i in {0..3}; do
cat > ~/.minirc.ttyUSB$i << EOF
pu port /dev/ttyUSB$i
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
EOF
done
# 9. 创建测试脚本
cat > /tmp/test-serial.sh << 'EOF'
#!/bin/bash
# 串口测试脚本
DEVICE=${1:-/dev/ttyUSB0}
BAUD=${2:-115200}
TEST_STRING="Hello Serial World!"
echo "测试串口: $DEVICE @ $BAUD bps"
echo "发送测试字符串: $TEST_STRING"
# 配置串口
stty -F $DEVICE $BAUD cs8 -cstopb -parenb
# 发送测试数据
echo "$TEST_STRING" > $DEVICE
# 接收回显(如果有回环)
timeout 2 cat $DEVICE | while read -r line; do
echo "收到: $line"
done
EOF
chmod +x /tmp/test-serial.sh
# 10. 自动波特率检测脚本
cat > /tmp/auto-baud.sh << 'EOF'
#!/bin/bash
# 自动检测波特率
DEVICE=$1
BAUD_RATES="9600 19200 38400 57600 115200 230400 460800 921600"
if [ -z "$DEVICE" ]; then
echo "用法: $0 /dev/ttyUSB0"
exit 1
fi
echo "尝试检测 $DEVICE 的波特率..."
echo "按Ctrl+C停止"
for baud in $BAUD_RATES; do
echo -n "测试 $baud bps: "
timeout 1 stty -F $DEVICE $baud cs8 -cstopb -parenb
timeout 1 cat $DEVICE 2>/dev/null | head -c 100 | strings
echo
done
EOF
# 11. 创建minicom会话管理器
cat > /usr/local/bin/minicom-manager << 'EOF'
#!/bin/bash
# minicom会话管理器
case "$1" in
start)
echo "启动minicom会话..."
screen -dmS minicom-session minicom -D /dev/ttyUSB0 -b 115200
;;
stop)
echo "停止minicom会话..."
screen -S minicom-session -X quit
;;
attach)
echo "附加到minicom会话..."
screen -r minicom-session
;;
list)
echo "活动会话:"
screen -ls
;;
*)
echo "用法: $0 {start|stop|attach|list}"
exit 1
;;
esac
EOF
sudo chmod +x /usr/local/bin/minicom-manager
# 12. 创建系统服务
cat > /tmp/minicom.service << 'EOF'
[Unit]
Description=Minicom Serial Console
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/minicom -D /dev/ttyS0 -b 115200 -C /var/log/minicom.log
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# 13. 配置minicom颜色方案
cat > ~/.minirc.colors << 'EOF'
# 颜色配置
pu color_scheme "white on blue"
pu color_0 "white on blue"
pu color_1 "yellow on blue"
pu color_2 "green on blue"
pu color_3 "cyan on blue"
pu color_4 "magenta on blue"
pu color_5 "red on blue"
pu color_6 "white on blue"
pu color_7 "black on blue"
EOF
# 14. 创建批量处理脚本
cat > /tmp/batch-process.sh << 'EOF'
#!/bin/bash
# 批量发送命令到串口设备
DEVICE=$1
COMMANDS_FILE=$2
if [ $# -ne 2 ]; then
echo "用法: $0 /dev/ttyUSB0 commands.txt"
exit 1
fi
while IFS= read -r cmd; do
[ -z "$cmd" ] && continue
[ "${cmd:0:1}" = "#" ] && continue
echo "发送: $cmd"
echo "$cmd" > $DEVICE
sleep 1
done < "$COMMANDS_FILE"
EOF
# 15. 监控串口活动
cat > /tmp/monitor-serial.sh << 'EOF'
#!/bin/bash
# 监控串口活动
DEVICE=$1
LOG_FILE="/var/log/serial-$(date +%Y%m%d).log"
if [ -z "$DEVICE" ]; then
echo "用法: $0 /dev/ttyUSB0"
exit 1
fi
echo "监控 $DEVICE,日志: $LOG_FILE"
echo "按Ctrl+C停止"
stty -F $DEVICE 115200 cs8 -cstopb -parenb
cat $DEVICE | tee -a "$LOG_FILE"
EOF
使用minicom进行嵌入式开发和设备调试:
#!/bin/bash
# 嵌入式开发和设备调试脚本
# 1. Arduino开发板连接
setup_arduino() {
echo "设置Arduino开发板连接..."
# 查找Arduino设备
ARDUINO_DEVICE=$(ls /dev/ttyACM* 2>/dev/null | head -1)
if [ -z "$ARDUINO_DEVICE" ]; then
ARDUINO_DEVICE=$(ls /dev/ttyUSB* 2>/dev/null | head -1)
fi
if [ -n "$ARDUINO_DEVICE" ]; then
echo "找到Arduino设备: $ARDUINO_DEVICE"
# 创建Arduino配置
cat > ~/.minirc.arduino << EOF
pu port $ARDUINO_DEVICE
pu baudrate 9600
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho Yes
pu addlinefeed Yes
pu term vt102
EOF
# 启动minicom连接Arduino
echo "启动minicom连接Arduino..."
minicom arduino
else
echo "未找到Arduino设备"
fi
}
# 2. Raspberry Pi串口控制台
setup_raspberry_pi() {
echo "设置Raspberry Pi串口控制台..."
# 启用Raspberry Pi串口
echo "确保Raspberry Pi的串口已启用:"
echo "1. 运行: sudo raspi-config"
echo "2. 选择: Interface Options → Serial Port"
echo "3. 禁用串口控制台,启用串口硬件"
# Raspberry Pi串口设备
RPI_DEVICE="/dev/ttyAMA0"
if [ -c "$RPI_DEVICE" ]; then
echo "找到Raspberry Pi串口: $RPI_DEVICE"
cat > ~/.minirc.rpi << EOF
pu port $RPI_DEVICE
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho Yes
pu addlinefeed Yes
pu term vt102
EOF
echo "启动minicom连接Raspberry Pi..."
minicom rpi
else
echo "未找到Raspberry Pi串口"
fi
}
# 3. ESP8266/ESP32开发
setup_esp() {
echo "设置ESP8266/ESP32开发环境..."
# ESP通常使用115200波特率
ESP_DEVICE=$(ls /dev/ttyUSB* 2>/dev/null | head -1)
if [ -n "$ESP_DEVICE" ]; then
echo "找到ESP设备: $ESP_DEVICE"
cat > ~/.minirc.esp << EOF
pu port $ESP_DEVICE
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho Yes
pu addlinefeed Yes
pu term vt102
EOF
echo "ESP开发常用命令:"
echo "1. 查看启动信息"
echo "2. 进入引导加载程序: 按ESP板上的BOOT/RST按钮"
echo "3. 使用esptool刷写固件"
echo ""
echo "启动minicom连接ESP..."
minicom esp
fi
}
# 4. 路由器/交换机串口控制台
setup_router_console() {
echo "设置路由器/交换机串口控制台..."
# 常见网络设备串口设置
cat > ~/.minirc.router << 'EOF'
pu port /dev/ttyUSB0
pu baudrate 9600
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho No
pu addlinefeed Yes
pu term vt100
EOF
echo "网络设备串口控制台设置:"
echo "波特率: 9600 (常见), 115200 (较新设备)"
echo "数据位: 8"
echo "停止位: 1"
echo "校验: None"
echo "流控: None"
echo ""
echo "启动minicom连接网络设备..."
minicom router
}
# 5. 工业PLC/控制器
setup_plc() {
echo "设置工业PLC/控制器连接..."
# 常见PLC设置
cat > ~/.minirc.plc << 'EOF'
pu port /dev/ttyUSB0
pu baudrate 19200
pu bits 7
pu parity Even
pu stopbits 1
pu rtscts Yes
pu localecho No
pu addlinefeed Yes
pu term vt100
EOF
echo "工业设备注意事项:"
echo "1. 可能需要7位数据位"
echo "2. 可能需要Even/Odd校验"
echo "3. 可能需要硬件流控(RTS/CTS)"
echo "4. 波特率可能不同(300, 600, 1200, 2400, 4800, 9600, 19200)"
}
# 6. 串口调试工具集
setup_debug_tools() {
echo "安装串口调试工具集..."
# 安装各种串口工具
sudo apt-get install -y \
minicom \
screen \
picocom \
cutecom \
gtkterm \
putty \
serialtools \
setserial \
socat \
tio
echo "可用工具:"
echo "1. minicom - 功能完整的串口终端"
echo "2. screen - 终端多路复用器,支持串口"
echo "3. picocom - 轻量级串口终端"
echo "4. cutecom - 图形化串口终端"
echo "5. gtkterm - 另一个图形化串口终端"
echo "6. putty - SSH/Telnet/串口客户端"
echo "7. socat - 多功能中继工具"
echo "8. tio - 简单的串口终端"
}
# 7. 自动检测和连接
auto_detect_and_connect() {
echo "自动检测和连接串口设备..."
# 查找所有串口设备
SERIAL_DEVICES=$(find /dev -name "ttyUSB*" -o -name "ttyACM*" -o -name "ttyS*" 2>/dev/null)
if [ -z "$SERIAL_DEVICES" ]; then
echo "未找到串口设备"
return 1
fi
echo "找到的串口设备:"
echo "$SERIAL_DEVICES"
echo ""
# 尝试连接每个设备
for device in $SERIAL_DEVICES; do
echo "尝试连接: $device"
# 测试常见波特率
for baud in 9600 19200 38400 57600 115200; do
echo -n " 测试 $baud bps: "
# 尝试读取数据
timeout 1 stty -F $device $baud cs8 -cstopb -parenb
OUTPUT=$(timeout 1 cat $device 2>/dev/null | head -c 100)
if [ -n "$OUTPUT" ]; then
echo "成功!检测到活动设备"
echo "启动minicom连接..."
minicom -D $device -b $baud
return 0
else
echo "无响应"
fi
done
done
echo "未找到活动串口设备"
return 1
}
# 8. 创建开发脚本
create_development_script() {
cat > /tmp/embedded-dev.sh << 'EOF'
#!/bin/bash
# 嵌入式开发辅助脚本
DEVICE=${1:-/dev/ttyUSB0}
BAUD=${2:-115200}
LOG_DIR="${HOME}/serial-logs"
LOG_FILE="${LOG_DIR}/serial-$(date +%Y%m%d-%H%M%S).log"
# 创建日志目录
mkdir -p "$LOG_DIR"
echo "嵌入式开发工具"
echo "设备: $DEVICE"
echo "波特率: $BAUD"
echo "日志: $LOG_FILE"
echo ""
# 检查设备是否存在
if [ ! -c "$DEVICE" ]; then
echo "错误: 设备 $DEVICE 不存在"
exit 1
fi
# 检查权限
if [ ! -r "$DEVICE" ]; then
echo "错误: 对 $DEVICE 没有读取权限"
echo "尝试: sudo chmod 666 $DEVICE"
echo "或添加用户到dialout组: sudo usermod -a -G dialout $USER"
exit 1
fi
# 显示菜单
while true; do
echo ""
echo "请选择操作:"
echo "1. 启动minicom终端"
echo "2. 启动picocom终端"
echo "3. 启动screen终端"
echo "4. 监控串口输出"
echo "5. 发送测试命令"
echo "6. 查看日志"
echo "7. 清除缓冲区"
echo "8. 测试连接"
echo "9. 退出"
echo ""
read -p "选择: " choice
case $choice in
1)
echo "启动minicom..."
minicom -D "$DEVICE" -b "$BAUD" -C "$LOG_FILE"
;;
2)
echo "启动picocom..."
picocom -b "$BAUD" "$DEVICE"
;;
3)
echo "启动screen..."
screen "$DEVICE" "$BAUD"
;;
4)
echo "监控串口输出..."
echo "按Ctrl+C停止"
stty -F "$DEVICE" "$BAUD" cs8 -cstopb -parenb
cat "$DEVICE" | tee -a "$LOG_FILE"
;;
5)
read -p "输入要发送的命令: " cmd
echo "发送: $cmd"
echo "$cmd" > "$DEVICE"
;;
6)
echo "最近日志:"
tail -20 "$LOG_FILE"
;;
7)
echo "清除串口缓冲区..."
stty -F "$DEVICE" "$BAUD" cs8 -cstopb -parenb
timeout 0.1 cat "$DEVICE" > /dev/null
echo "已清除"
;;
8)
echo "测试连接..."
echo "TEST" > "$DEVICE"
sleep 0.1
OUTPUT=$(timeout 0.5 cat "$DEVICE")
if [ -n "$OUTPUT" ]; then
echo "连接正常"
echo "收到: $OUTPUT"
else
echo "无响应"
fi
;;
9)
echo "退出"
exit 0
;;
*)
echo "无效选择"
;;
esac
done
EOF
chmod +x /tmp/embedded-dev.sh
echo "脚本已创建: /tmp/embedded-dev.sh"
}
# 9. 主菜单
main_menu() {
while true; do
clear
echo "=== 嵌入式开发和设备调试工具 ==="
echo ""
echo "1. Arduino开发板连接"
echo "2. Raspberry Pi串口控制台"
echo "3. ESP8266/ESP32开发"
echo "4. 路由器/交换机控制台"
echo "5. 工业PLC/控制器"
echo "6. 安装调试工具集"
echo "7. 自动检测和连接"
echo "8. 创建开发脚本"
echo "9. 串口测试"
echo "0. 退出"
echo ""
read -p "请选择: " choice
case $choice in
1) setup_arduino ;;
2) setup_raspberry_pi ;;
3) setup_esp ;;
4) setup_router_console ;;
5) setup_plc ;;
6) setup_debug_tools ;;
7) auto_detect_and_connect ;;
8) create_development_script ;;
9)
echo "串口测试工具"
/tmp/embedded-dev.sh
;;
0)
echo "退出"
exit 0
;;
*)
echo "无效选择"
;;
esac
echo ""
read -p "按回车键继续..."
done
}
# 运行主菜单
main_menu
minicom故障排查和高级功能:
#!/bin/bash
# minicom故障排查和高级用法
# 1. 权限问题排查
check_permissions() {
echo "检查串口权限..."
DEVICE=${1:-/dev/ttyUSB0}
echo "设备: $DEVICE"
ls -la "$DEVICE"
# 检查用户组
echo -e "\n用户组:"
groups $USER
# 检查设备组
DEVICE_GROUP=$(stat -c "%G" "$DEVICE" 2>/dev/null)
if [ -n "$DEVICE_GROUP" ]; then
echo "设备组: $DEVICE_GROUP"
# 检查用户是否在设备组中
if id -nG "$USER" | grep -qw "$DEVICE_GROUP"; then
echo "✓ 用户在 $DEVICE_GROUP 组中"
else
echo "✗ 用户不在 $DEVICE_GROUP 组中"
echo " 尝试: sudo usermod -a -G $DEVICE_GROUP $USER"
fi
fi
# 临时解决方案
echo -e "\n临时解决方案:"
echo "sudo chmod 666 $DEVICE"
echo "或"
echo "sudo chown $USER:$DEVICE_GROUP $DEVICE"
}
# 2. 设备检测问题
check_device() {
echo "检查串口设备..."
# 列出所有串口设备
echo "所有串口设备:"
find /dev -name "tty*" -type c 2>/dev/null | sort
echo -e "\nUSB串口设备:"
ls -la /dev/ttyUSB* 2>/dev/null || echo "无USB串口设备"
echo -e "\nACM设备:"
ls -la /dev/ttyACM* 2>/dev/null || echo "无ACM设备"
echo -e "\n传统串口:"
ls -la /dev/ttyS* 2>/dev/null || echo "无传统串口"
# 检查内核消息
echo -e "\n最近的内核消息(dmesg):"
dmesg | tail -20 | grep -i tty
}
# 3. 波特率问题
check_baudrate() {
echo "检测波特率..."
DEVICE=$1
if [ -z "$DEVICE" ]; then
echo "用法: $0 /dev/ttyUSB0"
return 1
fi
# 常见波特率列表
BAUD_RATES="300 600 1200 2400 4800 9600 19200 38400 57600 115200 230400 460800 921600"
echo "测试设备: $DEVICE"
echo "按Ctrl+C停止测试"
echo ""
for baud in $BAUD_RATES; do
echo -n "测试 $baud bps: "
# 设置串口参数
stty -F "$DEVICE" $baud cs8 -cstopb -parenb -icanon min 1 time 1 2>/dev/null
# 尝试读取数据
OUTPUT=$(timeout 1 cat "$DEVICE" 2>/dev/null | head -c 100 | strings)
if [ -n "$OUTPUT" ]; then
echo "✓ 检测到数据: $OUTPUT"
else
echo "✗ 无数据"
fi
done
}
# 4. 流控制问题
check_flow_control() {
echo "检查流控制设置..."
DEVICE=$1
if [ -z "$DEVICE" ]; then
echo "用法: $0 /dev/ttyUSB0"
return 1
fi
echo "当前流控制设置:"
stty -F "$DEVICE" -a | grep -E "crtscts|ixon|ixoff"
echo -e "\n流控制选项:"
echo "1. 无流控制: stty -F $DEVICE -crtscts -ixon -ixoff"
echo "2. 硬件流控制(RTS/CTS): stty -F $DEVICE crtscts"
echo "3. 软件流控制(XON/XOFF): stty -F $DEVICE ixon ixoff"
}
# 5. minicom配置问题
check_minicom_config() {
echo "检查minicom配置..."
echo "配置文件位置:"
echo "全局配置: /etc/minicom/minirc.dfl"
echo "用户配置: ~/.minirc.dfl"
echo "自定义配置: ~/.minirc.*"
echo -e "\n当前配置:"
if [ -f ~/.minirc.dfl ]; then
echo "~/.minirc.dfl:"
cat ~/.minirc.dfl
else
echo "无用户配置文件"
fi
echo -e "\n测试配置:"
minicom -s
}
# 6. 替代工具
alternative_tools() {
echo "minicom替代工具:"
# screen
echo -e "\n1. screen (终端多路复用器):"
echo " 连接: screen /dev/ttyUSB0 115200"
echo " 退出: Ctrl+A, 然后 K, 然后 Y"
echo " 优点: 简单, 大多数系统已安装"
echo " 缺点: 功能有限"
# picocom
echo -e "\n2. picocom (轻量级):"
echo " 连接: picocom -b 115200 /dev/ttyUSB0"
echo " 退出: Ctrl+A, 然后 Ctrl+X"
echo " 优点: 轻量, 简单"
echo " 缺点: 功能较少"
# cutecom (图形界面)
echo -e "\n3. cutecom (图形界面):"
echo " 启动: cutecom"
echo " 优点: 图形界面, 易用"
echo " 缺点: 需要X11"
# putty
echo -e "\n4. putty:"
echo " 启动: putty -serial /dev/ttyUSB0 -sercfg 115200"
echo " 优点: 跨平台, 功能完整"
echo " 缺点: 需要安装"
# tio
echo -e "\n5. tio (简单终端):"
echo " 连接: tio /dev/ttyUSB0 -b 115200"
echo " 退出: Ctrl+T, 然后 Q"
echo " 优点: 现代, 功能丰富"
echo " 缺点: 需要安装"
}
# 7. 脚本调试
script_debugging() {
echo "创建调试脚本..."
cat > /tmp/debug-serial.sh << 'EOF'
#!/bin/bash
# 串口调试脚本
DEBUG_LOG="/tmp/serial-debug.log"
exec 2>"$DEBUG_LOG"
echo "串口调试开始: $(date)" | tee -a "$DEBUG_LOG"
# 参数
DEVICE=${1:-/dev/ttyUSB0}
BAUD=${2:-115200}
echo "设备: $DEVICE" | tee -a "$DEBUG_LOG"
echo "波特率: $BAUD" | tee -a "$DEBUG_LOG"
# 检查设备
if [ ! -c "$DEVICE" ]; then
echo "错误: 设备不存在" | tee -a "$DEBUG_LOG"
exit 1
fi
# 检查权限
if [ ! -r "$DEVICE" ] || [ ! -w "$DEVICE" ]; then
echo "错误: 权限不足" | tee -a "$DEBUG_LOG"
ls -la "$DEVICE" | tee -a "$DEBUG_LOG"
exit 1
fi
# 设置串口
echo "设置串口参数..." | tee -a "$DEBUG_LOG"
stty -F "$DEVICE" "$BAUD" cs8 -cstopb -parenb -icanon min 0 time 10
stty -F "$DEVICE" -a | tee -a "$DEBUG_LOG"
# 测试通信
echo "测试通信..." | tee -a "$DEBUG_LOG"
echo "TEST" > "$DEVICE"
sleep 0.1
OUTPUT=$(timeout 0.5 cat "$DEVICE")
if [ -n "$OUTPUT" ]; then
echo "通信正常: $OUTPUT" | tee -a "$DEBUG_LOG"
else
echo "无响应" | tee -a "$DEBUG_LOG"
fi
echo "调试完成" | tee -a "$DEBUG_LOG"
echo "日志文件: $DEBUG_LOG"
EOF
chmod +x /tmp/debug-serial.sh
echo "调试脚本已创建: /tmp/debug-serial.sh"
}
# 8. 常见错误解决方案
common_errors() {
echo "常见错误和解决方案:"
echo -e "\n1. 错误: 设备忙"
echo " 原因: 另一个进程正在使用设备"
echo " 解决:"
echo " lsof $DEVICE"
echo " kill -9 "
echo " 或重启系统"
echo -e "\n2. 错误: 权限被拒绝"
echo " 原因: 用户没有权限访问设备"
echo " 解决:"
echo " sudo chmod 666 $DEVICE"
echo " 或添加用户到dialout组:"
echo " sudo usermod -a -G dialout $USER"
echo -e "\n3. 错误: 设备不存在"
echo " 原因: 设备未连接或驱动问题"
echo " 解决:"
echo " 检查连接"
echo " dmesg | tail"
echo " lsusb"
echo -e "\n4. 错误: 无响应"
echo " 原因: 错误的波特率或设置"
echo " 解决:"
echo " 尝试不同波特率"
echo " 检查流控制设置"
echo " 检查数据位/停止位/校验位"
echo -e "\n5. 错误: 乱码"
echo " 原因: 波特率不匹配"
echo " 解决:"
echo " 调整波特率"
echo " 检查数据位(7 vs 8)"
echo " 检查校验位"
}
# 9. 高级配置
advanced_configuration() {
echo "高级配置选项:"
cat > /tmp/advanced-minicom.conf << 'EOF'
# 高级minicom配置
pu port /dev/ttyUSB0
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts Yes
pu localecho Yes
pu addlinefeed Yes
pu rts No
pu dtr No
pu updir ~/Downloads
pu downdir ~/Downloads
pu scriptdir ~/.minicom
pu scriptlog ~/.minicom/script.log
pu scriptlogname .minicom.script.log
pu scripttimeout 10
pu minit
pu mreset
pu pinterval 0
pu term vt102
pu codeset UTF-8
pu history 1024
pu histfile ~/.minicom/history
pu color_scheme "white on blue"
pu color_0 "white on blue"
pu color_1 "yellow on blue"
pu color_2 "green on blue"
pu color_3 "cyan on blue"
pu color_4 "magenta on blue"
pu color_5 "red on blue"
pu color_6 "white on blue"
pu color_7 "black on blue"
pu meta Yes
pu wrap Yes
pu linewrap Yes
pu localedit No
pu timestamp Yes
pu timestampformat "%H:%M:%S"
pu execscript ~/.minicom/startup.sh
pu exit_script ~/.minicom/shutdown.sh
pu escapekey 0x01
EOF
echo "高级配置文件已创建: /tmp/advanced-minicom.conf"
echo ""
echo "高级功能:"
echo "1. 颜色方案"
echo "2. 命令历史"
echo "3. 时间戳"
echo "4. 启动/退出脚本"
echo "5. 自定义转义键"
echo "6. UTF-8编码"
}
# 10. 性能优化
performance_optimization() {
echo "性能优化建议:"
echo -e "\n1. 缓冲区设置:"
echo " 增加内核缓冲区大小:"
echo " sudo sysctl -w kernel.printk_ratelimit=0"
echo " sudo sysctl -w kernel.printk_ratelimit_burst=1000"
echo -e "\n2. USB串口优化:"
echo " 增加USB缓冲区:"
echo " echo 1000 | sudo tee /sys/module/usbserial/parameters/maxSize"
echo -e "\n3. 降低延迟:"
echo " stty -F /dev/ttyUSB0 -icanon min 0 time 0"
echo -e "\n4. 禁用控制台输出:"
echo " 避免系统消息干扰:"
echo " dmesg -n 1"
echo -e "\n5. 使用硬件流控制:"
echo " 减少数据丢失:"
echo " stty -F /dev/ttyUSB0 crtscts"
}
# 主菜单
main_menu() {
while true; do
clear
echo "=== minicom故障排查和高级用法 ==="
echo ""
echo "1. 检查权限问题"
echo "2. 检查设备检测"
echo "3. 检查波特率"
echo "4. 检查流控制"
echo "5. 检查minicom配置"
echo "6. 替代工具"
echo "7. 脚本调试"
echo "8. 常见错误解决"
echo "9. 高级配置"
echo "10. 性能优化"
echo "0. 退出"
echo ""
read -p "请选择: " choice
case $choice in
1)
read -p "设备路径(默认/dev/ttyUSB0): " device
check_permissions "${device:-/dev/ttyUSB0}"
;;
2) check_device ;;
3)
read -p "设备路径: " device
check_baudrate "$device"
;;
4)
read -p "设备路径: " device
check_flow_control "$device"
;;
5) check_minicom_config ;;
6) alternative_tools ;;
7) script_debugging ;;
8) common_errors ;;
9) advanced_configuration ;;
10) performance_optimization ;;
0)
echo "退出"
exit 0
;;
*)
echo "无效选择"
;;
esac
echo ""
read -p "按回车键继续..."
done
}
# 运行主菜单
main_menu
排查步骤:
ls -la /dev/ttyUSB*
ls -la /dev/ttyACM*
ls -la /dev/ttyS*
ls -la /dev/ttyUSB0
# 应为 crw-rw----
# 如果不是,修复权限
sudo chmod 666 /dev/ttyUSB0
# 或添加用户到dialout组
sudo usermod -a -G dialout $USER
# 重新登录使更改生效
sudo lsof /dev/ttyUSB0
# 如果有进程占用,终止它
sudo kill -9 PID
dmesg | tail -20
# 查看设备检测和错误信息
# USB转串口适配器
minicom -D /dev/ttyUSB0
# Arduino等设备
minicom -D /dev/ttyACM0
# 传统串口
minicom -D /dev/ttyS0
lsmod | grep usbserial
# 如果没有加载,加载驱动
sudo modprobe usbserial
# 对于特定芯片
sudo modprobe ftdi_sio
sudo modprobe pl2303
sudo modprobe ch341
配置管理:
# 在minicom中按 Ctrl+A,然后按 O
# 选择 "Save setup as dfl" 保存为默认配置
# 或 "Save setup as.." 保存为自定义配置
# 命令行保存配置
minicom -s
# 进入设置菜单,选择保存选项
# 创建Arduino配置
minicom -s -o
# 配置后保存为 arduino
# 文件保存为 ~/.minirc.arduino
# 创建Raspberry Pi配置
minicom -s -o
# 配置后保存为 rpi
# 文件保存为 ~/.minirc.rpi
# 使用不同配置
minicom arduino
minicom rpi
# 备份所有配置
tar -czf minicom-config-backup.tar.gz ~/.minirc.* /etc/minicom/
# 恢复配置
tar -xzf minicom-config-backup.tar.gz -C ~/
# 编辑默认配置
nano ~/.minirc.dfl
# 示例配置
pu port /dev/ttyUSB0
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
# 设置默认串口设备
export MINICOM='-m -c on -D /dev/ttyUSB0'
# 在脚本中使用
alias minicom="minicom $MINICOM"
# 脚本生成配置
cat > /tmp/create-config.sh << 'EOF'
#!/bin/bash
CONFIG_NAME=$1
DEVICE=$2
BAUD=$3
cat > ~/.minirc.$CONFIG_NAME << CONFIG
pu port $DEVICE
pu baudrate $BAUD
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu localecho Yes
CONFIG
echo "配置已创建: ~/.minirc.$CONFIG_NAME"
EOF
自动化方法:
#!/usr/bin/expect
# 自动化minicom交互
spawn minicom -D /dev/ttyUSB0 -b 115200
expect "Welcome"
send "\r"
expect "login:"
send "admin\r"
expect "Password:"
send "password\r"
expect "#"
send "show version\r"
expect "#"
send "exit\r"
expect eof
# 通过文件发送命令
echo -e "show version\r\nshow interfaces\r\nexit\r" > commands.txt
cat commands.txt | minicom -D /dev/ttyUSB0 -b 115200 -C output.log
# 或使用管道
{
echo "show version"
sleep 1
echo "show interfaces"
sleep 1
echo "exit"
} | minicom -D /dev/ttyUSB0 -b 115200
# screen支持脚本
screen -dmS serial /dev/ttyUSB0 115200
screen -S serial -X stuff "show version\r"
sleep 1
screen -S serial -X stuff "show interfaces\r"
sleep 1
screen -S serial -X stuff "exit\r"
#!/bin/bash
# 批处理脚本
DEVICE="/dev/ttyUSB0"
BAUD="115200"
TIMEOUT=2
send_command() {
echo "发送: $1"
echo -e "$1\r" > $DEVICE
sleep $TIMEOUT
# 读取响应
timeout $TIMEOUT cat $DEVICE
}
# 配置串口
stty -F $DEVICE $BAUD cs8 -cstopb -parenb
# 发送命令序列
send_command "show version"
send_command "show interfaces"
send_command "show running-config"
#!/usr/bin/env python3
# Python串口自动化
import serial
import time
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
commands = [
"show version",
"show interfaces",
"show running-config",
"exit"
]
for cmd in commands:
print(f"发送: {cmd}")
ser.write(f"{cmd}\r\n".encode())
time.sleep(1)
response = ser.read(4096).decode()
print(f"响应:\n{response}")
ser.close()
# 使用cron定时执行
# 每天凌晨2点执行
0 2 * * * /path/to/serial-backup.sh
# 每5分钟检查一次
*/5 * * * * /path/to/serial-monitor.sh