配置
如果没有配置过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);