第三课:串口通信实战——PC与单片机串口通信、串口调试助手使用、常见通信故障排查
好,咱们今天来点真家伙。前面两章讲了串口的原理和协议,说白了都是纸上谈兵。这一章,咱们直接拿线连起来,让PC和单片机说上话。
我个人习惯,学任何接口协议,一定要先跑通一个最简单的收发例子。你想想看,如果连“发一个字节,收一个字节”都搞不定,后面那些什么流控、多机通信、DMA传输,根本就是空中楼阁。
3.1 硬件连接:别小看这三根线
串口通信,物理上最少只需要三根线:TXD(发送)、RXD(接收)、GND(地)。
这里有个最常见的坑,我刚开始做项目时也栽过。 单片机的TXD要接PC的RXD,单片机的RXD要接PC的TXD。这叫“交叉连接”。如果你把TXD接TXD,RXD接RXD,那两边都在说,没人听,数据就丢了。
连接示意图如下:
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停止位、无校验。除非你的项目有特殊要求。
- 发送区:可以选“按字符串发送”还是“按十六进制发送”。调试初期,我建议用十六进制。因为你能看到最原始的数据。
- 接收区:同样可以选显示格式。如果收到乱码,先检查波特率,再检查数据格式。
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端操作:
- 打开串口调试助手,选择正确的COM口,波特率设为115200。
- 在发送区输入大写字母
H(注意是字符串模式)。 - 点击“发送”。
- 接收区应该立刻显示
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收不到,那就是软件配置问题。
3.5 本章知识体系
下面这张图,是我自己总结的串口通信实战知识结构。你照着这个思路去排查,基本不会漏掉什么。
嗯,这一章的内容就到这里。串口通信看着简单,但它是所有串行通信的基础。你把这个玩透了,后面学I2C、SPI,甚至学SerDes,都会觉得“哦,原来底层逻辑是一样的”。
可可精品资料库