2012-07-06 74 views
1

我有一個運行ubuntu 12.04的嵌入式板(beagleboard-xm),如果它是邏輯1或0,我想要讀取一個GPIO輸入。 cat /sys/class/gpio/gpio139/value in C? (文件存儲0或1)
我打開的文件:如何在C中打開文件(fopen/fread)

FILE *fp; 
fp = fopen("/sys/class/gpio/gpio139/value", "rb"); 

什麼我下一步需要做什麼?

+0

您應該可以根據其值讀取一個字節和分支。這是不是記錄在某處? – Wug 2012-07-06 17:23:01

+0

只有用戶手冊,並沒有解釋任何東西 – johan 2012-07-06 17:23:47

回答

1

可以讀取一個字節,或直到EOF:

char buffer[32]; // Very long number! 

if (NULL == (fp = fopen(FILENAME, "rb"))) 
{ 
    // TODO: return a suitable error/perror 
    return -1; 
} 
bytesread = fread(buffer, sizeof(char), sizeof(buffer)-1, fp); 
fclose(fp); 
if (!bytesread) 
{ 
    // Nothing at all was read 
    // TODO: return error 
    return -2; 
} 
// This is in case you want the byte interpreted from ASCII 
// otherwise you'd just return buffer[0], or (*(DATATYPE *)buffer)[0]. 
buffer[bytesread] = 0x0; 
return atol(buffer); 

此代碼其實並不普遍,在很多硬件設備將實行封鎖數據通道 - 也就是說,如果你試圖瞭解更多數據比它在那裏,fread會阻塞,直到數據可用。在這種情況下,只需將緩衝區的大小設置爲所需的最大字節數加1即可。

fread中的加號1和相應的-1僅適用於您讀取的數據以ASCII格式呈現的情況,即「128」是三個ASCII字節「1」,「2」 ,「8」,甚至可能是回車,而不是二進制0x80。在這種情況下,緩衝區是零終止的,使它成爲一個C字符串,atol可以在其上運行以檢索十進制數字。

如果需要的是一個二進制值,那麼不需要這樣的轉換,並且可以在不進行調整的情況下讀取完整的緩衝區,避免將最後一個字節設置爲零,並且只從緩衝區返回一個轉換值;或者如果只需要一個字節,則緩衝區[0]。

3

如果你想讀一個字,試試這個:

int value = fgetc(fp); 
/* error checking */ 
value = value - '0'; 
1

試圖打開該文件後,你檢查fopen()成功。

然後你可以使用任何的stdio功能來讀取數據:

  • getc()
  • fgetc()
  • fgets()
  • fread()

,可能其他人也。例如,您可能正在查看scanf()家族,但很可能不會使用它們。哪一個最合適取決於讀取的數據;它是文本還是二進制文件?如果它是單個字符,則getc();如果是文本和麪向行的,可能是fgets();如果是二進制的,可能是fread()

1

如果您有權訪問您的Linux標頭,那麼我建議您使用Linux API訪問GPIO。

在文件中包含此:

#include <linux/gpio.h>

現在,您可以訪問的功能,如:

  • int gpio_is_valid(int number);
  • int gpio_get_value(unsigned gpio);
  • void gpio_set_value(unsigned gpio, int value);

你的情況,你可以這樣寫:

int io_ret = -1; 
if (gpio_is_valid(139)) 
    io_ret = gpio_get_value(139); 
-1

我認爲這將是更好,如果你使用:

system("echo /sys/class/gpio/gpio139/value >> temp.txt "); 

後,很容易你可以從temp.txt提取值將是01