所以我使用poll()
来读取几个gpio引脚。然后,我将先前读取的值与新读取的值进行比较,看看它们是否已更改。读取值的工作正常。我的问题似乎在循环中。这可以从输出看出,它看起来像buffers
在循环开始时被重置。为什么会这样?
注意:如果有人想知道为什么我不仅仅使用poll()
作为延迟为-1
的中断,那是因为硬件问题使它不受支持。
static const int num_buttons = 2;
void *routine(){
struct pollfd pfd[num_buttons];
int fds[num_buttons];
const char gpioValLocations[num_buttons][256];
int i;
for (i = 0; i < num_buttons ; i++){
sprintf(gpioValLocations[i], "/sys/class/gpio/gpio%d/value", gpios[i]);
}
char buffers[num_buttons][2];
char prev_buffers[num_buttons][2];
for (i = 0; i < num_buttons; i++){
if ((fds[i]= open(gpioValLocations[i],O_RDONLY)) < 0) {
LOGD("failed on 1st open");
exit(1);
}
pfd[i].fd = fds[i];
pfd[i].events = POLLIN;
lseek(fds[i], 0, SEEK_SET);
read(fds[i], buffers[i], sizeof buffers[i]);
}
for (;;) {
LOGD("at top: prev:%d%d buff:%d%d", atoi(prev_buffers[0]), atoi(prev_buffers[1]), atoi(buffers[0]), atoi(buffers[1]));
poll(pfd, num_buttons, 1);
for (i = 0; i < num_buttons; i++) {
if ((pfd[i].revents & POLLIN)) {
/* copy current values to compare to next to detected change */
strcpy(prev_buffers[i], buffers[i]);
LOGD("in loop: prev:%d%d buff:%d%d",
atoi(prev_buffers[0]), atoi(prev_buffers[1]),
atoi(buffers[0]), atoi(buffers[1]));
/* read new values */
lseek(fds[i], 0, SEEK_SET);
read(fds[i], buffers[i], sizeof buffers[i]);
/* compare new to previous */
if (atoi(prev_buffers[i]) != atoi(buffers[i])) {
// LOGD("change detected");
}
}
}
}
}
at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00
at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00
答案 0 :(得分:0)
这条线似乎有风险:
strcpy(prev_buffers[i], buffers[i]);
prev_buffers[i]
只有2个字节长。如果buffers[i]
包含多个字符,则会出现缓冲区溢出并调用未定义的行为。
此外,您必须初始化buffers
,它们当前以随机垃圾开始,而不是单字节字符串:使用strcpy
保存之前的值会调用未定义的行为。使用memcpy()
来保存以前的内容风险较小,因为它只复制2个字节,而不是扫描缓冲区以寻找空终止符,可能在读取buffers[i]
结束时以及何时读取未定义的行为写在prev_buffers[i]
的结尾。
您确定read(fds[i], buffers[i], sizeof buffers[i]);
读取ASCII数字和空终止符吗?如果没有,则代码不正确。
发布一个完整的编译功能,可能会有更多问题。