跳到主要内容

【UART 串口】命令点灯

下载例程代码下载代码

注意

请一定按照 例程使用方法🔗 导入例程,否则下载的可能不是例程而是其他工程。

UART串口的第一个例子:通过串口(TYPE-C)向板子发送命令,控制学习板正面的LED。

如何使用例程

1️⃣ 编译并下载程序到学习板

2️⃣ 使用配套TYPE-C数据线,将学习板连接到计算机

连接usb线

3️⃣ 打开 波特律动 串口助手 (baud-dance.com) 在线串口调试助手,点击“选择串口”,选择USB Single Serial

4️⃣ 发送 R1 即可点亮红色LED,发送 R0 即可熄灭红色LED,其他颜色LED类似

串口

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

1️⃣ 分配引脚:如图,将 PA6PA7PB0 配置为 GPIO_Output,并分别设置 User label 为 BLUEGREENRED

提示

左键点击对应的引脚,选择 GPIO_Output; 右键点击对应的引脚,选择 User label,分别输入 BLUE、GREEN、RED

gpio config

2️⃣ 打开串口2外设Pinout&Configuration -> Connectivity -> USART2,将 Mode 选择为 Asynchronous

uart config

2、代码

1️⃣ 定义串口接收缓冲区,数组大小为2

// 串口接收缓冲区
uint8_t rx_data[2];

2️⃣ 在while循环中,使用HAL_UART_Receive函数接收串口数据

信息

HAL_MAX_DELAY 表示阻塞等待,直到接收到 2 个字节为止

// 开始接收数据,阻塞等待,直到接收到 2 个字节
HAL_UART_Receive(&huart2, rx_data, 2, HAL_MAX_DELAY);

3️⃣ 在while循环中,使用if语句判断接收到的数据,并控制LED

信息

rx_data[0] 第一个字符为颜色(R:红色,G:绿色,B:蓝色)

rx_data[1] 第二个字符为状态(0:灭,1:亮)

// 根据接收到的数据控制 LED
GPIO_PinState state = GPIO_PIN_SET;
if (rx_data[1] == '0')
{
state = GPIO_PIN_RESET;
}
if (rx_data[0] == 'R')
{
HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, state);
}
else if (rx_data[0] == 'G')
{
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, state);
}
else if (rx_data[0] == 'B')
{
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, state);
}

4️⃣ 在while循环最后,使用HAL_UART_Transmit函数返回收到的数据

信息

HAL_MAX_DELAY 表示阻塞等待,直到 2 个字节全部发送成功

// 将收到的数据返回
HAL_UART_Transmit(&huart2, rx_data, 2, HAL_MAX_DELAY);

为什么返回数据发生颠倒?

例如发送 R1 返回却变成 1R

原因HAL_UART_Receive 固定接收2字节。发送非2字节数据(如1或3字节)会使剩余字节留在缓冲区,下次读取时导致数据错乱。

解决方法:可以在 while 循环最上面添加一行代码,清空缓冲区

while (1)
{
// 先清空一下缓冲区
HAL_UART_Receive(&huart2, rx_data, 1, 0);
// 然后开始接收数据...
// 控制 LED...
// 将收到的数据返回...
}