使用Arduino/C++从SD卡上的文件中读取浮点值

Read a float from a file on an SD card using Arduino/C++

本文关键字:文件 读取 Arduino C++ SD 使用      更新时间:2023-10-16

我在Eclipse中使用Arduino。我想从配置文件中读取替身。我做了以下功能:

void Settings::readDouble(char buff, String data, bool flag, double dataToStore) {
    data = "";
    int intPart = 0;
    int probablyFloatPart = 0;
    while(buff != 'n') {
        if(isdigit(buff)) {
            data.concat(buff);
            Serial.println(data);
        }
        else if (buff == '.') {
            char charBuf[data.length()+1];
            data.toCharArray(charBuf,data.length()+1);
            // Convert chars to int
            intPart = atoi(charBuf);
            Serial.println(intPart);
            data="";
            flag = false;
        }
        buff = theSettings.read();
    };
    // Convert string to array of chars
    char charBuf[data.length()+1];
    data.toCharArray(charBuf,data.length()+1);
    // Convert chars to integer
    probablyFloatPart = atoi(charBuf);
    Serial.println(probablyFloatPart);
    if (!flag) {
        dataToStore = intPart + (probablyFloatPart/pow(10, data.length()));
    }
    else {
        dataToStore = probablyFloatPart;
    }
    flag = true;
    //Serial.println(dataToStore, 5);
}

在serial.printing中,我注意到如果我要读取的数字的int或decimal部分超过四位,就会出现错误。基本上,我不能将超过四个字节的字符串转换为int。我该怎么做?

您需要使用long来存储32767以上的值(或存储在无符号、65535以上的值中)。

我会带着一段更简单的代码回来——我认为你的代码比它需要的更复杂

除了isdigit之外,此代码不使用任何标准函数,只是遍历数字。数字的大小没有限制(很明显,如果你超过了double的限制,那么它就会失败)。错误处理可能需要一些改进。我给它做了一些温和的测试。。。

double str_to_double(const char *data, size_t len)
{
    double d = 0.0;
    bool neg = false;
    int index = 0;
    if (data[index] == '-')
    {
    index++;
    neg = true;
    }
    while(data[index] != '.' && index < len)
    {
    if (isdigit(data[index]))
    {
        d = d * 10 + (data[index] - '0');
        index ++;
    }
    else 
    {
        // Handle "bad input" ... 
        return -1;
    }
    }
    if (data[index] == '.')
    {
    index ++;
    double div = 10.0;
    while(index < len)
    {
        if (isdigit(data[index]))
        {
        d += (data[index] - '0') / div;
        div *= 10;
        index++;
        }
        else
        {
        // Handle bad input
        return -1;
        }
    }
    }
    // Flip sign if need be. 
    if (neg)
    {
    d = -d;
    }
    return d;
}

我会尝试将结果保存在浮点中。下面的代码是我想要尝试的。

float result = 0;
float scale = 10;
bool pastDecPoint = false;
while(buff != 'n') {
    if(isdigit(buff){
          if(pastDecPoint) 
          {
             result = result + (buff / scale);
             scale = scale * 10;
           }
           else
           {
             result = (result * 10.0) + atoi(buff);
           } 
    } else if (buff == '.') {
        pastDecPoint = true;
    }
    buff = theSettings.read();
};
Serial.println(result);
}

我也想看看彼得森会带什么回来。这与Petersson 非常相似