news 2026/4/18 8:01:39

minicom串口通信入门:通俗解释数据收发过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
minicom串口通信入门:通俗解释数据收发过程

minicom串口通信入门:像“对讲机”一样理解数据是怎么一来一回的

你有没有试过给一块刚焊好的开发板通电,结果屏幕黑着、啥也不输出?或者烧录固件失败,却不知道问题出在哪一步?

这时候,老工程师往往会默默掏出一根小小的 USB 转 TTL 线,插上电脑,打开一个黑乎乎的终端窗口——不是ssh,也不是ping,而是minicom。几秒后,屏幕上刷出一行行启动日志,仿佛打开了设备的“灵魂之窗”。

这背后到底发生了什么?为什么这么“原始”的工具,在今天依然不可替代?今天我们不堆术语、不讲理论课,就用最直白的方式,带你搞清楚:minicom 是怎么把字发出去、又把数据收回来的


为什么还在用“古董级”的串口?

先别急着喷它慢。USB、Wi-Fi、蓝牙是快,但它们太“聪明”了——协议复杂、依赖驱动、初始化时间长。而串口(UART)呢?简单到极致:

  • 发送方:把字节一个个“推”出去;
  • 接收方:按固定节奏“采样”电平;
  • 中间不需要握手、不需要地址、不需要加密。

就像两个人拿着对讲机喊话:“喂!我现在开始说了啊!”
然后一个字一个字地念过去。

正因为够傻、够稳,哪怕系统内核还没起来,Bootloader 阶段就能通过串口打印信息。它是嵌入式世界的“急救呼吸机”,也是调试时的“第一双眼睛”。

Linux 下的minicom,就是这个“对讲机”的专业操作台。它不像图形软件花里胡哨,但它精准、可靠、能深入到底层。


minicom 到底在做什么?从按下回车说起

我们常做的操作不过这几步:

sudo minicom -s # 进设置 minicom # 开连

可就在你敲下第一个字符的瞬间,一场跨越软硬件的接力赛已经悄然展开。

第一步:找到那个“串口文件”

在 Linux 看来,一切皆文件。你的 USB 转串模块插上去后,内核会加载驱动(比如 CH340 或 CP2102),并创建一个设备节点:

/dev/ttyUSB0

没错,这就是物理串口的“数字替身”。minicom 的第一步,就是打开这个文件,就像打开一个普通文本文件那样:

int fd = open("/dev/ttyUSB0", O_RDWR);

一旦打开成功,你就拿到了和硬件对话的“通行证”。

💡 小知识:老式主板上的 COM 口对应的是/dev/ttyS0;USB 转串则是/dev/ttyUSB*/dev/ttyACM*


第二步:约好“说话规则”——配置串口参数

想象你要和朋友用手电筒发摩尔斯电码。你们必须提前约定好:

  • 每个点/划持续多久?
  • 怎么区分字母之间、单词之间的间隔?

串口也一样。双方必须严格一致地设定以下参数,否则看到的就是乱码:

参数常见值含义说明
波特率115200每秒传输多少个信号符号(bit/s)。发送和接收端必须完全一致。树莓派、STM32 多用此值。
数据位8每帧实际传输的数据位数,通常为 8。
停止位1标记一帧结束的空闲时间长度,常用 1 或 2 位。
校验位无 (None)是否加一位做奇偶校验。现代设备基本关闭。
流控控制数据流量的方式。除非特别要求,一律关掉!

这些参数不是 minicom 自己定的,而是通过操作系统提供的termios接口告诉硬件控制器:

struct termios options; tcgetattr(fd, &options); // 获取当前设置 cfsetispeed(&options, B115200); // 输入波特率 cfsetospeed(&options, B115200); // 输出波特率 options.c_cflag = CS8 | CLOCAL | CREAD; // 8 数据位,本地模式,允许接收 options.c_cflag &= ~PARENB; // 无校验 options.c_cflag &= ~CSTOPB; // 1 停止位 // 关闭规范模式(即不等回车才读),进入原始模式 options.c_lflag &= ~(ICANON | ECHO | ISIG); // 关闭软件流控(XON/XOFF) options.c_iflag &= ~(IXON | IXOFF | IXANY); tcsetattr(fd, TCSANOW, &options); // 立即生效

这段代码,其实就是 minicom 在后台做的事。你每进一次-s设置菜单,它都在生成类似的配置结构体。


第三步:真正开始“打电话”——数据如何流动?

现在“电话线”接通了,规则也说好了。接下来就是真正的双向通话。

发送过程:你在终端敲下一个 ‘A’

当你在 minicom 窗口中输入A并回车,流程如下:

用户输入 → minicom 缓冲区 → write(fd, "A\r\n", 3) → 内核串口子系统 → 驱动程序 → UART 控制器 → 电平信号(TTL/RS232)→ 传输线 → 目标设备

具体来说:

  1. A被编码为 ASCII 字节0x41
  2. 因为是换行,还会自动加上\r\n(0x0D 0x0A);
  3. 这三个字节被写入/dev/ttyUSB0文件;
  4. 内核知道这是串口设备,于是调用底层驱动将其逐位转成高低电平;
  5. 经由 TX 引脚发出,送到目标板的 RX 引脚。

整个过程就像发电报:起始位(低电平)→ 数据位(0x41 的二进制逆序)→ 停止位(高电平)。

接收过程:目标板回应“OK”

反过来,当目标设备想回复你时,比如打印一条日志:

[Boot] System initialized...

它的 CPU 把这段字符串通过自己的 UART 外设发送出来,经过线路到达你的电脑 USB 转串模块,再被转换成字节存入缓冲区。

此时,minicom 正在一个循环里不断执行read()系统调用:

char buf[256]; int len = read(serial_fd, buf, sizeof(buf)); if (len > 0) { fwrite(buf, 1, len, stdout); // 显示在屏幕上 }

只要有新数据进来,立刻显示出来。这就是你看到“刷屏”的真相。


实战:连接一块 ARM 开发板的全过程

假设你现在手头有一块运行 U-Boot 的嵌入式板子,想进命令行修改启动参数。

1. 物理连接:别小看这三根线

找一根 USB 转 TTL 模块(CP2102、CH340 都行),注意电压匹配(一般选 3.3V):

板子引脚连接到模块
GNDGND
TXRX
RXTX

⚠️ 错误示范:TX 接 TX,等于自己跟自己说话,谁也听不见。

2. 查看设备是否识别

插入 USB 后,运行:

dmesg | tail

你应该能看到类似输出:

usb 1-2: ch341-uart converter now attached to ttyUSB0

说明设备已识别,节点为/dev/ttyUSB0

3. 配置并启动 minicom

首次使用需设置:

sudo minicom -s

进入菜单后选择Serial port setup,逐项检查:

  • Serial Device:/dev/ttyUSB0
  • Baud rate:115200
  • Data bits:8
  • Parity:N
  • Stop bits:1
  • Flow control:No

保存为默认配置(选Save setup as dfl),退出。

然后直接运行:

minicom

打开串口窗口。

4. 上电观察输出

给开发板上电,你会立刻看到一大串日志涌出:

U-Boot 2023.01 (Jan 15 2023 - 10:20:00 +0800) DRAM: 512 MiB MMC: sdhci@12340000: 0 Hit any key to stop autoboot: 3

赶紧按任意键中断自动启动,你就进入了 U-Boot 命令行!

可以输入:

printenv # 查看所有环境变量 setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2' saveenv # 保存配置 boot # 手动启动系统

这一切交互,都是通过 minicom 完成的。


常见“坑点”与应对秘籍

新手最容易栽在这几个地方:

现象原因分析解决方法
屏幕全是乱码或方块波特率不对!常见有 9600、115200、460800换几个常见波特率试试,尤其是 115200 和 9600
完全没输出接线错误 or 板子没上电检查 GND 是否共地,TX/RX 是否交叉连接
能收不能发权限不足使用sudo,或将用户加入dialout组:
sudo usermod -aG dialout $USER
输入无响应流控未关闭在 minicom 设置中确保 Hardware Flow Control 为 No
数据断断续续波特率过高 or 干扰大换更低波特率测试(如降为 57600),检查线缆质量

📌黄金法则

先保证物理连接正确 → 再确认波特率匹配 → 最后检查权限和流控。

只要这三点没问题,99% 的通信故障都能解决。


除了 minicom,还有哪些选择?

虽然 minicom 是经典,但也不是唯一选项:

工具特点适用场景
screen /dev/ttyUSB0 115200极简命令,无需配置快速查看输出,临时调试
picocom轻量级,支持颜色高亮替代 minicom,更干净界面
cutecom/gtkterm图形化操作不习惯命令行的新手
pyserial(Python)可编程控制自动化测试、批量烧录脚本
ser2net把串口映射成 TCP 服务远程共享串口,多人协作调试

但对于深入理解底层机制的人来说,minicom + termios + 手动 read/write的组合,依然是最透明、最可控的选择。


结语:掌握 minicom,不只是学会一个工具

当你熟练使用 minicom 的时候,你其实已经掌握了:

  • 如何与裸机设备建立第一条通信链路;
  • 如何解读异步串行通信的帧结构;
  • 如何排查从电平到协议的全链路问题;
  • 如何在没有网络、没有 GUI 的情况下掌控系统。

这些能力,远比某个工具本身更重要。

下次当你面对一块“死机”的设备时,记得:不用重启、不用换板、不用怀疑人生。
插上线,开 minicom,看看它想告诉你什么。

有时候,最古老的工具,恰恰是最锋利的那一把刀。

如果你在使用过程中遇到其他棘手问题,欢迎留言讨论,我们一起拆解每一个“看不见”的字节。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:53:15

BMad v6实战过程全公开:32场对话揭秘人机协作怎么搞?

"如果你也想了解AI真正如何参与软件开发,这个网站或许能给你一些启发。" 最近,我完成了一个叫 AutoQA-Agent 的项目开发。和以往不同的是,这次我全程使用 BMad v6 这套 AI 驱动开发方法,让 AI Agent 像真正的团队成员一…

作者头像 李华
网站建设 2026/4/18 3:48:26

ComfyUI视频帧插值:彻底消除动画卡顿的智能解决方案

ComfyUI视频帧插值:彻底消除动画卡顿的智能解决方案 【免费下载链接】ComfyUI-Frame-Interpolation A custom node set for Video Frame Interpolation in ComfyUI. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Frame-Interpolation 在数字内容创作…

作者头像 李华
网站建设 2026/4/18 3:52:12

STM32H7上调试FDCAN通信问题的实用技巧

STM32H7上调试FDCAN通信:从踩坑到精通的实战指南最近在做一个基于STM32H743的电机控制项目,系统需要通过CAN FD与逆变器、BMS和多个传感器高速通信。理想很丰满——64字节/帧、2 Mbps数据段速率,理论上完全满足实时性需求。可现实却给了我当头…

作者头像 李华
网站建设 2026/4/18 3:46:27

Red Hat Enterprise Linux 7.0 完整获取与安装全攻略

Red Hat Enterprise Linux 7.0 完整获取与安装全攻略 【免费下载链接】RedHatEnterpriseLinux7.0镜像ISO下载指南 本仓库提供 Red Hat Enterprise Linux 7.0 镜像 ISO 文件的下载链接,方便用户快速获取并安装该操作系统。该镜像文件存储在百度网盘中,用户…

作者头像 李华