前面四篇教程里,我们无论怎么折腾,板子上的小灯泡不是在闪烁,就是在努力地一呼一吸。
不知道大家有没有一种感觉:单片机像个不会说话的小哑巴( 一旦我们写了复杂的计算公式,变量算出来是多少、程序卡在第几行,全都看不见,只能靠猜! 要是单片机能像电脑一样,直接在屏幕上把数据打印出来对我们说声“喵”,该多好呀!
今天,我们就来给单片机装上它的“嘴巴和耳朵”——串口通信(USART / UART)!(。・ω・。)ノ♡
1. 什么是串口?
听名字好像很硬核,其实串口的本质超级简单: 就像你在自习课上跟同桌“传小纸条”!
单片机里有两个负责传纸条的小通道:
- “TX(Transmit)”:发送端,也就是单片机的“嘴巴”
- “RX(Receive)”:接收端,也就是单片机的“耳朵”
这里有一个新手经常犯糊涂的接线大坑: 看图: 
既然 TX 是嘴巴,RX 是耳朵,那单片机和电脑的 USB 转 TTL 模块连线的时候:
- 单片机的 **TX(嘴巴)**必须接电脑模块的 RX(耳朵)!
- 单片机的 **RX(耳朵)**必须接电脑模块的 TX(嘴巴)! “我的嘴巴要对着你的耳朵说话,我的耳朵要听你的嘴巴说话,接反了可就变成嘴对嘴接吻啦(划去”
还有最最重要的一根线:“GND 一定要连在一起(共地)!” 因为电压是相对的,如果两边不连 GND,就像两个人站在不同的楼层比身高,看到的电平完全是对不齐的乱码哦喵~
除了接线,传纸条还得约定一个暗号——“波特率(Baud Rate)”。 波特率就是两个人说话的语速!比如我们最常用的“115200”,意思是每秒钟传输 115200 个二进制位。 只要两边的语速对齐了,就能愉快地聊天;如果单片机用 115200 讲相声,电脑用 9600 慢速听,屏幕上就会全是看不懂的火星文乱码喵~
2. CubeMX 工程配置
硬件原理搞明白了,接下来打开我们熟悉的 CubeMX! 老规矩选好 STM32F103C8T6,配好时钟和调试口。
在左侧找到 Connectivity -> 点击 USART1:
- 在
Mode里面选择Asynchronous(异步通信); - 右边芯片上的 **PA9(TX)**和 **PA10(RX)**就会自动变成绿色的串口引脚啦!
- 下面的参数保持默认就好:波特率 115200、8位数据、无校验位、1位停止位。

配置好工程,点击生成代码,打开 Keil 工程!
3. 避坑指南:开启 MicroLIB 微库
写代码前,先来解决一个让无数新手抓狂的惊天大坑!( >﹏<。) 我们待会想在单片机里直接用 C 语言最经典的 printf() 打印文字。 但是在 Keil 里面,如果你想用 printf,必须在工程设置里开启微库(MicroLIB)。
点击 Keil 上方的小魔术棒(Options for Target)-> 切换到 Target 选项卡: 把 “Use MicroLIB” 前面的小方框打上勾! 忘勾的话,单片机一运行到 printf 就会直接当场发呆死机,连个招呼都不打呜呜呜( 
打完勾之后,点 OK 保存,现在打开 main.c 来写代码啦!
4. 重定向 printf 与编写代码
首先,在 main.c 最上方引入我们最熟悉的头文件:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */然后,怎么把 printf 的输出重定向到我们的串口呢? 只需要在 USER CODE BEGIN 0 里面,告诉底层 fputc 函数“每次要输出字符时,调用串口发出去”就好啦:
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);
return ch;
}
/* USER CODE END 0 */定义一个全局计数变量:
/* USER CODE BEGIN PV */
uint32_t count = 0;
/* USER CODE END PV */在初始化完成后打印一条启动问候:
/* USER CODE BEGIN 2 */
printf("喵~ 单片机串口启动成功啦!\r\n");
/* USER CODE END 2 */最后,在 while(1) 主循环里,就可以像在电脑上写 C 语言一样随心所欲地打印啦:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("当前计数:%d,单片机正在愉快地摸鱼中...\r\n", count++);
HAL_Delay(1000);
}
/* USER CODE END 3 */代码分布对照如图: 



5. 上机测试与成果展示
把单片机的 PA9 接模块 RX、PA10 接模块 TX、GND 接 GND 插上电脑。 打开电脑上的串口助手,波特率选 115200,点击打开串口! 
看!屏幕上一秒钟跳出来一条消息,单片机终于开口对我们说话啦!(✧ω✧) 有了串口,以后我们不管做实验、做电赛,还是调传感器,变量算出来是多少直接一行 printf 就能看得清清楚楚,再也不用靠小灯泡闪烁来猜哑谜啦!
完结撒花!(=^・ω・^=)
快去让你的单片机给你发消息吧喵~
💻 本教程完整工程源码已开源:
👉 TomSorachan/stm32-hal-tutorials
