0

我有一个非常奇怪的情况。我有两个函数用于读取 Beagle Bone Black 的模拟输入值。第一个函数打开文件并读取引脚值,并应将其返回给另一个函数,该函数将该值与另一个引脚的值进行比较。BUFFER只有当我打印用于将 pin 号与文件路径连接起来的内容时,一切才能正常工作。一旦我注释掉这条线,我就会得到不好的价值观。怎么能简单地打印或不打印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% 的差异内。只有当我打印 BUFFER 时,阈值才是正确的输出float AIN_value(char AIN)。当 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'); 解决问题。不是一个完整的修复,希望更好地了解为什么会发生这种情况以及我如何避免它。

4

2 回答 2

1

您在该行中使用 atoi:

value = atoi(line);

这会将 char* 行转换为 int(即“值”存储为整数)。但是您将“值”定义为“浮点数”,并且打算将其返回为“浮点数”。使用 "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 回答
0

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

于 2013-11-01T08:10:22.607 回答