使用Arduino/C++从SD卡上的文件中读取浮点值
Read a float from a file on an SD card using Arduino/C++
我在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 非常相似
相关文章:
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量