【问题标题】:Reading binary data with diffrent data types读取不同数据类型的二进制数据
【发布时间】: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


【解决方案1】:

您尝试通过修改数据格式来一致地捕获高速样本时,您可能正在为这些小事大汗淋漓。该问题几乎可以肯定与 SD 卡中的块延迟有关(跨越闪存页面或扇区边界时写入需要额外的时间)。

您可能需要结合使用多种方法:

  • 使用 RTOS,在高优先级任务中执行采样,并将日志记录推迟到低优先级任务中
  • 将样本发送到足够长的队列中的日志记录任务,以涵盖最大 SD 延迟期间采集的样本数量。
  • 仔细选择你的SD卡;特别是如果使用 SPI 而不是 SDIO 接口。我发现卡的持续写入速度在每秒 32k 到 800k 字节之间,并且块延迟超过 400ms。

How can I use an SD card for logging 16-bit data at 48 ksamples/s?

【讨论】:

  • 一个非常周到、全面的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2022-01-14
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多