我不是很熟悉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。如果不再按下该按钮,则延迟必须重新设置为零。这是从来没有奏效的。我设法延迟关闭,但延迟却持续了数天。
感谢您的帮助。