我有一个运行 ubuntu 12.04 的嵌入式板 (beagleboard-xm),如果它是逻辑 1 或 0,我想读取一个 GPIO 输入。如何cat /sys/class/gpio/gpio139/value
在 C 中实现?(值文件存储 0 或 1)
我通过以下方式打开文件:
FILE *fp;
fp = fopen("/sys/class/gpio/gpio139/value", "rb");
接下来我需要做什么?
如果你想读一个字符,试试这个:
int value = fgetc(fp);
/* error checking */
value = value - '0';
尝试打开文件后,您检查是否fopen()
成功。
然后您可以使用任何stdio
函数来读取数据:
getc()
fgetc()
fgets()
fread()
可能还有其他人。例如,您可能正在查看scanf()
家庭,但很可能不会使用它们。哪个最合适取决于读取的数据;是文本还是二进制。如果是单个字符,则getc()
; 如果它是文本和面向行的,也许fgets()
;如果是二进制,可能fread()
.
您可以读取一个字节,或者直到 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 可以在该字符串上操作以检索十进制数。
如果需要的是二进制值,则不需要进行这种转换,无需调整即可读取整个缓冲区,避免将最后一个加一个字节设置为零,只需从缓冲区返回一个强制转换值;如果只需要一个字节,则为 buffer[0]。
如果您可以访问您的 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