Программирование на C -> задержка действия - PullRequest
0 голосов
/ 22 ноября 2018

Я не очень знаком с кодом 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 нажата (0), если она равна 9 (или что-то, что будет около одной секунды во время выполнения), сценарий должен отключить распи.Если кнопка больше не нажата, задержка должна быть установлена ​​на ноль.Это то, что никогда не работало.Мне удалось отложить отключение, но отсчет продолжался несколько дней.

Спасибо за вашу помощь.

...