使用readstream将数据传递到数据包以进行传输

时间:2015-03-31 20:02:21

标签: tinyos

我使用readstream接口以100hz采样,我已经能够将接口集成到示波器应用程序中。我只是怀疑我将缓冲区值传递给要传输的数据包的方式。目前我正在这样做:

uint8_t i=0;

event void ReadStream.bufferDone(error_t result,uint16_t * buffer,uint16_t count)

 {
 if (reading < count  ) 
 i++;
 local.readings[reading++] = buffer[i];
 }

我已经定义了50的缓冲区大小,我不确定这是怎么做的,因为我注意到每个数据包只有一个样本,即使我已经设置了Nreadings = 2。 当我检查时,采样率似乎也不是100个样本/秒。我没有按照将数据传递给要传输的数据包的方式做正确的事。

1 个答案:

答案 0 :(得分:0)

我想我需要根据你的问题和意见澄清一些事情。

从micaZ微粒上的加速度计读取单个样品的工作原理如下:

  1. 打开加速度计。
  2. 等待17毫秒。根据ADXL202E(加速度计)数据表,启动时间为16.3 ms。这是因为该特定硬件能够在通电之后不立即提供第一次读取,但是具有一些延迟。如果减少此延迟,您可能会得到错误的读数,但行为未定义,因此您有时可能获得正确的读数,或者结果可能取决于环境条件,例如环境温度。 将这个17毫秒的延迟更改为较低的值肯定是一个坏主意。
  3. 从模数转换器(ADC)读取值(在两个轴上),作为将加速度计的模拟输出电压转换为数字值(整数)的MCU组件。 ADC可以采样的速度与加速度计的参数无关:它是另一个硬件。
  4. 关闭加速度计。
  5. 当您在代码中调用Read.read()时会发生这种情况。您可以看到,您可以采样的最大频率是每17毫秒一次,即每秒58个样本。由于MCU的一些开销或定时器的不准确性,它可能甚至更小。当您通过在循环或每个固定间隔中调用Read.read()进行采样时,这是正确的,因为此调用本身持续不少于17毫秒(我的意思是命令和事件之间的延迟)。

    您可能想要做的是:

    1. 打开加速度计。
    2. 等17 ms。
    3. 执行一系列阅读。
    4. 关闭加速度计。
    5. 如果这样做,对于一组样本,您有一个17毫秒的延迟,而不是每个样本的延迟。重要的是,这些步骤与用于执行读数的界面无关。您可以在应用程序中多次调用Read.read(),但是,它不能与已为此加速度计实现的read命令的实现相同,因为现有实现负责打开和关闭加速度计,在读取每个样品之​​前等待17 ms。为方便起见,您可以实现ReadStream界面,并在应用程序中调用一次。

      此外,您写道ReadStream使用的是微秒定时器,并且独立于ADC的17 ms建立时间。那句话是完全错误的。首先,您不能说接口使用或不使用计时器。界面只是一组没有定义的命令和事件。接口的特定实现可以使用定时器。 ReadReadStream接口可以通过各种硬件组件在不同平台上多次实现,例如加速度计,温度计,湿度计,磁力计等。其次,17 ms的建立时间是指加速度计,而不是ADC。无论您使用哪个接口ReadReadStream,以及驱动程序使用哪个定时器,毫秒或微秒,在加速度计上电后始终需要17毫秒的延迟。正如我所提到的,您可能希望每次多次读取时延迟一次,而不是每次读取一次。

      似乎TinyOS源代码已经包含加速计驱动程序的实现,提供ReadStream接口,允许您连续采样。查看AccelXStreamCAccelYStreamC组件(在 tos / sensorboards / mts300 / 中)。

      ReadStream接口由两个命令组成。调用postBuffer(val_t *buf, uint16_t count)为样本提供缓冲区。在加速度计驱动程序中,val_t定义为uint16_t。您可以逐个发布多个缓冲区。此命令尚未开始采样和填充缓冲区。为此,有一个read(uint32_t usPeriod)命令,指示设备通过以指定的时间(以微秒为单位)采样来开始填充缓冲区。当缓冲区已满时,您将获得一个事件bufferDone(error_t result, val_t *buf, uint16_t count),并且组件开始填充下一个缓冲区(如果有)。如果没有剩余缓冲区,您还会收到一个事件readDone(error_t result, uint32_t usActualPeriod),它会向您的应用程序传递一个参数usActualPeriod,该参数表示实际的采样周期,并且可能与您的某个时段不同(特别是更高)由于某些硬件限制而在调用read时请求。

      因此解决方案是使用ReadStreamAccelXStreamC提供的AccelYStreamC接口(或者使用它们的某些更高级别的组件)并将预期的时间段(以微秒为单位)传递给read命令。如果实际周期低于您预期的时间,则意味着由于硬件限制或者未在ADC驱动程序中实现,因此无法以更高的速率进行采样。在第二种情况下,您可能会尝试修复驱动程序,尽管它需要很好的低级编程知识。此平台的ADC驱动程序源代码位于 tos / chips / atm128 / adc