0

私は非常に奇妙な状況にあります。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'); 問題を修正します。完全な修正ではありません。これが発生する理由と回避方法について理解を深めてください。

4

2 に答える 2

1

次の行でatoiを使用しています:

value = atoi(line);

これにより、char* 行が int に変換されます (つまり、「値」は整数として格納されます)。しかし、「値」を「float」として定義し、それを「float」として返すつもりです。「atoi」を使用して int に変換すると、値が切り捨てられます (たとえば、atoi() は、数値以外の文字が読み取られるとすぐに str からの読み取りを停止します)。代わりに atof() を使用する必要があります-つまり、上記の行を次のように変換します-

値 = atof(行);

#include <stdlib.h>
int atoi( const char *str ); 

説明: atoi() 関数は、str を整数に変換し、その整数を返します。str は何らかの数字で開始する必要があり、atoi() は数値以外の文字が読み取られるとすぐに str からの読み取りを停止します。

例: i = atoi( "512.035" );

結果: 512 に設定します。

于 2013-10-24T23:45:31.183 に答える