c++ - 读取不同数据类型的二进制数据

标签 c++ c embedded microcontroller sd-card

我正在做一个数据记录器项目。在我的数据记录器中,我有 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 
    }
}

不幸的是这个程序给出了错误的数据。有很大的不同。有没有其他方法可以解决这个问题。我在哪里犯错误。提前谢谢你。

最佳答案

您可能正在努力尝试通过修改数据格式来持续捕获高速样本。这个问题几乎可以肯定与 SD 卡中的 block 延迟有关(当闪存页面或扇区边界被跨越时写入需要额外的时间)。

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

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

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

关于c++ - 读取不同数据类型的二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939409/

相关文章:

C++ 结构定义

c++ - 如何使用 Qt 从磁盘读取 XML 文件?

mysql - snprintf 截断最后一个符号

c - 如何删除此 HEADER HTTP?

c++ - 将项目从QTreeWidget拖动到QGraphicsView

c++ - 使用太多字符串文字时,Visual Studio 2010 需要永远链接

带后缀增量运算符的 C 指针

c - STM32 ADC DMA。 MCU何时得知ADC结束?

c - void 表达式回调函数的使用无效

c - 强制执行 volatile 内存位置访问的正确顺序