linux minicom命令

命令简介

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                  # 自动换行模式

串口通信基础

串口参数

串口通信的关键参数:

  • 波特率 (Baud Rate): 数据传输速率,如9600、115200
  • 数据位 (Data Bits): 每个字符的位数,通常是8位
  • 停止位 (Stop Bits): 表示字符结束,通常是1或2位
  • 校验位 (Parity): 错误检测,可选None/Odd/Even
  • 流控制 (Flow Control): 硬件RTS/CTS或软件XON/XOFF
常见串口设备

Linux系统中的串口设备:

  • /dev/ttyS0 - COM1 (传统串口)
  • /dev/ttyUSB0 - USB转串口适配器
  • /dev/ttyACM0 - USB CDC ACM设备
  • /dev/ttyAMA0 - ARM串口(Raspberry Pi)
  • /dev/ttyO0 - OMAP串口
  • /dev/ttyXRUSB0 - Exar USB串口

常用选项

选项 描述
-s, --setup 进入设置菜单(不启动终端)
-o, --noinit 不初始化调制解调器
-m, --metakey 使用Meta键(如Alt)作为转义键
-M, --metakey8 同上,但Meta键发送8位字符
-l, --ansi 使用ANSI颜色代码
-L, --iso 使用ISO 8859字符集
-w, --wrap 启用自动换行模式
-z, --statline 在终端底部显示状态行
-7, --7bit 7位数据模式
-8, --8bit 8位数据模式
-c, --color=on|off 启用/禁用颜色
-a, --attrib=on|off 启用/禁用属性(粗体、下划线等)
-t, --terminal=TERM 设置终端类型(如vt102、ansi)
-S, --script=SCRIPT 运行脚本文件
-C, --capturefile=FILE 启用捕获到文件
-d, --display=DISPLAY 指定X显示
-b, --baudrate=BAUD 设置波特率(如9600、115200)
-D, --device=DEVICE 指定串行设备(如/dev/ttyUSB0)
-p, --ptty=PTTY 使用伪终端
-v, --version 显示版本信息
-h, --help 显示帮助信息

安装minicom

不同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: 另一个图形化串口终端

实际示例

示例1:基本串口连接

使用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
# 显示当前串口设置

示例2:配置和脚本

配置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

示例3:嵌入式开发和设备调试

使用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

示例4:故障排查和高级用法

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

常见问题

排查步骤:

  1. 检查设备是否存在:
    ls -la /dev/ttyUSB*
    ls -la /dev/ttyACM*
    ls -la /dev/ttyS*
  2. 检查权限:
    ls -la /dev/ttyUSB0
    # 应为 crw-rw----
    # 如果不是,修复权限
    sudo chmod 666 /dev/ttyUSB0
    # 或添加用户到dialout组
    sudo usermod -a -G dialout $USER
    # 重新登录使更改生效
  3. 检查设备是否被占用:
    sudo lsof /dev/ttyUSB0
    # 如果有进程占用,终止它
    sudo kill -9 PID
  4. 检查内核消息:
    dmesg | tail -20
    # 查看设备检测和错误信息
  5. 使用正确的设备名:
    # USB转串口适配器
    minicom -D /dev/ttyUSB0
    # Arduino等设备
    minicom -D /dev/ttyACM0
    # 传统串口
    minicom -D /dev/ttyS0
  6. 检查驱动:
    lsmod | grep usbserial
    # 如果没有加载,加载驱动
    sudo modprobe usbserial
    # 对于特定芯片
    sudo modprobe ftdi_sio
    sudo modprobe pl2303
    sudo modprobe ch341

配置管理:

  1. 保存当前配置:
    # 在minicom中按 Ctrl+A,然后按 O
    # 选择 "Save setup as dfl" 保存为默认配置
    # 或 "Save setup as.." 保存为自定义配置
    
    # 命令行保存配置
    minicom -s
    # 进入设置菜单,选择保存选项
  2. 创建多个配置:
    # 创建Arduino配置
    minicom -s -o
    # 配置后保存为 arduino
    # 文件保存为 ~/.minirc.arduino
    
    # 创建Raspberry Pi配置
    minicom -s -o
    # 配置后保存为 rpi
    # 文件保存为 ~/.minirc.rpi
    
    # 使用不同配置
    minicom arduino
    minicom rpi
  3. 备份配置:
    # 备份所有配置
    tar -czf minicom-config-backup.tar.gz ~/.minirc.* /etc/minicom/
    
    # 恢复配置
    tar -xzf minicom-config-backup.tar.gz -C ~/
  4. 手动编辑配置:
    # 编辑默认配置
    nano ~/.minirc.dfl
    
    # 示例配置
    pu port             /dev/ttyUSB0
    pu baudrate         115200
    pu bits             8
    pu parity           N
    pu stopbits         1
    pu rtscts           No
  5. 使用环境变量:
    # 设置默认串口设备
    export MINICOM='-m -c on -D /dev/ttyUSB0'
    
    # 在脚本中使用
    alias minicom="minicom $MINICOM"
  6. 自动生成配置:
    # 脚本生成配置
    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

自动化方法:

  1. 使用expect脚本:
    #!/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
  2. 使用脚本和文件重定向:
    # 通过文件发送命令
    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
  3. 使用screen自动化:
    # 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"
  4. 创建批处理脚本:
    #!/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"
  5. 使用Python脚本:
    #!/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()
  6. 定时任务:
    # 使用cron定时执行
    # 每天凌晨2点执行
    0 2 * * * /path/to/serial-backup.sh
    
    # 每5分钟检查一次
    */5 * * * * /path/to/serial-monitor.sh