主控板:STM32G431RBT6
板载下载器:DAPLINK
软件:STM32CubeMX、Keil MDK5
文章目录
- 1、工程配置
- 2、代码编写
- 3、硬件实现
- 4、问题和总结
1、工程配置
- UART1选择异步通信模式,根据要求设置比特率为9600并使能中断
2、代码编写
- interrupt.c:增加串口中断回调函数
char rxdata[30]; uint8_t rxdat; unsigned char rx_pointer; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat){ rxdata[rx_pointer++]=rxdat; HAL_UART_Receive_IT(&huart1,&rxdat,1); }
- main.c:串口接收函数
void uart_rx_proc(){ if(rx_pointer>0){ if(rx_pointer==24){ sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time); } else{ char temp[20]; sprintf(temp,"Error"); HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50); } rx_pointer=0; memset(rxdata,0,30); } }
- main.c:在disp_proc()中增加一个界面
else if(view==2){ LCD_DisplayStringLine(Line1, (uint8_t *)" Car_msg"); char text[30]; sprintf(text,"cartype=%s",car_type); LCD_DisplayStringLine(Line3, (uint8_t *)text); sprintf(text,"cardata=%s",car_data); LCD_DisplayStringLine(Line4, (uint8_t *)text); sprintf(text,"cartime=%s",car_time); LCD_DisplayStringLine(Line5, (uint8_t *)text); }
- main.c:在key_change()中增加界面选择
if(key[0].single_flag==1){ view++; if(view==3) view=0; LCD_Clear(0x000000); key[0].single_flag=0; //key[0].state=No_Press; }
- main.c:变量和函数声明及初始化
#include "string.h" extern char rxdata[30]; extern uint8_t rxdat; extern unsigned char rx_pointer; char car_type[5]; char car_data[5]; char car_time[13]; void uart_rx_proc(); int main(void)//增加部分 { HAL_UART_Receive_IT(&huart1,&rxdat,1); while (1){ key_change(); disp_proc(); if(rx_pointer!=0){ int temp=rx_pointer; HAL_Delay(1); if(temp==rx_pointer) uart_rx_proc(); } }
3、硬件实现
- 通过串口向下位机发送正确信息,LCD屏也能显示出正确的信息:
- 发送错误信息时LCD屏无数据显示,下位机会向上位机发送“Error”通过串口助手显示出来:
4、问题和总结
-
HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50);
用于通过UART(通用异步收发器)接口向上位机发送数据,其中包括四个参数;- *UART_HandleTypeDef *huart *:UART接口配置信息;
- *uint8_t pData:指向包含要传输数据的数据缓冲区的指针;
- uint16_t Size:要传输的字节数;
- uint32_t Timeout:以毫秒为单位的超时值,如果传输操作超过此时间函数将返回错误。
-
HAL_UART_Receive_IT(&huart1, rx_data, 1);
用于在中断模式下接受一定量的数据,- Size:要接收的数据元素(u8或u16)数量,每次中断只能接收一个字符,因此该函数Size只能填1;
- 在main函数中在进入while循环前需要调用该函数。
-
本工程中是通过串口收发固定长度的数据,是因为题目要求中收发的数据都是固定格式与固定长度,如果单片机需要接收不定长度的数据可以考虑设置标志位或定时器来判断数据是否完成发送;另一方面工程中只实现了接收一个数据,但一般题目中会要求接收一组数据,此时可以应用结构体实现功能。
参考资料
(1)B站学习视频:【备战2024蓝桥杯 嵌入式组】CT117E-M4 新款开发板 3小时省赛模块 速成总结
(2)STM32实现串口不定长数据接收(HAL库版–方法2)
(3)HAL库+CubeMX 串口发送和中断接收字符串
(4)STM32 非阻塞HAL_UART_Receive_IT解析与实际应用