蓝桥杯嵌入式——uart串口通信

发布时间 2023-04-01 21:23:30作者: Euphonium611

配置

 

 如果没有配置过lcd屏,需要手动将引脚改为PA9和PA10

 

 参数的配置

 

 打开中断

 

 编程(发送数据)

需要先引用一个头文件

1 #include "string.h"

然后使用函数HAL_UART_Transmit

1         char text[30];
2         sprintf(text,"hello world\r\n");
3         HAL_UART_Transmit(&huart1,(uint8_t *)text,strlen(text),50);

就可以在串口助手里看到

 编程(发送数据)

先在中断文件里引用头文件

#include "usart.h"

然后编写回调函数

1 char rxdata[30];
2 uint8_t rxdat;
3 uchar rx_pointer=0;
4 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
5 {
6     HAL_UART_Receive_IT(&huart1,&rxdat,1);
7     rxdata[rx_pointer++]=rxdat;
8 }

在主函数中先申明全局变量

1 extern char rxdata[30];
2 extern uint8_t rxdat;
3 extern uchar rx_pointer;

然后进行串口接收初始化,这里与回调函数的语句相同

1 HAL_UART_Receive_IT(&huart1,&rxdat,1);

函数编写

先申明变量和函数

1 char car_type[5];
2 char car_data[5];
3 char car_time[13];
4 void uart_rx_proc(void);

这里scanf函数接收的是%4s,字符组却得申明为[5],因为scanf需要收到一个/0字符(大概这样),反正得多一位

memset函数:memset(a, b,sizeof(a));就是将a数组全部赋值为b

 1 void uart_rx_proc()
 2 {
 3     if(rx_pointer>0)
 4     {
 5         if(rx_pointer==22)
 6         {
 7             sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);
 8         }
 9         else
10         {
11             char temp_text[30];
12             sprintf(temp_text,"error");
13             HAL_UART_Transmit(&huart1,(uint8_t *)temp_text,strlen(temp_text),50);
14         }
15     }
16     rx_pointer=0;
17     memset(rxdata,0,30);
18 }

函数调用(这里编写if语句是为了防止接受不全)

1         if(rx_pointer!=0)
2         {
3             int temp = rx_pointer;
4             HAL_Delay(20);
5             if(temp == rx_pointer)
6             {
7                 uart_rx_proc();
8             }
9         }

效果呈现

将接收到的数据反映在屏幕上

1         char text_lcd[30];
2         sprintf(text_lcd,"car_type: %s",car_type);
3         LCD_DisplayStringLine(Line1,(unsigned char*)text_lcd);
4         sprintf(text_lcd,"car_data: %s",car_data);
5         LCD_DisplayStringLine(Line2,(unsigned char*)text_lcd);
6         sprintf(text_lcd,"car_time: %s",car_time);
7         LCD_DisplayStringLine(Line3,(unsigned char*)text_lcd);