我有一个非常奇怪的情况。我有两个函数用于读取 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'); 解决问题。不是一个完整的修复,希望更好地了解为什么会发生这种情况以及我如何避免它。