蓝桥杯嵌入式stm32串口接收(使用中断)

发布时间:2024年01月24日

附上我的工程链接

链接:https://pan.baidu.com/s/1-WNduviH-wgYQeL-dgM4wA?pwd=f0uh?
提取码:f0uh

1. 配置stm32cubemx

? ? ? ? 1.1rcc时钟配置

????????

? ? ? ? 1.2? 下载器配置

? ? ? ? 1.3 USART1配置

? ? ? ? 1.3 时钟树配置

? ? ? ? 要选择外部晶振的话,切记一定要是24Mhz的晶振,要不然串口打印的时候会乱码!!!

? ? ? ? 1.4 其他项配置

配置完电机generate code,之后打开keil工程。

2. keil代码

? ? ? ? 2.1??首先找到stm32g4xx_it.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);

}

? ? ? ? 2.2 在main函数里声明外部变量

????????这里的car_xxxx是存放我们串口一次性要发送的数据

uint8_t ucLcd[21];
char car_type[5];
char car_data[5];
char car_time[13];

extern char rxdata[30];
extern uint8_t rxdat;
extern unsigned char rx_pointer;

? ? ? ? 2.3 定义一个函数

? ? ? ? 这个函数是接收函数。

void UART_Receice_Proc(void){
	if (rx_pointer > 0){
		if (rx_pointer == 6){
			sscanf(rxdata,"%2s:%1s:%1s",car_type,car_data,car_time);
			printf("yes");
		}
		else{
			UART_Transmit((uint8_t *)"Error\r\n",sizeof("Error\r\n"));
		}
	}
	rx_pointer = 0;
	memset(rxdata,0,30);
}

? ? ? ? 2.4 在while(1)中调用你这个函数、

????????这些判断是为了更加精确的判断是否接收到了数据,最好加上,因为我没这些代码的时候,串口接受十分的不灵敏。估计是串口接收的太快,毕竟是异步通信,没有统一的时序。

		if(rx_pointer > 0)
		{
			int temp = rx_pointer;
			HAL_Delay(1);
			if(temp == rx_pointer)
			UART_Receice_Proc();
		}

? ? ? ? 2.5 开启中断

????????之后配置好后,你也可以配置lcd显示在屏幕上,但是注意一点,LCD初始化一定要在一大堆的初始化后面。要不然会出现接受不到的现象。

	HAL_UART_Receive_IT(&huart1,&rxdat,1);

?3. 效果

文章来源:https://blog.csdn.net/qwe___ewq/article/details/135729946
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。