最近,我为一款名为" Boogie Board RIP"能够将它用作linux的输入设备。它可以通过USB连接到计算机。当提供的笔靠近或触摸设备的屏幕时,它将发送数据告知笔在屏幕上的位置。
基本上司机工作得很好。我可以写上它就像是一台wacom数位板。
在不可预测的时间,程序将挂在下面一行,我的电脑屏幕上的光标将保持不变
fread(packet, sizeof(char), BYTES, f);
其中:
/dev/usb/hiddev0
基本程序布局是一个while循环,一次读取一个字节。下面是一个更大的事情的模型:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char *path = argv[1];
unsigned char packet[8];
FILE *f = fopen(path, "rb");
int i;
while (1) {
fread(packet, sizeof(char), 8, f);
for(i=0;i<8;i++) {
printf("%x", packet[i]);
fflush(stdout);
}
}
}
我开始注意到我的司机会&#34;冻结&#34;更常见的是当我运行更多的东西,比如看youtube,播放音乐......这些都不是很好的例子。基本上我开始怀疑它与CPU利用率有关。所以我写了下面的程序来测试它:
#include <stdio.h>
int main() {
while(1) {
printf("a");
fflush(stdout);
fflush(stdout);
fflush(stdout);
fflush(stdout);
fflush(stdout);
fflush(stdout);
fflush(stdout);
}
}
运行此&#34;无限循环&#34;在另一个终端上运行上面的另一个程序时,在一个单独的终端中编程将导致严重的更频繁的冻结。基本上程序将在2秒内在fread()行停止。
我了解到,当对fread()的调用没有获得任何数据时,我仍然可以使用该程序的另一个实例从设备中读取数据,或者只是通过sudo cat /dev/usb/hiddev0
打印出文件的内容。原始进程仍然卡住,而新程序将吐出来自设备的数据。
好像文件只是关闭了。但这没有任何意义,因为在下次阅读时,fread会出现段错误。寻找任何想法。