我有一个运行ubuntu 12.04的嵌入式主板(beagleboard-xm),如果它是逻辑1或0,我想读取一个GPIO输入。如何在C中实现cat /sys/class/gpio/gpio139/value
? (值文件存储0或1)
我打开文件:
FILE *fp;
fp = fopen("/sys/class/gpio/gpio139/value", "rb");
接下来我需要做什么?
答案 0 :(得分:3)
如果您想阅读一个字符,请尝试以下方法:
int value = fgetc(fp);
/* error checking */
value = value - '0';
答案 1 :(得分:2)
尝试打开文件后,检查fopen()
是否成功。
然后您可以使用任何stdio
函数来读取数据:
getc()
fgetc()
fgets()
fread()
也可能是其他人。您可能正在查看scanf()
系列,但很可能不会使用它们,例如。哪种方式最合适取决于读取的数据;它是文本还是二进制文件。如果是单个字符,那么getc()
;如果它是文本和面向行的,可能是fgets()
;如果是二进制,可能是fread()
。
答案 2 :(得分: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将会阻塞直到数据可用。在这种情况下,只需将缓冲区的大小设置为您需要的最大字节数,再加上一个。
加号和fread中相应的-1仅适用于您读取的数据呈现为ASCII的情况,即“128”是三个ASCII字节“1”,“2”, “8”甚至可能是回车符,而不是二进制0x80。在这种情况下,缓冲区为零终止,使其成为一个C字符串,atol可以在其上运行以检索十进制数。
如果需要的是二进制值,则不需要这样的转换,并且可以在不进行调整的情况下读取完整缓冲区,避免将最后加一个字节设置为零,并且只从缓冲区返回一个转换值;如果只需要一个字节,则缓冲区[0]。
答案 3 :(得分: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);
答案 4 :(得分:-1)
我认为如果你使用它会更好:
system("echo /sys/class/gpio/gpio139/value >> temp.txt ");
之后很容易从temp.txt
中提取0
或1