簡體   English   中英

使用fgetc為gpio閱讀linux sysfs

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM