C编程->延迟动作

时间:2018-11-22 08:42:34

标签: raspbian

我不是很熟悉c代码,因此在定制给定代码方面遇到一些问题。这是树莓派的关闭按钮代码。只要没有人按下按钮,GPIO就会保持高电平。一切正常,直到我添加了USV。由于已连接,因此GPIO的电平有时会很短的时间下降。因此,我尝试为关机操作设置一个延迟,但是它在我尝试过的几种方式中均无效。 这是脚本的相关部分;它不再工作了。按下的按钮不再被识别。

while(1) {
memset(rdbuf, 0x00, RDBUF_LEN);
lseek(fd, 0, SEEK_SET);
ret=poll(&pfd, 1, POLL_TIMEOUT);
if(ret<0) {
  logging(LOG_CRIT,"error polling interrupt - exiting");
  close(fd);
  exit(EXIT_FAILURE);
}
  if(ret==0) {
    continue;
  }
  ret=read(fd, rdbuf, RDBUF_LEN-1);
  /*Errorhandling*/
  if(ret<0) {
    logging(LOG_CRIT,"error reading gpio - exiting");
    exit(EXIT_FAILURE);
  } else {
    if (ret==0) {
      logging(LOG_INFO,"Got interrupt from shutdown key. Checking delay");
      if ( delay == 9 ) {
        logging(LOG_INFO,"got interrupts from shutdown key, shutting down now");
        system("shutdown -h now");
        exit(0);
      } else {
        /* oss << "got interrupt from shutdown key*/
        char buffer[1024];
        snprintf(buffer, sizeof(buffer), "Got interrupt from shutdown key, Counter not 10 (%i). Shutdown delayed...", delay);
        logging(LOG_INFO,buffer);
        delay++;
      }
    } else {
      logging(LOG_INFO,"No interrupts from shutdown key. Checking Delay.");
      if ( delay >= 1 ) {
        char buffer[1024];
        snprintf(buffer, sizeof(buffer), "Counter: %i Signal unterbrochen. Setze Counter zurück.", delay);
        logging(LOG_INFO,buffer);
        delay = 0;
      }
    }
  }
}

轮询和读取之间有什么区别? 我的想法是,只要按下GPIO(如果为9)(或在运行时大约一秒钟的时间),只要按下GPIO(0),脚本就应该关闭raspi。如果不再按下该按钮,则延迟必须重新设置为零。这是从来没有奏效的。我设法延迟关闭,但延迟却持续了数天。

感谢您的帮助。

0 个答案:

没有答案