关于#stm32#的问题:按键状态一直没被检测到按下,但是我把下面else里面的内容注释后(语言-c语言)


parseGpsBuffer();//获取gps位置信息
        Key_Statu_Read();//读取按键状态
        
        if(k_sta.key1==1)//按下
        {
            
            printf("{ \"GPS\":\"%s%s %s%s\", \"warning\":%d}",Save_Data.latitude,Save_Data.N_S,Save_Data.longitude,Save_Data.E_W,1);    //往串口打印位置信息和报警信息1
              L_LED_D_ON;
              HAL_Delay(1500);
              L_LED_D_OFF;
              k_sta.key1=0;    
        }
        else{           //没按下
                        HAL_Delay(1500);
            printf("{ \"GPS\":\"%s%s %s%s\", \"warning\":%d}",Save_Data.latitude,Save_Data.N_S,Save_Data.longitude,Save_Data.E_W,0);//发送位置信息和报警信息0
                        HAL_Delay(1500);
        }

上面这段代码运行后,按下按键,按键状态一直没被检测到按下,怎么按都没有用,一直输出的是下面没按下的信息,但是我把下面else里面的内容注释后,按下按键又是可以响应的,这是什么原因呢,解决方法是是啥

  • 参考GPT的内容和自己的思路:

  • 根据你提供的代码和描述,很可能是因为在else语句中的HAL_Delay()函数延迟了程序的执行时间,导致按键状态检测失败。

  • 在程序中使用延迟函数(如HAL_Delay())时,需要注意延迟的时间不能过长,否则会影响程序的响应能力。在你的代码中,每个else语句内部都有一个HAL_Delay(1500)的延迟,这意味着程序在这里会暂停执行1.5秒钟,如果按键在此期间被按下,它的状态就无法被检测到。

  • 要解决这个问题,可以尝试在else语句中移除HAL_Delay()函数,或将延迟的时间减少到可以接受的范围内。另外,如果你需要在按键按下时延迟一段时间再进行其他操作,可以使用定时器来实现,而不是使用延迟函数。
  • 根据你的描述,你可以尝试修改代码,将else语句中的延迟函数去掉或者减少时间,或者使用定时器来实现延迟功能。下面是一个示例代码,你可以参考一下:
parseGpsBuffer(); //获取gps位置信息
Key_Statu_Read();  //读取按键状态

if (k_sta.key1 == 1) //按下
{
    printf("{ \"GPS\":\"%s%s %s%s\", \"warning\":%d}", Save_Data.latitude, Save_Data.N_S, Save_Data.longitude, Save_Data.E_W, 1); //往串口打印位置信息和报警信息1
    L_LED_D_ON;
    HAL_Delay(1500);
    L_LED_D_OFF;
    k_sta.key1 = 0;
}
else
{ //没按下
    printf("{ \"GPS\":\"%s%s %s%s\", \"warning\":%d}", Save_Data.latitude, Save_Data.N_S, Save_Data.longitude, Save_Data.E_W, 0); //发送位置信息和报警信息0
    HAL_Delay(500); //减少延迟时间
}


  • 在上述代码中,我将else语句中的延迟时间从1500毫秒减少到了500毫秒。如果还是会影响到按键状态的检测,你可以将延迟时间进一步减少,或者使用定时器来代替延迟函数,具体实现可以参考单片机的定时器模块使用手册。

你这个函数是放在哪里调用的?位置不对的话,可能是HAL_Delay引起的,改用自写的延迟函数试试

可能是你在else语句中调用了HAL_Delay()函数,导致程序被阻塞,无法及时读取按键状态。建议将HAL_Delay()移动到if语句的末尾,在按下按键后等待一段时间再读取按键状态,这样可以避免阻塞程序。