蓝桥杯-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

相关推荐
wuweijianlove35 分钟前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung1 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了1 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL1 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰1 小时前
C++ 排列组合完整指南
开发语言·c++·算法
多看多敲多思考2 小时前
华润微CS32ME10 MCU使用教程(2)---CS32ME10之UART串口模块使用
stm32·单片机·嵌入式硬件·mcu
神一样的老师2 小时前
【兆易创新GD32VW553开发板试用】天气时钟设计与调试实战
单片机·嵌入式硬件·物联网
代码中介商2 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
国科安芯2 小时前
核电站仪控与监测系统中抗辐射 MCU 芯片应用研究
单片机·嵌入式硬件·macos·无人机·cocos2d·核电站
foundbug9992 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab