2

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;
}

上記のコードはポートを継続的に読み取ります (0デフォルト)。ただし、ポートを as に変更すると、正しい値の出力を呼び出しますが1、出力として出力されます。出力する値を保存しないという問題は何ですか。systemprintf0value2system()

上記のループの代わりに以下のコードを使用するとwhile、ファイルを開くことに関するエラーが発生しvalueます (値ファイルを開けません)。fopen行をループの外に置くwhileと、ファイルの変更が表示されませんvalue

char buffer[10];
while(1){
    if ((fp = fopen("/sys/class/gpio/gpio139/value", "rb")) == NULL){
            printf("Cannot open value file.\n");
            exit(1);
        }
    fread(buffer, sizeof(char), sizeof(buffer)-1, fp);
    int value = atoi(buffer);
    printf("value: %d\n", value);

    }

私の質問: コードを修正するにはどうすればよいですか? またはどのようにvalueファイルを読むべきですか?私が疑問に思っている追加情報として:たとえば、ポートをエクスポートすることの違いは何ですか?system("echo 139 > /sys/class/gpio/export")また、fp = fopen("/sys/class/gpio/export","w"); fprintf(fp,"%d",139);どの方法を使用することをお勧めしますか? なんで?

前もって感謝します。

4

2 に答える 2

3

このsystem()関数は、0の戻り値を返します。これは、期待していたものである、catからの標準出力を返しません。cat

コードの2番目のビットの問題は、呼び出していないことだと思いますfclose()。タイトなループで実行しているため、開いているファイルの数をほぼ即座に超えてしまいます。

だから、電話fclose()して、そこにも入れることを考えてsleep()ください。

于 2012-07-07T14:41:19.017 に答える
1

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_SET からの 0 バイトのオフセットを使用して、ファイルで呼び出します。

fseek(theFile, 0, SEEK_SET); 
于 2012-07-07T15:22:17.113 に答える