读取C中的端口(GPIO)值(beagleboard xm)

读取C中的端口(GPIO)值(beagleboard xm),c,beagleboard,gpio,C,Beagleboard,Gpio,我有一个运行ubuntu 12.04的嵌入式beagleboard xm板。我需要连续读取GPIO以查看端口值是否发生变化。我的代码如下: #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> FILE *fp; int main(void) { //linux equivalent code "echo 139 > expor

我有一个运行ubuntu 12.04的嵌入式beagleboard xm板。我需要连续读取GPIO以查看端口值是否发生变化。我的代码如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

FILE *fp;

int main(void)
{
    //linux equivalent code "echo 139 > export" to export the port
    if ((fp = fopen("/sys/class/gpio/export", "w")) == NULL){
            printf("Cannot open export file.\n");
            exit(1);
        }
        fprintf( fp, "%d", 139 );
        fclose(fp);
      //  linux equivalent code "echo low > direction" to set the port as an input 
        if ((fp = fopen("/sys/class/gpio/gpio139/direction", "rb+")) == NULL){
            printf("Cannot open direction file.\n");
            exit(1);
        }
        fprintf(fp, "low");
        fclose(fp);

       // **here comes where I have the problem, reading the value**
        int value2;
        while(1){
        value2= system("cat /sys/class/gpio/gpio139/value");
        printf("value is: %d\n", value2);
        }
    return 0;
}
我的问题:我需要如何修复代码?或者我应该如何读取值文件? 作为我想知道的另一个信息:例如,通过systemecho 139>/sys/class/gpio/export和fp=fopen/sys/class/gpio/export导出端口有什么区别,w;fprintffp,%d,139;你建议我用哪种方法?为什么?

提前感谢。

系统函数返回cat的返回值,即0。它不会返回cat的标准输出,这正是您所期望的

我认为你的第二段代码的问题在于你没有调用fclose。由于您在一个紧密的循环中运行,因此您几乎立即超过了允许打开的文件数

因此,调用fclose,并考虑在其中设置睡眠。

系统函数返回cat的返回值,即0。它不会返回cat的标准输出,这正是您所期望的

我认为你的第二段代码的问题在于你没有调用fclose。由于您在一个紧密的循环中运行,因此您几乎立即超过了允许打开的文件数


所以,打电话给fclose,考虑在那里也放一个睡眠时间。

在C中读取文件时,您在文件中的位置会随着您的读取而改变。例如,如果要打开包含以下内容的文件:

First Line
Second Line
Third Line
并运行此程序:

char buffer[1024];
while(fgets(buffer, sizeof(buffer), theFile))
{
    printf("Buffer: %s", buffer);
}
它将打印:

First Line
Second Line
Third Line
读取每一行时,文件中的位置将更改为下一行

在您的程序中,在第一次读取值后,您尝试读取文件中的空白,而不是您想要的值

问题的解决方案是将fopen移到while循环之外,但每次通过循环时都调用fseek将您的位置重置为文件的开头

要使用fseek,需要向其传递文件指针、字节偏移量和查找点。在这里,您在文件中调用它,与航路点SEEK_集的偏移量为0字节,表示文件的开始

fseek(theFile, 0, SEEK_SET); 

在用C语言读取文件时,您在文件中的位置会随着您的读取而改变。例如,如果要打开包含以下内容的文件:

First Line
Second Line
Third Line
并运行此程序:

char buffer[1024];
while(fgets(buffer, sizeof(buffer), theFile))
{
    printf("Buffer: %s", buffer);
}
它将打印:

First Line
Second Line
Third Line
读取每一行时,文件中的位置将更改为下一行

在您的程序中,在第一次读取值后,您尝试读取文件中的空白,而不是您想要的值

问题的解决方案是将fopen移到while循环之外,但每次通过循环时都调用fseek将您的位置重置为文件的开头

要使用fseek,需要向其传递文件指针、字节偏移量和查找点。在这里,您在文件中调用它,与航路点SEEK_集的偏移量为0字节,表示文件的开始

fseek(theFile, 0, SEEK_SET); 

调用system3非常昂贵-您的进程首先执行fork2,然后在子进程上执行/bin/sh来处理该命令。调用system3非常昂贵-您的进程首先执行fork2,然后在子进程上执行/bin/sh来处理该命令。您确定要像/sys中那样搜索伪文件的开头吗刷新内核将提供的内容?不确定,取决于它是如何实现的。您只需要尝试一下。您确定在/sys中查找伪文件的开头会刷新内核将提供的内容吗?不确定,这取决于它是如何实现的。你只要试试就行了。