我有一個運行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");
什麼我下一步需要做什麼?
我有一個運行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");
什麼我下一步需要做什麼?
可以讀取一個字節,或直到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]。
如果你想讀一個字,試試這個:
int value = fgetc(fp);
/* error checking */
value = value - '0';
試圖打開該文件後,你檢查fopen()
成功。
然後你可以使用任何的stdio
功能來讀取數據:
getc()
fgetc()
fgets()
fread()
,可能其他人也。例如,您可能正在查看scanf()
家族,但很可能不會使用它們。哪一個最合適取決於讀取的數據;它是文本還是二進制文件?如果它是單個字符,則getc()
;如果是文本和麪向行的,可能是fgets()
;如果是二進制的,可能是fread()
。
如果您有權訪問您的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);
我認爲這將是更好,如果你使用:
system("echo /sys/class/gpio/gpio139/value >> temp.txt ");
後,很容易你可以從temp.txt
提取值將是0
或1
您應該可以根據其值讀取一個字節和分支。這是不是記錄在某處? – Wug 2012-07-06 17:23:01
只有用戶手冊,並沒有解釋任何東西 – johan 2012-07-06 17:23:47