### 3.1:串口收发
1:硬件设计
![image-20240529084712489](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529084712489.png)
单片机引脚为PA2和PA3。对应STLINK虚拟串口。
![image-20240529084800317](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529084800317.png)
2:软件设计
先配置cubemx的引脚状态:
![image-20240529085221541](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529085221541.png)
自动化生成代码之后,进行串口重定义:
```C
int fputc(int ch, FILE *f)
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART2 and Loop until the end of transmission */
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
```
keil选项设置,使能Use Micro LIB。
![image-20240529091233355](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529091233355.png)
编写测试程序,每隔500ms打印一次hello world。
```C
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* Output a message on Hyperterminal using printf function */
printf("hello world\n\r");
/* Insert delay 100 ms */
HAL_Delay(500);
}
```
打开串口调试助手,查看是否打印输出。
![image-20240529091503105](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529091503105.png)
接着进行串口接收设置;
![image-20240529091740427](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240529091740427.png)
编写串口接收回调函数:
```C
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
if(huart->Instance == USART2) //检查是否为USART2串口
{
// 在UART接收完成回调函数中,根据接收到的数据进行不同的处理
switch(rx_data[0])
{
case 0x30:
// 如果接收到的数据为 0,则关闭LED
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
printf("led_off\r\n");
break;
case 0x31:
// 如果接收到的数据为 1,则打开LED
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
printf("led_on\r\n");
break;
default:
// 如果接收到的数据不在上述情况中,不执行任何操作
break;
}
// 启动下一次异步接收
HAL_UART_Receive_IT(&huart2, (uint8_t*)rx_data, 1);
}
}
```
主要思路如下:
```C
//1:用户通过串口助手发送 0/1/2/3 一字节的数据,数据保留到rx_data缓冲区;
//2:通过 HAL_UART_Receive_IT(&huart1, rx_data, 1),启动接收来自rx_data缓冲区的1字节数据,当收到1字节的数据时,UART 接收中断会被触发。在中断回调处理函数 HAL_UART_RxCpltCallback 中,处理接收到的数据,开始switch-case判断,根据用户发送的数据执行对应的代码,比如接收到的数据为1,则打开LED,比如接收到的数据为0,则关闭LED,之后再次调用 HAL_UART_Receive_IT 来启动下一次接收。
//3:如此反复,用户可以不断的从串口发送1字节数据,来控制LED的亮灭。
具体实现结果,如下视频所示:
```
串口收发(待转码)