当前位置: 首页 > article >正文

进阶——第十六蓝桥杯嵌入式熟练度练习(串口的小BUG补充-字符接受不完整和字符接受错误)

1.解决接受不完整问题

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

  while (1)
  {
	  if(rx_count!=0)
	  {
		  uint8_t temp=rx_count;
	     HAL_Delay(1);
	     if(temp==rx_count)
		 uart_proc();	  
	  }
	  key_proc();
	  rxclear_proc();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

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

滴答时钟
extern uint32_t usrxclear;
void SysTick_Handler(void)
{

  HAL_IncTick();
   key_time++;
   usrxclear++;
}

主函数

定义
 uint32_t usrxclear;
void rxclear_proc(void);
 串口执行函数
void uart_proc(void)
{
	if(rx_count==4)
	{ 
		if(strcmp(rx_buf,"LEDO")==0)
		{
		led_show(0x08);
		}
		if(strcmp(rx_buf,"LEDC")==0)
		{
		led_show(0x08^0x08);
		}
	rx_count=0;
	memset(rx_buf,0,30);	
	}
}
超时清零函数 
void rxclear_proc(void)
{
    // 检查全局变量 usrxclear 的值是否小于 50
    if(usrxclear < 50)
    // 如果小于 50,函数直接返回,不执行后续的重置操作
        return;
    else
        // 当 usrxclear 大于等于 50 时,将 usrxclear 重置为 0
        usrxclear = 0;
    // 将另一个全局变量 rx_count 重置为 0,这个变量可能用于记录接收数据的数量
    rx_count = 0;
    // 使用 memset 函数将 rx_buf 数组的前 30 个字节设置为 0
    // rx_buf 通常是用于存储接收到的数据的缓冲区
    memset(rx_buf, 0, 30);
}

 中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{   
	usrxclear=0;
    rx_buf[rx_count++]=rx_data;
   HAL_UART_Receive_IT(&huart1,&rx_data,1);
}


http://www.kler.cn/a/545237.html

相关文章:

  • Sass基础知识以及常用知识整理
  • 天津三石峰科技——汽车生产厂的设备振动检测项目案例
  • 微信小程序配置3 配置sass
  • 【深度学习】常见模型-GPT(Generative Pre-trained Transformer,生成式预训练 Transformer)
  • VSCODE - 连接远程linux服务器,报错XHR failed 解决方法
  • 深度整理总结MySQL——undoLog日志工作原理
  • HTML之JavaScript使用JSON
  • sward简介与安装
  • Gradle 8.4.0 配置阿里云镜像的详细指南
  • 基于SpringBoot的在线车辆租赁信息管理系统
  • electron本地调试时终端输出文字乱码
  • vue的路由 vue-router
  • DeepSeek与Web3:科技融合的新纪元
  • ES节点配置的最佳实践
  • Win10环境使用Dockerdesktop部署Dify集成Deepseek
  • 新数据结构(9)——Java异常体系
  • 小米CyberGear电机 STM32软件修改CAN_ID
  • 基于Flask的软科中国大学排名数据可视化分析系统的设计与实现
  • github与git bash绑定问题
  • 【面试】面试常见的智力题