第三课:串口通信实战——PC与单片机串口通信、串口调试助手使用、常见通信故障排查

好,咱们今天来点真家伙。前面两章讲了串口的原理和协议,说白了都是纸上谈兵。这一章,咱们直接拿线连起来,让PC和单片机说上话。

我个人习惯,学任何接口协议,一定要先跑通一个最简单的收发例子。你想想看,如果连“发一个字节,收一个字节”都搞不定,后面那些什么流控、多机通信、DMA传输,根本就是空中楼阁。

3.1 硬件连接:别小看这三根线

串口通信,物理上最少只需要三根线:TXD(发送)、RXD(接收)、GND(地)。

这里有个最常见的坑,我刚开始做项目时也栽过。 单片机的TXD要接PC的RXD,单片机的RXD要接PC的TXD。这叫“交叉连接”。如果你把TXD接TXD,RXD接RXD,那两边都在说,没人听,数据就丢了。

⚠️ 警告: 现在的PC主板通常没有原生串口了。你用的USB转串口模块(比如CH340、CP2102、FT232),它的TXD和RXD定义,一定要看模块背面的丝印。有些模块标的是“TX”和“RX”,但内部已经做了交叉,有些没做。我的建议是:拿到模块先拿万用表量一下,或者直接看数据手册,别凭感觉。

连接示意图如下:

PC (USB转串口)         单片机 (TTL电平)
    TXD —————————————— RXD
    RXD —————————————— TXD
    GND —————————————— GND

嗯,这里要注意:PC串口是RS-232电平(±12V),单片机是TTL电平(0~3.3V或0~5V)。所以USB转串口模块其实还干了一件事——电平转换。如果你直接拿老式PC的DB9串口去接单片机,不经过MAX232这样的电平转换芯片,会烧单片机的。

3.2 串口调试助手:你的第一把瑞士军刀

串口调试助手,说白了就是一个能发数据、能收数据的窗口工具。我个人用过不下十种,从最古老的“串口调试助手SSCOM”到现在的“MobaXterm”内置串口功能。但核心功能都一样:

  • 选择端口号:插上USB转串口后,去设备管理器里看“端口(COM和LPT)”下面多出来的那个COM号。比如COM3、COM5。
  • 设置波特率:9600、115200是最常见的。两边必须一致,否则收到的全是乱码。
  • 数据位/停止位/校验位:通常保持默认:8数据位、1停止位、无校验。除非你的项目有特殊要求。
  • 发送区:可以选“按字符串发送”还是“按十六进制发送”。调试初期,我建议用十六进制。因为你能看到最原始的数据。
  • 接收区:同样可以选显示格式。如果收到乱码,先检查波特率,再检查数据格式。
💡 个人技巧: 我习惯在发送区先发一个固定的字节,比如0x55(二进制01010101)。这个字节在示波器上看波形最明显,高低电平交替,一眼就能看出波特率对不对。如果收到的是0x55,说明物理层没问题。

3.3 实战:PC发“Hello”,单片机回“World”

咱们写一个最简单的单片机程序。我用的是STM32的HAL库,但原理通用。你换成51、Arduino、ESP32都一样。

单片机端代码(伪代码 + 核心逻辑):

// 初始化串口1:波特率115200,8N1
UART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart1);

// 主循环
uint8_t rx_byte;
uint8_t tx_buffer[] = "World!\r\n";

while (1)
{
    // 等待接收一个字节(阻塞方式)
    HAL_UART_Receive(&huart1, &rx_byte, 1, HAL_MAX_DELAY);

    // 如果收到的是 'H',就回复 "World!"
    if (rx_byte == 'H')
    {
        HAL_UART_Transmit(&huart1, tx_buffer, sizeof(tx_buffer)-1, HAL_MAX_DELAY);
    }
}

PC端操作:

  1. 打开串口调试助手,选择正确的COM口,波特率设为115200。
  2. 在发送区输入大写字母 H(注意是字符串模式)。
  3. 点击“发送”。
  4. 接收区应该立刻显示 World!。

如果没反应?别急,咱们下面排查。

3.4 常见通信故障排查(避坑指南)

我曾经在一个项目里,花了整整一个下午,才发现是USB转串口模块的驱动没装好。从那以后,我总结了一套排查流程,按顺序来,基本十分钟内能定位问题。

🔧 故障排查三步走:
步骤 检查项 具体操作 我踩过的坑
1 物理连接 用万用表测TXD和RXD是否连通?GND是否共地? 有一次杜邦线虚焊,TXD根本没连上
2 驱动与端口 设备管理器里有没有感叹号?COM号是不是被占用了? CH340驱动被360误删过,哭笑不得
3 波特率匹配 PC和单片机设置是否完全一致? 115200和1152000差一个0,乱码一整天
4 接线交叉 TX接RX,RX接TX? 这个最基础,但最容易犯
5 电平标准 TTL电平模块接TTL单片机?RS232电平不能直连TTL 用MAX232芯片时,忘记接电荷泵电容

还有一个终极武器:示波器。 如果你有示波器,直接把探头夹在TXD引脚上,发一个字节,看波形。正常的UART波形,空闲时是高电平,起始位是低电平,然后8个数据位,最后停止位是高电平。如果波形不对,那就是硬件问题;如果波形完美但PC收不到,那就是软件配置问题。

💡 快速判断法: 把单片机的TXD和RXD短接(就是自己发自己收)。如果PC发出去的数据能原样收回来,说明单片机的串口硬件和程序都没问题。问题一定出在连接线或者对方设备上。

3.5 本章知识体系

下面这张图,是我自己总结的串口通信实战知识结构。你照着这个思路去排查,基本不会漏掉什么。

串口通信实战知识体系 硬件连接 • TXD ↔ RXD 交叉 • GND 必须共地 • 电平匹配(TTL/RS232) • 驱动安装与COM口识别 • 杜邦线/焊接可靠性 软件配置 • 波特率一致 • 数据位/停止位/校验位 • 发送模式(HEX/字符串) • 接收显示格式 • 流控(RTS/CTS)开关 调试工具 • 串口调试助手 • 示波器看波形 • 逻辑分析仪 • 串口监听软件 • 自收发测试(TX短接RX) 核心排查逻辑 1. 硬件通不通? → 万用表测通断,示波器看波形 2. 配置对不对? → 波特率、数据格式、COM口 3. 数据发没发? → 自收发测试,排除法定位 记住:90%的串口问题,出在波特率不匹配和接线交叉上

嗯,这一章的内容就到这里。串口通信看着简单,但它是所有串行通信的基础。你把这个玩透了,后面学I2C、SPI,甚至学SerDes,都会觉得“哦,原来底层逻辑是一样的”。

可可精品资料库