2

我有一个运行 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");

接下来我需要做什么?

4

5 回答 5

3

如果你想读一个字符,试试这个:

int value = fgetc(fp);
/* error checking */
value = value - '0';
于 2012-07-06T17:23:46.507 回答
2

尝试打开文件后,您检查是否fopen()成功。

然后您可以使用任何stdio函数来读取数据:

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

可能还有其他人。例如,您可能正在查看scanf()家庭,但很可能不会使用它们。哪个最合适取决于读取的数据;是文本还是二进制。如果是单个字符,则getc(); 如果它是文本和面向行的,也许fgets();如果是二进制,可能fread().

于 2012-07-06T17:24:29.680 回答
2

您可以读取一个字节,或者直到 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]。

于 2012-07-06T17:25:18.443 回答
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);
于 2012-07-06T17:37:39.653 回答
-1

我认为如果你使用它会更好:

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

之后很容易你可以从中temp.txt提取01

于 2014-11-18T18:31:33.397 回答