私は非常に奇妙な状況にあります。Beagle Bone Black のアナログ入力の値を読み取るために使用している関数が 2 つあります。最初の関数はファイルを開き、ピンの値を読み取り、その値を別のピンの値と比較している別の関数に返す必要があります。BUFFER
ピン番号とファイルパスを連結するために使用しているを印刷する場合にのみ、すべてが正常に機能します。行をコメントアウトするとすぐに、悪い値が得られます。単純に印刷するか印刷しないかで、BUFFER
これがどのように発生するのでしょうか?
float AIN_value(char AIN) {
float value;
char line[10] = {0};
char BUFFER[150];
sprintf(BUFFER, "%s%c", AIN_FILE, AIN);
FILE *fp;
//printf("%s\n", BUFFER);
fp = fopen(BUFFER, "r");
if (! is_open(fp)) {
printf("ERROR: could not open %s\n", BUFFER);
exit(1);
}
fgets(line, sizeof(line), fp);
value = atoi(line);
fclose(fp);
//printf("%d\n", value);
return(value);
}
bool pins_within_threshold(photores *data) {
float P0_value = AIN_value(data->AP_0);
float P1_value = AIN_value(data->AP_1);
float highest_pin_value;
float lowest_pin_value;
if (P0_value > P1_value) {
highest_pin_value = P0_value;
lowest_pin_value = P1_value;
}
else if (P1_value > P0_value) {
highest_pin_value = P1_value;
lowest_pin_value = P0_value;
}
else if (P0_value == P1_value){
return(true);
}
float numerator = highest_pin_value - lowest_pin_value;
float denominator = (highest_pin_value + lowest_pin_value) / 2;
float quotient = numerator/denominator;
float threshold = quotient * 100;
printf("P0_value: %f\n", P0_value);
printf("P1_value: %f\n", P1_value);
printf("Threshold: %f%%\n", threshold);
if (threshold <= data->move_threshold) {
return(true);
}
else if (threshold > data->move_threshold) {
return(false);
}`enter code here`
else {
return(true);
}
}
編集:「良い」値とはbool pins_within_threshold(photores *data)
、正しいしきい値を出力することを意味します。この「しきい値」は、2 つのフォトレジスタの値の差のパーセントです。どちらも同じ量の光を得ており、しきい値は通常 5% 以内の差になります。で BUFFER を印刷した場合にのみ、しきい値が正しい出力になりますfloat AIN_value(char AIN)
。printf がコメントアウトされている場合 bool pins_within_threshold(photores *data)
、ピンがしきい値内になく、1 つのピンがまったく読み取られないことが出力されます。これは「悪い」値だと思います。
EDIT 2:コメントアウト後の出力は次のsnprintf(BUFFER, sizeof(BUFFER), "%s%c", AIN_FILE, AIN)
とおりです。
AIN5: 1696
AIN6: 0
Threshold: 200.000000%
印刷した場合の出力は次のとおりです。
AIN5: 1366
AIN6: 1379
Threshold: 0.947522%
編集 3: chux としばらくチャットした後、OS がファイルを所有し、ファイルが常に変更されているため、ファイルの読み取り同期の問題があることは明らかです。何らかの理由で、単純な `printf('\n'); 問題を修正します。完全な修正ではありません。これが発生する理由と回避方法について理解を深めてください。