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

发布于:2025-02-18 ⋅ 阅读:(117) ⋅ 点赞:(0)

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);
}