【发布时间】:2017-06-15 19:36:34
【问题描述】:
我正在制作一个数据记录器项目。在我的数据记录器中,我有 5 个传感器,例如:温度、湿度、加速度计、光和气压计。 在这里,我将数据以二进制格式存储到 SD 卡中。我将加速度计 @3200HZ 和所有其他传感器存储在 1HZ。
在编写时,我会在每个传感器测量值中添加一个特殊字符,例如 $,&,以便在读取时识别数据。我没有为加速度计数据添加任何 spl 字符。加速度计数据是 3200HZ 的海量数据,所以我没有添加 spl 字符,因为它会消耗一些内存,而且在写入时会产生延迟,导致错过一些样本,并且对于 3200HZ 只能达到 2600HZ。
我的阅读数据代码如下:
while((nr = fgetc(logFile)) != EOF)
{
if (nr == '$')
{ // read temp data if nr = $
fread(&temp_read,sizeof(float),1,logFile);
pc.printf("\r\n %f",temp_read);
}
if (nr == '&')
{ // read humidity data if nr = &
fread(&Humidity_read,sizeof(float),1,logFile);
pc.printf("\r\n %f",Humidity_read);
}
else
{ // if nr is not a spl character
data1 = nr;// send nr to a variable.
nr = fgetc(logFile);// read next byte and save it in nr
data2 = nr;// send nr to another variable
int16_t temp = (data1 | (data2 << 8));// club both bytes to form int16_t data
pc.printf("\r\n %i",temp);// print the one axis
}
}
很遗憾,这个程序给出了错误的数据。有很大的不同。有没有其他方法可以解决这个问题。我在哪里犯错误。提前谢谢你。
【问题讨论】:
-
你知道,这些 special 字符并不是真的特别是用二进制表示的吗?如果你想读取二进制数据,首先要读取像
fgetc这样的面向文本的函数。接下来想一个方法来正确地划分你的数据。提示:固定宽度/字节填充/文本编码。 -
我的第一个问题是:您确定 SPI 正在正确读取和写入 SD 卡吗?您是否尝试过以非常低的速度读取和写入虚拟数据以确保其正常工作?
-
首先:请缩进你的代码。
-
请出示打开文件的代码:(
logfile = fopen(...);)。 -
上面的尤金是正确的。如果您使用二进制写入加速度计数据,您将向 SD 写入所有类型的字符,包括 $s 和 &s。然后,当您读回这些数据时,您就不能再分离事物了。使用加速度计数据位,如果 16 个绰绰有余,可能会有所帮助。
标签: c++ c embedded microcontroller sd-card