Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环速度和节奏传感器';s BLE Gatt特征数据解析与操作_C#_Bluetooth Lowenergy_Gatt - Fatal编程技术网

C# 循环速度和节奏传感器';s BLE Gatt特征数据解析与操作

C# 循环速度和节奏传感器';s BLE Gatt特征数据解析与操作,c#,bluetooth-lowenergy,gatt,C#,Bluetooth Lowenergy,Gatt,我们已经确定了车轮和曲轴传感器Gatt特性测量数据,这些数据是根据下面链接中的拆分在我们的应用程序中获得的。 “” 比如说我们试过, 十六进制数据:0x03 6D010000 FC7E 2C01 F87E Flag-03->0000 0011->8位,因此两者都为真,因此我们可以得到车轮和曲柄各自的值 累积车轮转数-6D 01 00->32位,因此将蓝牙值反转为小端,即00 00 01 6D,并将其转换为十进制,我们得到-365 最后一轮事件时间-FC 7E->16位,因此将蓝牙值反转为小端字节

我们已经确定了车轮和曲轴传感器Gatt特性测量数据,这些数据是根据下面链接中的拆分在我们的应用程序中获得的。 “”

比如说我们试过,

十六进制数据:0x03 6D010000 FC7E 2C01 F87E

Flag-03->0000 0011->8位,因此两者都为真,因此我们可以得到车轮和曲柄各自的值

累积车轮转数-6D 01 00->32位,因此将蓝牙值反转为小端,即00 00 01 6D,并将其转换为十进制,我们得到-365

最后一轮事件时间-FC 7E->16位,因此将蓝牙值反转为小端字节,即7E FC,并将其转换为十进制,我们得到-32508

累积盘车转数-2C 01->16位,因此将蓝牙值反转为小端,即01 2C,并将其转换为十进制,我们得到-300

上次启动事件时间-F8 7E->16位,因此将蓝牙值以小端字节反转,即7E F8,并将其转换为十进制,我们得到-32504


在这里,我们在应用中仅使用了车轮和曲柄转速值,因此我们面临一个问题,即即使在停止循环后,曲柄或车轮的最后一个值仍在重复,并且该值从上一个事件值继续,有时该值非常高且异常。在这里,我怀疑最后一个车轮和曲柄事件时间将起主要作用。但我不确定这些时间字节背后的功能和用途。主轮和曲柄值的单位较少,因此我们不知道必须进行哪种类型的转换。我们如何获得正确的实时值来计算循环运动时的转速和速度。我们应该如何在C#编码中使用最后一个事件时间?我们如何将时间事件纳入我们的逻辑?请指导我们完成这个解析过程。我使用的设备是SunDing515自行车速度和节奏传感器,具有蓝牙低能量功能strong text

我正在为
BLE
装置开发一个应用程序,用于传输
GATT
CSC
测量值。我下面描述的不是C#或Java特定的概念,而是通用的

  • 如你所说,车轮和曲柄的转数读数小于单位。这是因为这是一个简单的革命计数。传感器通常固定在叉子或车轴上,而车轮或轮辐上有一个相对旋转的简单磁铁位,每次磁铁通过检测器时,传感器都会计数。对于我的设备,累积转数按预期单调增加
  • 乍一看,事件时间数据可能不稳定。但是,当您仔细查看
    csc_measurement.xml
    文件时,您可以看到单位为1/1024秒。所以你必须除以你提到的值(32508和32504)才能得到纯二次读数。然而,由于该读数作为UInt16传输,这也意味着该变量每64秒溢出一次。我不知道为什么关贸总协定的特点是这样设计的,他们可以在这里使用UInt32(或UInt24),就像车轮旋转一样,但这就是我们所拥有的
  • 因此,您的任务是根据这些数据计算瞬时节奏值。当你也考虑到有时车手可能以每分钟20-30次曲柄旋转的速度踏板时,很明显我需要的不仅仅是几秒钟的样本数据来计算一个具有可接受精度的步频

  • 设备每秒可能发送多次读数。您需要处理上次事件时间和/或转数保持不变的情况。你可以丢弃该数据包,或者如果它表示训练暂停事件,甚至可以扣除
  • 我正在把读数排成后进先出的队列。这将提供一个动态长度滑动窗口,用于计算显示节奏
  • 在此期间,我设置了一个30秒的常数,这将是滑动窗口的时间大小
  • 每次读取时,我都会查看队列中的读数是否超过30秒,如果是这样,我会删除最早的读数
  • 必须处理事件时间值溢出的情况,该情况将每64秒发生一次。当我计算cadence读数时,这只是一个简单的检查:如果最新读数的时间值小于最早读数的时间值,那么我会临时将最新读数偏移64秒。我还必须提到,如果滑动窗口时间超过64秒,这个简单的逻辑将不起作用,因为这样计时器可能会多次溢出
  • 未规定是否在两次训练之间保留累积转数。到目前为止,我所看到的是没有,但我正在处理室内自行车,很容易在训练中听到第一个读数,并以此作为补偿
  • 如果幸运的话,您的设备可以通过1826 GATT服务的2AD2“室内自行车数据”GATT特性提供瞬时或平均步频读数。在这种情况下,你可以从这些恶作剧中解脱出来

  • 尽管如此,如果您的设备仍然为事件时间提供不稳定的数据:请仔细检查1024除法和溢出逻辑以及滑动窗口。你仍然有最后的办法回到你自己测量的时间戳,但在我的情况下,结果适得其反:当手机在训练期间进入锁定模式,然后再次解锁时,所有的测量数据立刻涌入应用程序,导致我的时间戳无效,我的计算变得异常。因此,如果可能的话,尽量保持设备的读数。

    有没有在santosh解决过这个问题?看到相似的东西了吗