![](/img/trans.png)
[英]Threads and fork: fgetc() blocks when reading from popen()-pipe
[英]reading linux sysfs for gpio with fgetc
我編寫了一個簡單的程序使用linux sysfs讀取gpio,但沒有輪詢,但是似乎當我想讀取少於三個字符的fgetc且fgets無法正常工作時,我想知道這是否只是一個錯誤,還是我在代碼中做了錯題。
FILE* fd = fopen("/sys/class/gpio/gpio12/value", "rw+");
if(!fd) {
cerr << "could not open the file." << endl;
}
setbuf(fd, NULL);
while(true) {
if(fseek(fd, 0L, SEEK_SET)) {
cerr << "could not reposition the indicator" << endl;
}
char val = fgetc(fd);
cout << val << '\r';
cout.flush();
};
即使我向gpio#12施加了高電平電壓,上述代碼也始終返回“ 0”,但是當我替換fgetc時,其代碼如下
char str[3] = {0};
fgets(str, 3, fd);
cout << str[0] << 'r';
行程序可以正常工作。 另一方面,值文件僅包含一個字符“ 1”或“ 0”,並且可能會考慮使用具有2個或1個字符的fget。 在這種情況下,它也不起作用。 可以請一位專業人士解釋那里發生了什么。 上面的代碼有什么問題。 我使用g ++編譯代碼,我的gcc版本是4.6.3-14 armhf
您可以使用/ bin / cat來顯示/ sys / class / gpio / gpioXX / value文件的內容。 文件的內容將是ASCII字符“ 0”或ASCII字符“ 1”,后跟換行符“ \\ n”。
我認為您可以直接獲取文件中的第零個字節,看看它是ASCII'0'(0x30)字符還是ASCII'1'字符(0x31)。 在這種情況下,緩沖的I / O沒有任何意義。
int fd;
char val;
int ret;
if ((ret = open("/sys/class/gpio/gpio12/value", O_RDONLY)) < 0) {
// Fail.
return;
}
fd = ret;
for (;;) {
if ((ret = lseek(fd, 0, SEEK_SET)) < 0) {
// Fail.
break;
}
if ((ret = read(fd, &val, 1)) < 0) {
// Fail.
break;
}
if ((val != 0x30) && (val != 0x31)) {
// Whiskey tango foxtrot.
}
val = val - 0x30;
fprintf(stdout, "val=%d\n", val);
fflush(stdout);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.