8.6 串口项目2:轮询方式接收数据控制LED亮灭
# 8.6 串口项目2:轮询方式接收数据控制LED亮灭
本实验通过STM32的USART1模块,采用轮询方式接收串口指令(R/G/B/O),控制RGB三色LED的亮灭。
核心对比:
- 轮询方式:CPU持续查询数据,代码简单但占用资源。
- 适用场景:低频指令控制,学习基础串口通信原理。
# 8.6.1 STM32CubeMX配置
# 1. 新建工程
- 工程名称:
08 USART_2
- 芯片型号:STM32F103C8T6

# 2. 配置LED引脚
- 引脚分配:
- PA7 → LED_BLUE(蓝色LED)
- PB0 → LED_RED(红色LED)
- PB1 → LED_GREEN(绿色LED)
- 模式:GPIO_Output

# 8.6.2 串口项目2软件设计
# 轮询接收逻辑
在main()
的while
循环中,通过HAL_UART_Receive
轮询接收数据,控制LED状态:
while (1) {
uint8_t rx_buffer[1]; // 接收缓冲区(单字节)
// 接收1字节,超时10ms
if (HAL_UART_Receive(&huart1, rx_buffer, 1, 10) == HAL_OK) {
switch (rx_buffer[0]) {
case 'R': // 红色LED亮
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
case 'G': // 绿色LED亮
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
case 'B': // 蓝色LED亮
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
break;
case 'O': // 关闭所有LED
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_RESET);
break;
default: break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 8.6.3 串口项目2下载验证
# 步骤与现象
- 烧录程序:通过ST-LINK连接SWD接口,下载代码至STM32。
- 串口调试:
- 打开串口调试助手,设置波特率115200。
- 发送
R/G/B/O
指令,观察LED状态变化:R
:红色亮,其他灭G
:绿色亮,其他灭B
:蓝色亮,其他灭O
:所有LED关闭

关键说明:
- LED阳极接GPIO,高电平点亮,低电平关闭。
- 轮询方式适用于简单场景,但需注意超时时间设置(避免CPU资源过度占用)。