【UART 串口】命令点灯
下载例程代码:
如何使用例程
1️⃣ 编译并下载程序到学习板
2️⃣ 使用配套TYPE-C数据线,将学习板连接到计算机
3️⃣ 打开 波特律动 串口助手 在线串口调试助手,点击“选择串口”,选择USB Single Serial
4️⃣ 发送任意数据,即可看到接收到的数据原样返回
例程讲解
下面介绍了如何自己实现该例程的功能
1、工程配置
1️⃣ 分配引脚:如图,将 PA6、PA7、PB0 配置为 GPIO_Output,并分别设置 User label 为 BLUE、GREEN、RED
2️⃣ 打开串口2外设:Pinout&Configuration -> Connectivity -> USART2,将 Mode 选择为 Asynchronous
2、代码
1️⃣ 定义串口接收缓冲区,数组大小为2
C语言
1// 串口接收缓冲区2uint8_t rx_data[2];
2️⃣ 在while循环中,使用HAL_UART_Receive函数接收串口数据
C语言
1// 开始接收数据,阻塞等待,直到接收到 2 个字节2HAL_UART_Receive(&huart2, rx_data, 2, HAL_MAX_DELAY);
3️⃣ 在while循环中,使用if语句判断接收到的数据,并控制LED
C语言
1// 根据接收到的数据控制 LED2GPIO_PinState state = GPIO_PIN_SET;3if (rx_data[1] == '0')4{5 state = GPIO_PIN_RESET;6}7if (rx_data[0] == 'R')8{9 HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, state);10}11else if (rx_data[0] == 'G')12{13 HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, state);14}15else if (rx_data[0] == 'B')16{17 HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, state);18}
4️⃣ 在while循环最后,使用HAL_UART_Transmit函数返回收到的数据
C语言
1// 将收到的数据返回2HAL_UART_Transmit(&huart2, rx_data, 2, HAL_MAX_DELAY);
为什么返回数据发生颠倒?
例如发送 R1 返回却变成 1R
原因:HAL_UART_Receive 固定接收2字节。发送非2字节数据(如1或3字节)会使剩余字节留在缓冲区,下次读取时导致数据错乱。
解决方法:可以在 while 循环最上面添加一行代码,清空缓冲区
C语言
1while (1)2{3 // 先清空一下缓冲区4 HAL_UART_Receive(&huart2, rx_data, 1, 0);5 // 然后开始接收数据...6 // 控制 LED...7 // 将收到的数据返回...8}