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
、出力として出力されます。出力する値を保存しないという問題は何ですか。system
printf
0
value2
system()
上記のループの代わりに以下のコードを使用すると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);
どの方法を使用することをお勧めしますか? なんで?
前もって感謝します。