从原理到实战:串口通信全解析 —— 从电脑互传文件到 STM32 高效通信秘籍
本文围绕串口通信展开了全面的知识讲解与实践操作,系统覆盖了从基础原理到实际应用的关键内容。首先,科普了串口通信的核心基础,包括基于 UART 协议的异步通信特点,以及 RS-232 标准的物理层约定(差分电平传输特性)。通过对比表格清晰呈现了 RS-232 与 TTL 电平在逻辑定义、应用场景上的核心区别,并详解了 CH340 模块作为 USB 转 UART 芯片的工作原理,及其在电脑与串口设备、
文章目录
一.串口协议、RS-232 与 CH340 模块快速科普
串口通信是嵌入式开发中常用的异步通信方式,核心基于 UART(通用异步收发传输器)协议,通过 TX(发送)、RX(接收)两根信号线实现双向数据传输,无需时钟同步,仅需约定波特率、数据位、校验位、停止位等参数即可通信。
1.RS-232 标准:串口的 “物理层约定”
RS-232 是串口通信的经典物理层标准,定义了接口引脚(如 DB9 接头)、电气特性等。其核心特点是差分电平传输:
-
逻辑 1:-3V~-15V
-
逻辑 0:+3V~+15V
这种电平设计能减少干扰,适合远距离传输(约 15 米内),常见于传统工控设备、Modem 等。
2.RS-232 与 TTL 电平的核心区别
TTL 电平是单片机、MCU 等芯片内部的标准电平,与 RS-232 完全不兼容,直接连接会烧毁设备:
| 特性 | RS-232 电平 | TTL 电平 |
|---|---|---|
| 逻辑 1 | -3V~-15V | 0V |
| 逻辑 0 | +3V~+15V | 3.3V/5V |
| 应用场景 | 设备间远距离通信 | 芯片内部 / 板级通信 |
3.USB/TTL 转 232 模块(CH340 芯片)工作原理
日常开发中,电脑多无 RS-232 接口,且单片机输出 TTL 电平,因此需要 “转换桥梁”——CH340 模块:
- 核心芯片 CH340:本质是 USB 转 UART 芯片,负责将电脑 USB 口的 USB 协议转换为 TTL 电平的 UART 协议;
- 电平转换电路:模块内置 MAX232 等芯片,将 CH340 输出的 TTL 电平转换为 RS-232 电平(或反之),实现与 RS-232 设备的适配;
- 使用逻辑:电脑 USB→CH340→TTL 电平→MAX232→RS-232 电平→RS-232 设备,反向传输同理,即插即用(需安装 CH340 驱动)。
简单说,CH340 模块解决了 “电脑 USB” 与 “传统 RS-232 设备”“单片机 TTL 设备” 的通信兼容性问题,是嵌入式开发的必备工具~
二.两台电脑之间实现串口通信
串口通信不仅是嵌入式开发的基础技能,用它来实现两台电脑之间的文件传输也是个很有趣的实践。以下步骤就带大家一步步完成这个实验,看看低速串口如何 “负重” 传输图片、视频等大文件。
1.硬件连接:搭建串口通信链路
核心原理是让两台电脑通过串口模块交叉连接(TX 接 RX,RX 接 TX),共地保证电平参考一致。步骤如下:
- 模块接线:取第一个 CH340 模块(记为 A,接电脑 A)和第二个模块(记为 B,接电脑 B),用杜邦线连接:
- A 模块的 TX 引脚 → B 模块的 RX 引脚
- A 模块的 RX 引脚 → B 模块的 TX 引脚
- A 模块的 GND 引脚 → B 模块的 GND 引脚
- 连接电脑:将模块 A 通过 USB 线插入电脑 A,模块 B 通过 USB 线插入电脑 B
接线实际效果如下图所示:

2.软件配置:串口参数与传输设置
两台电脑的串口助手需设置完全一致的通信参数,否则会出现乱码或传输失败:
- 基本参数设置:
- 波特率:115200
- 数据位:8 位
- 校验位:无
- 停止位:1 位
- 文件传输模式:打开两台电脑的 SSCOM,在电脑 A 上点击 “文件传输”→“发送文件”,选择要传输的文件;电脑 B 上点击 “文件传输”→“接收文件”,并设置保存路径。
发送文件,选择一张图片并进行发送数据(在SSCOM软件中点击打开文件,选择要发送的图片,点击发送文件),发送成功:

接收方(接受时):

接收成功后,找到接收到的文件为DAT文件,我们需要将其后缀改为JPG后选择图片进行查看,就可以看到接收到的图片:
接收到的图片:

3.实验分析
理论传输时间 = ( 文件大小 × 8 ) / 波特率
文件大小为65289字节,共65289×8比特,除以波特率115200bps得到理论时间为:

实际时间比理论时间长,可能是传输时,每隔一段字节就会插入一段延时,也可能是由于在传输过程中出现丢包、错误等重传现象导致。如果调大波特率,传输时间会短。USB 转 TTL 模块在实现电脑与具有串口通信功能的设备之间的数据传输中具有重要作用,其具有使用方便、成本较低等优点。文件大小越小、波特率确保传输正常下越大,传输时间越小。
4.串口通信仅接 TX/RX 两根线:文件传输能否正常工作?
结论先行:不能正常工作,大概率出现传输失败、数据乱码或完全无响应,仅极特殊场景可能出现短暂 “假象通信”,但绝对无法稳定传输文件(尤其是图片、视频等大文件)。
核心原因:串口通信的 “电平参考” 与 “供电逻辑” 缺一不可
串口(无论 RS-232 还是 TTL 电平)的通信本质是 “基于共同参考点的电平变化识别”,仅接 TX/RX 两根线会破坏这一基础,具体问题集中在两点:
1.无 GND:缺少电平判断的 “共同基准”,数据无法被正确识别
2.不接电源线:模块 / 设备无法工作,根本无数据可发
三.STM32 通过 USART1 与上位机通信
1.环境搭建与配置
STM32CubeMX 配置:
- 新建工程,选择对应芯片型号
- 配置 USART1:模式为 “Asynchronous”,波特率 115200,数据位 8,停止位 1,无校验
- 配置时钟树(确保 USART1 时钟正常)
- 生成 Keil 工程

2.连续发送数据与丢包测试
在 main 函数的 while 循环中添加发送代码:
while (1)
{
HAL_UART_Transmit(&huart1, (uint8_t*)"hello windows!\r\n", 15, 0xFFFF);
// 此处先不加延时
}
编译下载程序后,用串口助手接收:
- 当不加延时语句时,上位机接收的数据出现乱码或部分丢失
- 原因:STM32 发送速度远快于串口助手处理速度,导致接收缓冲区溢出
加了延时结果如下图:

不加延时结果如下图:

3.通过指令控制发送状态
- 定义一个全局变量控制发送状态(如
uint8_t send_flag = 1;) - 主循环中根据 flag 决定是否发送数据
- 周期性查询串口接收寄存器,判断是否收到控制指令
代码实现(main.c中):
uint8_t send_flag = 1;
uint8_t rx_data;
while (1)
{
// 查询接收
if (HAL_UART_Receive(&huart1, &rx_data, 1, 10) == HAL_OK)
{
if (rx_data == '#')
send_flag = 0;
else if (rx_data == '*')
send_flag = 1;
}
// 控制发送
if (send_flag)
{
HAL_UART_Transmit(&huart1, (uint8_t*)"hello windows!\r\n", 15, 0xFFFF);
HAL_Delay(100); // 加小延时确保接收稳定
}
}
实验结果如下:
- 初始状态:STM32 持续发送 “hello windows!”
- 发送 “#” 后:STM32 停止发送
- 发送 “*” 后:STM32 恢复发送
串口通信
四.STM32 中断与 DMA 串口通信
1.串口中断方式实现指令控制发送
- STM32CubeMX 配置
- 新建工程,选择对应芯片
- 配置 USART1:异步模式,波特率 115200,8 数据位,1 停止位,无校验
- 使能 USART1 接收中断:在 NVIC Settings 中勾选 “USART1 global interrupt”
- 配置时钟树,生成 Keil 工程

代码如下:
uint8_t send_enable = 1; // 1:允许发送 0:暂停发送
uint8_t rx_data; // 存储接收的数据
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
while (1)
{
if (send_enable) {
uint8_t tx_data[] = "hello windows!\r\n";
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data)-1, 0xFFFF);
HAL_Delay(100);
}
}
}
// USART接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart1) {
// 根据接收的字符控制发送状态
if (rx_data == '#') {
send_enable = 0; // 暂停发送
} else if (rx_data == '*') {
send_enable = 1; // 继续发送
}
// 重新启动接收中断
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
}
}
实现结果与上述结果一致。
2.串口 DMA 方式高速发送数据
- STM32CubeMX 配置
- 基础配置同任务 1,额外开启 USART1 的 DMA 发送功能
- 在 DMA Settings 中添加 DMA 通道:
- 外设:USART1_TX
- 方向:存储器到外设
- 模式:循环模式(Circular)
- 数据宽度:字节(Byte)

代码如下:
/* 全局变量 */
uint8_t dma_tx_buf[] = "hello windows!\r\n"; // DMA发送缓冲区,存储要发送的字符串
uint16_t buf_len = sizeof(dma_tx_buf) - 1; // 计算字符串长度(减去结束符'\0')
/* main函数 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
MX_DMA_Init(); // CubeMX自动生成的DMA初始化函数
// 启动DMA发送(循环模式下会持续发送缓冲区数据)
HAL_UART_Transmit_DMA(&huart1, dma_tx_buf, buf_len);
while (1)
{
}
}
实验结果如图:

五.原理对比
| 通信方式 | 核心优势 | 适用场景 |
|---|---|---|
| 轮询方式 | 实现简单 | 低速率、低实时性需求 |
| 中断方式 | 实时响应接收事件 | 需及时处理指令的场景 |
| DMA 方式 | 解放 CPU,高速传输 | 大数据量连续发送 / 接收 |
通过实验可直观感受:中断方式解决了轮询的 CPU 占用问题,而 DMA 方式进一步将数据搬运工作交给硬件,特别适合高速串口通信场景。在实际开发中,需根据数据量和实时性要求选择合适的通信方式。
六.STM32 串口发送:解决丢包问题与仿真分析
1.配置仿真环境
- 打开 Keil 工程,点击 “Options for Target”(魔术棒图标)
- 切换到 “Debug” 选项卡,选择 “Use Simulator”,勾选 “Run to main ()”
- 设置 “Dialog DLL” 为
DARMSTM.DLL,“Parameter” 为-pSTM32F103C8(根据芯片型号修改)

2.添加逻辑分析仪
- 点击菜单栏 “Debug"→"Start/Stop Debug Session” 进入仿真模式
- 打开逻辑分析仪:“View"→"Analyzer”
- 点击 “Setup”,添加 UART 发送引脚(如 PA9):
- 点击 “New”,在 “Signal” 栏输入
PORTA.9(PA9 为 USART1_TX) - “Type” 选择 “Bit”,点击 “OK”
- 点击 “New”,在 “Signal” 栏输入




在原代码基础上直接进行仿真时一直显示为最后一个字符,具体原因如下:仿真刷新速度跟不上代码执行速度,所以对仿真代码进行了修改如下:
while (1)
{
for (uint16_t i = 0; i < len; i++) {
// 逐字节发送,每发送一个字节延时50ms(仿真中延长显示时间)
HAL_UART_Transmit(&huart1, &send_data[i], 1, 100);
HAL_Delay(50); // 仿真专用延时,实际硬件可删除
}
}
结果如下:

3.波特率计算
波特率定义为 “每秒传输的比特数(bps)”,核心公式:
实际波特率 = 1 / 单个比特的持续时间(单位:秒)
1.在逻辑分析仪中,找到一个完整的 “位”(推荐选择起始位,低电平持续段,边缘清晰易测量);
2.鼠标左键点击波形的起始点(如起始位的下降沿),按住不放拖动到该位的结束点(如起始位的上升沿);
3.逻辑分析仪窗口会显示两点间的时间差(Δt),即为单个比特的持续时间。
代入公式计算:
实际波特率 = 1 / (8.68×10⁻⁶) ≈ 115200 bps
与配置值(115200)一致,说明波特率正确。
串口通信的容错范围为 ±5%,即:
|(实际波特率 - 配置波特率)/ 配置波特率| ≤ 5%
若误差超过 5%,需排查:
-
系统时钟配置错误(如 PLL 倍频参数错误,导致 APB2 时钟偏差);
-
串口初始化时BaudRate参数填写错误;
-
芯片型号选择错误(仿真时加载了错误的外设时钟模型)。
七.总结
本文围绕串口通信展开了全面的知识讲解与实践操作,系统覆盖了从基础原理到实际应用的关键内容。
首先,科普了串口通信的核心基础,包括基于 UART 协议的异步通信特点,以及 RS-232 标准的物理层约定(差分电平传输特性)。通过对比表格清晰呈现了 RS-232 与 TTL 电平在逻辑定义、应用场景上的核心区别,并详解了 CH340 模块作为 USB 转 UART 芯片的工作原理,及其在电脑与串口设备、单片机间通信的桥梁作用。
其次,介绍了两台电脑间串口通信的实现过程:硬件上通过 CH340 模块进行 TX 与 RX 交叉连接并共地,软件上统一串口参数(波特率 115200 等)并配置文件传输模式,分析了实际传输时间长于理论值的原因(如延时插入、重传等),同时明确仅接 TX/RX 两根线无法稳定传输文件的结论及底层原因(缺少电平参考与供电逻辑)。
再者,详细阐述了 STM32 通过 USART1 与上位机通信的实践:包括 STM32CubeMX 的环境配置,连续发送数据时因无延时导致的丢包问题及解决办法,以及通过查询方式实现指令(# 停止、* 恢复)控制发送状态的具体代码与效果。
随后,讲解了 STM32 中断与 DMA 串口通信的实现:中断方式通过使能 USART1 接收中断,在回调函数中处理控制指令,实现高效响应;DMA 方式则开启 USART1 的 DMA 发送功能,以循环模式实现高速数据传输,解放 CPU 资源。并通过表格对比了轮询、中断、DMA 三种方式的核心优势与适用场景(低速率需求、实时指令处理、大数据量传输)。
最后,介绍了 STM32 串口发送中丢包问题的仿真分析:包括 Keil 仿真环境配置、逻辑分析仪添加与引脚设置,通过修改代码(逐字节发送加延时)解决仿真刷新问题,以及波特率的计算方法(基于单个比特持续时间)和 ±5% 的容错范围,及误差超限时的排查方向。
更多推荐



所有评论(0)