2

ubuntu 12.04を実行する組み込みボード(beagleboard-xm)があります。ロジック1または0の場合、1つのGPIO入力を読み取りたいと思いますcat /sys/class/gpio/gpio139/value。Cで実装するにはどうすればよいですか?(ファイルは0または1を格納します)次の方法
でファイルを開きます。

FILE *fp;
fp = fopen("/sys/class/gpio/gpio139/value", "rb");

次に何をする必要がありますか?

4

5 に答える 5

3

1文字読みたい場合は、これを試してください:

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

ファイルを開こうとした後、fopen()成功したことを確認します。

次に、任意のstdio関数を使用してデータを読み取ることができます。

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

そしておそらく他の人も。たとえば、ファミリを見ているかもしれませんがscanf()、ほとんどの場合、ファミリを使用していないでしょう。どちらが最も適切かは、読み取られるデータによって異なります。それはテキストですか、それともバイナリですか。1 文字の場合はgetc(); テキストと行指向の場合は、おそらくfgets(); バイナリなら、おそらくfread()

于 2012-07-06T17:24:29.680 に答える
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 がブロックされます。このような場合は、バッファを必要な最大バイト数に 1 を加えたサイズにします。

プラス 1 とそれに対応する fread の -1 は、読み取ったデータが ASCII としてレンダリングされる場合にのみ存在します。つまり、「128」は 3 つの ASCII バイト「1」、「2」、「8」です。バイナリの 0x80 の代わりにキャリッジ リターンを使用することもできます。この場合、バッファーは、atol が操作して 10 進数を取得できる C 文字列にするためにゼロで終了します。

必要なものがバイナリ値である場合、そのような変換は必要なく、調整なしで完全なバッファーを読み取ることができ、最後のプラス 1 バイトをゼロに設定することを避け、バッファーからキャスト値を返すだけです。または、1 バイトだけが必要な場合は 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.txt01

于 2014-11-18T18:31:33.397 に答える