minicom串口通信实战案例:从零实现数据收发

从零开始玩转串口调试:minicom实战全记录

你有没有遇到过这样的场景?
手里的开发板插上电脑,串口线接好,电源灯亮了,但终端黑屏一片——什么都没输出。
或者更糟:屏幕上跳出一堆“烫烫烫烫”、“锘锘锘锘”的乱码字符,像是某种外星语言。

别急,这大概率不是硬件坏了,而是你的串口通信没对上频道

在嵌入式开发的世界里,UART(通用异步收发器)可能是最古老、也最可靠的调试通道之一。即使今天设备已经能连Wi-Fi、走5G,我们依然离不开那根小小的USB转TTL线,和一个叫minicom的命令行工具。

这篇文章不讲虚的,带你从零开始,完整走一遍 Linux 下使用 minicom 实现串口数据收发的全过程。无论你是刚接触单片机的新手,还是需要快速定位问题的老兵,都能在这里找到你要的答案。


为什么是 minicom?

市面上串口工具不少:screenpicocomcutecom……甚至有人直接用 Python 写个脚本就开干。那为啥还要折腾 minicom?

因为它够稳、够全、够灵活。

  • 它不像图形工具那样依赖桌面环境,在服务器或嵌入式板子上也能跑;
  • 它不像screen那样几乎没法配置参数,一连错波特率就得重来;
  • 它支持保存配置、日志记录、文件传输(ZMODEM),甚至还能写宏自动交互。

简单说:minicom 是为“认真做事”准备的工具

而且它有菜单界面,新手也能快速上手。等你熟悉之后,再深入底层用 termios 编程也不迟。


第一步:确认硬件连接与设备识别

硬件怎么接?

先确保物理层没错:

PC端(USB-TTL模块)目标设备(如STM32/ESP32)
GNDGND
TXDRX
RXDTX

⚠️ 注意:TX 对 RX,RX 对 TX,交叉连接!别直连!

供电方面,如果目标板自带电源,可以只接 GND/TX/RX;若需由PC供电,则将 VCC 接入 3.3V 或 5V(视设备而定)。

插上去之后,系统认出来了吗?

插入 USB 转串口模块后,执行这条命令:

dmesg | grep tty

你会看到类似输出:

[12345.67890] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0

关键信息来了:ttyUSB0——这就是我们要用的设备节点。

也可以用以下命令辅助查看:

ls /dev/ttyUSB* # 输出:/dev/ttyUSB0 lsusb # 查看USB设备列表,判断芯片型号(FTDI/CH340/CP2102等)

📌 小贴士:不同芯片对应的驱动不同。常见的有:
- CH340 →ch341.ko
- CP2102 →cp210x.ko
- FTDI →ftdi_sio.ko
大多数现代发行版已内置这些模块,插上即用。

权限问题解决了吗?

默认情况下,普通用户无法访问/dev/ttyUSB0。试试这个命令:

ls -l /dev/ttyUSB0

输出如果是:

crw-rw---- 1 root dialout 188, 0 Apr 5 10:00 /dev/ttyUSB0

说明你需要加入dialout组:

sudo usermod -aG dialout $USER

📌注意:修改后必须重新登录才能生效!你可以注销再进,或者新开一个 shell 测试。

验证是否成功:

groups # 看输出中是否有 dialout

第二步:安装并配置 minicom

安装很简单

Ubuntu/Debian 用户:

sudo apt update sudo apt install minicom -y

CentOS/RHEL:

sudo yum install minicom # 或者 dnf sudo dnf install minicom

macOS(需 Homebrew):

brew install minicom

进入配置模式

第一次使用前,必须设置串口参数。运行:

sudo minicom -s

为什么要加sudo?因为要修改系统级配置文件。后续就可以不用了。

进入的是一个蓝色菜单界面,用方向键选择,回车确认。

重点设置项如下:

1. Serial port setup(串口设置)

A修改串口设备路径:

Serial Device: /dev/ttyUSB0

E设置通信参数。典型配置是 “8-N-1”,即:

  • Baud rate:115200
  • Data bits:8
  • Parity:N (None)
  • Stop bits:1

所以依次选 E → 选 115200;F → N;G → 1。

⚠️ 波特率一定要和目标设备程序中的 UART 初始化一致!否则就是乱码。

其他选项建议关闭:

  • Hardware Flow Control: No(除非外设明确支持 RTS/CTS)
  • Software Flow Control: No(XON/XOFF 很少用到)
2. Save setup as dfl

选这一项,把当前配置保存为default。以后直接输入minicom就能启动,无需重复配置。

3. Exit

退出菜单,进入实际通信界面。


第三步:真正开始通信!

现在你应该已经进入了 minicom 主界面。

试试敲几个字母,比如输入:

hello

然后回车。

如果你的目标设备固件中有串口回显功能(比如收到字符后原样返回),你应该能在屏幕上看到回应。

如果没有反应,别慌,先检查下面几点:

  1. 目标设备是否正常运行?复位一下试试。
  2. 是否开启了串口中断或DMA?基础轮询模式更容易调试。
  3. 是否有打印启动日志?重新上电,观察是否有 boot message 输出。

如何接收设备日志?

很多开发板在启动时会通过串口输出引导信息。例如:

Booting Zephyr OS build v3.5.0... CPU: ARM Cortex-M4 UART initialized at 115200bps Ready to accept commands.

只要你的 minicom 参数匹配,这些信息都会实时显示出来。

如何发送命令?

假设你的设备支持如下指令:

  • led on→ 打开LED
  • temp read→ 读取温度

那你就在 minicom 里手动输入:

led on

按下 Enter(记得换行符可能是\r\n,有些设备要求严格)。

如果一切正常,LED 应该亮起。


快捷键大全(必背)

minicom 的操作都靠组合键完成,核心是Ctrl+A开头。

快捷键功能说明
Ctrl+A Z显示帮助菜单
Ctrl+A C清屏
Ctrl+A L开启/关闭日志记录(推荐打开)
Ctrl+A S发送文件(支持 ZMODEM)
Ctrl+A R接收文件
Ctrl+A W切换行尾显示(CR/LF)
Ctrl+A X退出 minicom

📌 特别推荐开启日志记录(Ctrl+A L),所有通信内容会被保存到minicom.log文件中,方便后期分析问题。


深入一点:你知道 minicom 背后是怎么工作的吗?

虽然我们天天用 minicom,但它本身是个“黑盒”。其实它的底层机制非常清晰——基于 Linux 的termios接口控制 TTY 设备。

下面是一个精简版 C 程序,展示了如何手动打开串口、设置参数、收发数据:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int open_serial(const char *port) { int fd = open(port, O_RDWR | O_NOCTTY); if (fd == -1) { perror("无法打开串口"); return -1; } struct termios tty; memset(&tty, 0, sizeof(tty)); if (tcgetattr(fd, &tty) != 0) { perror("读取串口属性失败"); return -1; } // 设置波特率 cfsetospeed(&tty, B115200); cfsetispeed(&tty, B115200); // 数据格式:8N1 tty.c_cflag |= CLOCAL | CREAD; // 本地模式,启用接收 tty.c_cflag &= ~PARENB; // 无奇偶校验 tty.c_cflag &= ~CSTOPB; // 1位停止位 tty.c_cflag &= ~CSIZE; // 清除数据位掩码 tty.c_cflag |= CS8; // 8位数据 tty.c_cflag &= ~CRTSCTS; // 禁用硬件流控 // 原始输入模式:不处理特殊字符 tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始输出模式 tty.c_oflag &= ~OPOST; // 设置最小读取字符数和超时 tty.c_cc[VMIN] = 1; // 至少读1个字节 tty.c_cc[VTIME] = 5; // 超时0.5秒 // 应用配置 if (tcsetattr(fd, TCSANOW, &tty) != 0) { perror("设置串口参数失败"); return -1; } return fd; } int main() { int fd = open_serial("/dev/ttyUSB0"); if (fd == -1) exit(1); const char *msg = "Hello from host!\r\n"; write(fd, msg, strlen(msg)); char buf[256]; printf("等待接收数据...\n"); while (1) { int n = read(fd, buf, sizeof(buf)-1); if (n > 0) { buf[n] = '\0'; printf("收到: %s", buf); } } close(fd); return 0; }

编译运行:

gcc serial_test.c -o serial_test ./serial_test

你会发现,这其实就是 minicom 的“灵魂”所在。

掌握这段代码的意义在于:当你需要在自己的项目中集成串口通信时(比如做自动化测试平台),你就不用依赖外部工具了。


常见问题排查指南

现象可能原因解决方法
屏幕全是乱码波特率不匹配检查双方波特率是否一致(常见错误:9600 vs 115200)
完全没有输出接线错误 / 设备未供电 / UART未初始化逐项检查硬件连接,确认目标设备运行正常
输入无响应目标设备未实现回显在设备端添加 echo 逻辑,或改用命令触发反馈
数据丢失或断续波特率过高 / 缓冲区溢出降低波特率至 9600 或 38400,增加延时
日志文件为空未开启日志功能使用Ctrl+A L启用日志记录
Permission denied用户不在 dialout 组执行sudo usermod -aG dialout $USER并重新登录

📌经验之谈
如果你不确定目标设备的波特率是多少,可以从115200开始试,不行就换9600。这两个是最常用的。某些 Bootloader(如Arduino早期版本)可能使用 57600 或 74880(ESP8266常见)。


高阶玩法:让 minicom 更聪明

1. 使用命名配置,管理多个设备

当你同时调试 STM32 和 ESP32,它们波特率不一样怎么办?

答案:创建多个配置文件!

minicom -s -o -D /dev/ttyUSB0 -b 115200 --save stm32_config minicom -s -o -D /dev/ttyUSB1 -b 74880 --save esp8266_config

之后启动只需:

minicom stm32_config minicom esp8266_config

清爽又高效。

2. 自动化脚本 + expect 工具

可以用expect实现自动登录、发送命令、抓取结果:

#!/usr/bin/expect -f spawn minicom stm32_config sleep 1 send "led on\r" sleep 0.5 send "temp read\r" expect "Temperature:" sleep 1 log_file output.txt send "\x18" ;# Ctrl+X 退出 minicom

适合批量测试、CI/CD 环境下的无人值守调试。


写在最后

也许你会觉得:“都 2025 年了,还搞串口?”

可现实是:

  • 每一块新板子上电的第一刻,都是从串口 log 开始的;
  • 每一次 Bootloader 折腾失败,最后救命的还是那根 USB-TTL 线;
  • 每一场深夜调试,让你看清系统崩溃瞬间的,往往是 minicom 里那一行panic: null pointer dereference

它不炫酷,但从不缺席。

掌握 minicom 不只是为了“能连上”,更是为了建立一种思维习惯:
当一切高级手段失效时,回归最底层,从最基本的信号开始排查。

这才是工程师真正的底气。


如果你正在学习嵌入式开发,不妨现在就插上你的开发板,打开终端,敲下第一句:

minicom -s

说不定,下一秒你就看到了那句久违的:

Hello World!

欢迎在评论区分享你的第一次串口“破冰”经历 😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1121447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信AI助手终极部署指南:3分钟打造你的专属智能聊天机器人

微信AI助手终极部署指南&#xff1a;3分钟打造你的专属智能聊天机器人 【免费下载链接】wechat-bot &#x1f916;一个基于 WeChaty 结合 DeepSeek / ChatGPT / Kimi / 讯飞等Ai服务实现的微信机器人 &#xff0c;可以用来帮助你自动回复微信消息&#xff0c;或者管理微信群/好…

基于ms-swift的电商推荐与客服对话系统构建

基于 ms-swift 的电商推荐与客服对话系统构建 在电商平台日益激烈的竞争中&#xff0c;用户体验已成为决定转化率的关键。用户不再满足于简单的“搜索-点击-购买”流程&#xff0c;而是期望平台能像一位懂自己的导购员&#xff1a;既能精准推荐符合喜好的商品&#xff0c;又能以…

AYA:安卓设备桌面控制终极解决方案

AYA&#xff1a;安卓设备桌面控制终极解决方案 【免费下载链接】aya Android adb desktop app 项目地址: https://gitcode.com/gh_mirrors/aya/aya 想要在电脑上轻松管理安卓设备吗&#xff1f;AYA为您提供一站式桌面控制体验&#xff01;这款基于ADB技术的跨平台应用&a…

ms-swift框架下VPP与ETP并行策略深度解析

ms-swift框架下VPP与ETP并行策略深度解析 在大模型训练日益走向“千卡级集群、万亿参数、百万上下文”的今天&#xff0c;一个核心挑战摆在所有工程师面前&#xff1a;如何在有限的硬件资源下&#xff0c;既保证训练速度&#xff0c;又避免显存爆炸&#xff1f;传统的数据并行&…

Markdown列表终极指南:10倍提升写作效率的秘诀

Markdown列表终极指南&#xff1a;10倍提升写作效率的秘诀 【免费下载链接】markdown-guide The comprehensive Markdown reference guide. 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-guide 掌握Markdown列表技巧能让你的文档排版更专业、写作效率更高。无…

PCSX2模拟器性能优化实战手册:从卡顿到流畅的完整解决方案

PCSX2模拟器性能优化实战手册&#xff1a;从卡顿到流畅的完整解决方案 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 想要在PC上完美重温PS2经典游戏&#xff1f;PCSX2作为业界领先的PlayStation…

V2EX社区增强脚本:让技术交流更高效的5大实用功能

V2EX社区增强脚本&#xff1a;让技术交流更高效的5大实用功能 【免费下载链接】UserScript &#x1f435; 自用的一些乱七八糟 油猴脚本~ 项目地址: https://gitcode.com/gh_mirrors/us/UserScript V2EX社区增强脚本是一款专为V2EX技术社区设计的浏览器扩展工具&#x…

ms-swift框架下多模态博物馆导览系统开发

ms-swift框架下多模态博物馆导览系统开发 在一座现代化博物馆里&#xff0c;一位游客举起手机对准一幅古画&#xff0c;几秒后&#xff0c;耳边传来清晰的语音讲解&#xff1a;“这幅《千里江山图》由北宋画家王希孟创作&#xff0c;主要使用石青、石绿等矿物颜料……”紧接着&…

基于ms-swift的工业质检报告自动生成模型

基于 ms-swift 的工业质检报告自动生成模型 在高端制造车间里&#xff0c;一台电路板刚完成焊接&#xff0c;工业相机迅速捕捉其表面图像。几秒钟后&#xff0c;系统不仅标记出微米级的虚焊点&#xff0c;还自动生成了一份结构清晰、术语规范的质检报告——包含缺陷类型、位置坐…

OpenCode实战宝典:解锁终端AI编程的无限潜能

OpenCode实战宝典&#xff1a;解锁终端AI编程的无限潜能 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在当今AI技术飞速发展的时代&am…

Proteus 8.0下载安装教程:Windows平台实战案例

手把手教你安装Proteus 8.0&#xff1a;从零搭建电路仿真环境&#xff08;Windows实战指南&#xff09; 你是不是也遇到过这样的情况&#xff1f; 想做个单片机实验&#xff0c;但手头没有开发板&#xff1b;想验证一个RC滤波电路&#xff0c;又怕焊错烧元件。别急—— Prot…

OpenWrt第三方WiFi驱动编译终极指南:从零到精通

OpenWrt第三方WiFi驱动编译终极指南&#xff1a;从零到精通 【免费下载链接】OpenWrt_x86-r2s-r4s-r5s-N1 一分钟在线定制编译 X86/64, NanoPi R2S R4S R5S R6S, 斐讯 Phicomm N1 K2P, 树莓派 Raspberry Pi, 香橙派 Orange Pi, 红米AX6, 小米AX3600, 小米AX9000, 红米AX6S 小米…

使用ms-swift进行智能制造中的视觉检测模型训练

使用 ms-swift 构建智能制造视觉检测系统&#xff1a;从模型训练到工业落地 在现代智能工厂的产线上&#xff0c;每秒钟都有成百上千个零部件经过自动化检测工位。传统基于规则或经典计算机视觉算法&#xff08;如边缘检测、模板匹配&#xff09;的质检系统&#xff0c;虽然稳定…

跨设备剪贴板同步:彻底告别手动传输的终极解决方案

跨设备剪贴板同步&#xff1a;彻底告别手动传输的终极解决方案 【免费下载链接】Clipboard &#x1f60e;&#x1f3d6;️&#x1f42c; Your new, &#x1d667;&#x1d65e;&#x1d659;&#x1d664;&#x1d663;&#x1d660;&#x1d66a;&#x1d661;&#x1d65e;&a…

终极ASCII艺术生成器完整指南:如何快速创建惊艳字符艺术

终极ASCII艺术生成器完整指南&#xff1a;如何快速创建惊艳字符艺术 【免费下载链接】ascii-art A Node.js library for ansi codes, figlet fonts, ascii art and other ASCII graphics 项目地址: https://gitcode.com/gh_mirrors/as/ascii-art 在数字创意的世界里&…

基于STLink驱动的Flash编程实战示例

从零开始掌握STLink Flash烧录&#xff1a;不只是点“下载”按钮那么简单你有没有遇到过这样的场景&#xff1f;在实验室里&#xff0c;手握一块崭新的STM32开发板&#xff0c;打开STM32CubeProgrammer&#xff0c;点击“Download”&#xff0c;结果弹出一个红框&#xff1a;“…

ms-swift框架下无人机视觉导航模型开发

ms-swift框架下无人机视觉导航模型开发 在城市空中交通逐渐从科幻走向现实的今天&#xff0c;无人机如何在复杂环境中“看懂世界、听懂指令、做出决策”&#xff0c;成为智能飞行系统的核心挑战。传统导航依赖预设地图与规则引擎&#xff0c;面对动态障碍、模糊语义&#xff08…

daedalOS多语言环境配置完全指南

daedalOS多语言环境配置完全指南 【免费下载链接】daedalOS Desktop environment in the browser 项目地址: https://gitcode.com/gh_mirrors/da/daedalOS daedalOS作为一款创新的浏览器桌面环境&#xff0c;通过灵活的国际化架构&#xff0c;让全球用户都能获得原生语言…

多用户远程桌面配置完全指南:从单用户限制到企业级部署方案

多用户远程桌面配置完全指南&#xff1a;从单用户限制到企业级部署方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 当你的团队需要同时访问同一台Windows服务器时&…

终极指南:如何快速搭建VeighNa量化交易开发环境

终极指南&#xff1a;如何快速搭建VeighNa量化交易开发环境 【免费下载链接】vnpy 基于Python的开源量化交易平台开发框架 项目地址: https://gitcode.com/gh_mirrors/vn/vnpy 还在为量化交易环境的搭建而烦恼吗&#xff1f;想要一个简单高效的解决方案吗&#xff1f;Ve…