如果我不打印char数组,函数返回错误的值

时间:2013-10-24 23:34:26

标签: c beagleboneblack

我有一个非常奇怪的情况。我有两个函数用于读取Beagle Bone Black的模拟输入值。第一个函数打开文件并读取引脚值,并且应该将它返回到另一个函数,该函数将该值与另一个引脚的值进行比较。只有当我打印我用来连接引脚号和文件路径的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)将打印正确的阈值。该“阈值”是两个光敏电阻值的百分比差异。它们都获得等量的光,阈值通常在5%之内。仅当我在float AIN_value(char AIN)中打印BUFFER时,阈值才是正确的输出。当printf被注释掉时,bool pins_within_threshold(photores *data)正在打印引脚不在阈值范围内,并且一个引脚根本没有读数。我认为这是一个“坏”的价值。

编辑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聊天一段时间后,显然存在文件读取同步问题,因为操作系统拥有该文件并且文件处于不断变化的状态。出于某种原因,一个简单的`printf('\ n');解决了这个问题。不是一个完整的修复,想要更好地理解为什么会发生这种情况以及我如何避免它。

2 个答案:

答案 0 :(得分:1)

你正在使用atoi:

value = atoi(line);

将char *行转换为int(即“value”存储为整数)。但是您将“值”定义为“浮点数”,并且您打算将其作为“浮点数”返回。使用“atoi”将其转换为int将使您截断值(例如,一旦读取了非数字字符,atoi()将停止从str读取。)。 您应该使用atof()代替 - 即将上面的行转换为 -

value = atof(line);

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

描述: atoi()函数将str转换为整数,并返回该整数。 str应该以某种数字开头,并且一旦读取了非数字字符,atoi()将停止从str读取。

实施例: i = atoi(“512.035”);

结果:我设置为512.

答案 1 :(得分:0)

读取AIN值会导致ADC触发另一次转换。因此,printf的延迟是良好价值的原因。用usleep替换printf(1000)。 这里有一个内核补丁可能会有所帮助: http://beagleboard-gsoc13.blogspot.ca/2013/07/sampling-analogue-signals-using-adc-on.html

相关问题