厦门市建设工程安全管理协会网站,做网站公司哪家,万网如何做网站,上海关键词优化外包前言#xff1a; 在整个蓝桥杯考试中涉及串口的次数还是较多#xff0c;这里写下这篇博客#xff0c;记录一下自己的学习过程。
STM32Cubemx配置#xff1a; 首先#xff0c;我们点击左侧的Connectivity选择USART1进行如下配置。 使能串口中断 在左侧的管脚配置上也要做出…前言 在整个蓝桥杯考试中涉及串口的次数还是较多这里写下这篇博客记录一下自己的学习过程。
STM32Cubemx配置 首先我们点击左侧的Connectivity选择USART1进行如下配置。 使能串口中断 在左侧的管脚配置上也要做出修改 到此为止我们就配置完了点击生成代码即可。
代码部分 发送的代码 我是直接将上一篇博客采集到的电压值直接发送给了串口助手。 首先在main.c中引入头文件string.h并定义一个数组专门用来存储要发送的数据
#include string.h
char temp[20]; //定义数组用来发送串口数据 将发送代码放到主循环中
sprintf(temp,ADC_value:%.2f\r\n,adc_value1);
HAL_UART_Transmit(huart1,(unsigned char *)temp,strlen(temp),50); 最终效果 接收部分 接收部分最重要的就是串口中断回调函数这个函数的位置在stm32g4xx_hal_uart.h里面在1632行的位置如果记不住就记1600多行的位置 我们新建一个文件叫做myusart.c里面写一下我们的中断服务函数
char rxdata[20];
unsigned char rxdat;
unsigned char rx_pointer;char car_type[5];
char car_num[5];
char car_time[13];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{rxdata[rx_pointer] rxdat; //在后面是先用在自加HAL_UART_Receive_IT(huart1,rxdat,1);
}void uart_rx_proc()
{if(rx_pointer 0) //大于0说明接收到数据{if(rx_pointer 22) //判断是否接收成功{ sscanf(rxdata,%4s:%4s:%12s,car_type,car_num,car_time);//对接收的数据进行解析 }else//发生错误输出Error{char temp[10];sprintf(temp,Error\r\n);HAL_UART_Transmit(huart1,(uint8_t *)temp,strlen(temp),50); }rx_pointer 0; //指针归位memset(rxdata,0,sizeof(rxdata)); //初始化为0}
} 我们再同样定义一个myusart.h的文件
#ifndef __MYUSART_H
#define __MYUSART_H#include main.hvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void uart_rx_proc(void);extern char car_type[5];
extern char car_num[5];
extern char car_time[13];#endif我们只需要在main.c的while新婚换里面调用以下代码即可完成串口的接收
if(rx_pointer ! 0)
{int media rx_pointer;HAL_Delay(1);if(media rx_pointer) uart_rx_proc();
} 我们简单的显示一下
sprintf(text,car_type:%s,car_type);
LCD_DisplayStringLine(Line5,(uint8_t *)text);
sprintf(text,car_num:%s,car_num);
LCD_DisplayStringLine(Line6,(uint8_t *)text);
sprintf(text,tim:%s,car_time);
LCD_DisplayStringLine(Line7,(uint8_t *)text); 最终效果实现 补发 这里我曾经出现了一个小BUG在这里记录一下就是无论如何在发送数据的时候不要人为的给数据加上\r\n因为这个串口助手的界面不如原子哥的界面所以我经常使用正点原子提供的串口助手在使用这个串口助手的时候我会不经意间加上“\r\n”所以代码就会出现一些BUG而蓝桥杯官方提供的串口助手就不会出现这个问题因为你没办法加上回车。而且在判断接收字符的代码中我们一般不把\r\n计入字符串的总数这点一定要注意。比如这里 这里我就设定的字符数据是22个。 此外还有一个小BUG就是有时候我发现串口接收到的数据最后一位始终为0这个让我百思不得其解最后在调试的时候我发现了问题所在 用来接收数据的字符设定的少了一些 所以导致最后一位始终为0。