蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)

一、C语言常识

printfsprintf的主要区别在于它们的功能和用途:

  1. printf:主要用于将格式化的数据输出到标准输出(如屏幕)。

  2. sprintf:则是将格式化的数据存储到一个指定的字符串缓冲区中,而不是直接输出。
    printf 函数

  3. 输出调试信息:在程序开发过程中,将关键数据、状态等信息输出到控制台,便于调试。

  4. 生成格式化的输出:如输出格式化的文本、数值等。

sprintf 函数

  1. 构建字符串:将数据按照特定格式转换为字符串,用于后续处理或存储。
  2. 在不直接输出的情况下生成格式化的文本,例如在需要将格式化后的内容传递给其他函数或存储在变量中时使用。
    %4ssscanf中的含义是:读取最多 4 个字符并将其存储为字符串。

它确保读取的字符串长度不超过 4 个字符。

  • char tx_buf[30]:这是一个可以存储 30 个字符的发送缓冲区。
  • uint8_t rx_data:这是一个 8 位的接收数据变量。
  • char rx_buf[30]:这是一个可以存储 30 个字符的接收缓冲区。
  • uint8_t rx_count:这是接收数据的计数。
  • char car_type[5]:用于存储车型的 5 个字符的数组。
  • char car_num[5]:用于存储车牌号的 5 个字符的数组。
  • char car_time[15]:用于存储时间的 15 个字符的数组。

二、代码

复制代码
 char tx_buf[30];
 uint8_t rx_data;
 char rx_buf[30];
 uint8_t rx_count;
 char car_type[5];
 char car_num[5];
 char car_time[15];

void uart_proc(void)
{
if(rx_count==22)
{
	sscanf(rx_buf,"%4s:%4s:%12s",car_type,car_num,car_time);
	sprintf(tx_buf,"car_type:%4s\r\n",car_type);
     HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);	
	sprintf(tx_buf,"car_num:%4s\r\n",car_num);
     HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);	
	sprintf(tx_buf,"car_time:%12s\r\n",car_time);
     HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);	
	rx_count=0;
	memset(rx_buf,0,20);
}
}

三.BUG

1.解决接受不完整问题

假如没接受完成,执行函数,就可能会把count直接清零,就会重新接受

复制代码
 while (1)
{
   Key_Proc();
   Lcd_proc();
   if(rx_count!=0)
   {
   uint8_t ttemp=rx_count;
	   HAL_Delay(1);
	   if(ttemp==rx_count) 
	uart_proc();
   }
   
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

2.解决接受错误下一次不能执行的问题

以下是对这段代码的详细解释:

void rxclear_proc(void):这是一个定义的函数,名为 rxclear_proc,它没有返回值(void)。

在函数内部:

  • if(usrxclear<50) return;:如果变量 usrxclear 的值小于 50,则直接返回,不执行后续代码。
  • usrxclear=0;:将 usrxclear 变量的值重置为 0。
  • rx_count=0;:将接收数据的计数变量 rx_count 重置为 0。
  • memset(rx_buf,0,20);:使用 memset 函数将 rx_buf 数组的前 20 个元素全部设置为 0,以清空该缓冲区。
复制代码
void rxclear_proc(void)
{   if(usrxclear<50) return;
	usrxclear=0;
    rx_count=0;
	memset(rx_buf,0,20);
}

uint32_t usrxclear;//main中定义

void SysTick_Handler(void)//滴答定时器里面定义
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
usrxclear++;
  /* USER CODE END SysTick_IRQn 1 */
}

 extern uint32_t usrxclear;//"stm32g4xx_it.C"中定义

四.代码开源

通过网盘分享的文件:串口.zip

链接: https://pan.baidu.com/s/1s-FNqcBW1CerVNHGyEfvuQ?pwd=0820 提取码: 0820

相关推荐
GUIQU.2 分钟前
【每日一题 | 2025年5.5 ~ 5.11】搜索相关题
算法·每日一题·坚持
双叶8363 分钟前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
不知名小菜鸡.3 分钟前
记录算法笔记(2025.5.13)二叉树的最大深度
笔记·算法
道亦无名6 分钟前
STM32H743输出50%的占空比波形
stm32·单片机·嵌入式硬件
小智学长 | 嵌入式31 分钟前
单片机-STM32部分:10、串口UART
stm32·单片机·嵌入式硬件
真的想上岸啊32 分钟前
c语言第一个小游戏:贪吃蛇小游戏05
c语言·算法·链表
元亓亓亓1 小时前
LeetCode热题100--206.反转链表--简单
算法·leetcode·链表
诚丞成1 小时前
BFS算法篇——从晨曦到星辰,BFS算法在多源最短路径问题中的诗意航行(上)
java·算法·宽度优先
hongjianMa1 小时前
2024睿抗编程赛国赛-题解
算法·深度优先·图论·caip
猎板阿权1 小时前
出于PCB设计层面考虑,连排半孔需要注意哪些事项?
单片机·物联网·平面