我试图用我的Raspberry Pi 3B在~120Hz下采样TI CC2650STK传感器数据,并且当将信号迹线与有线MPU6050进行比较时,我看起来在结果信号中有~50ms的相移(在橙色图像是通过BLE接收的数据,蓝色是通过I2C通过另一个传感器(MPU6050)接收的数据:
传感器端的固件似乎没有任何大缓冲区:
(50 { ms } / 8 { ms / sample } = ~6 { samples }),其中每个样本长度为18字节 - > 6 * 18缓冲区大小需要我猜...)。
在RPi方面,我使用Bluez和Bluepy库,我再次看到没有可能导致延迟的缓冲区。出于测试目的,传感器位于我的pi旁边,所以OTA传输肯定不会花费40-50ms的时间?更重要的是,我处理传入通知的代码计时显示整个处理(我的高级代码+ bluepy库+ BLUEZ堆栈)花费不到1-2 ms 。
看到如此巨大的传播延迟是正常的,还是说我在代码中遗漏了什么?
答案 0 :(得分:1)
看起来对我合法。
BLE是时间戳。外围设备无法在任何时间发送,它必须等待下一个连接事件发送其有效负载。如果传感器数据更新后发生下一个连接事件,则发送的消息没有大的延迟。如果在连接事件发生后立即生成传感器数据,则外围设备堆栈必须等待完整的连接间隔以进行下一个连接事件。
连接间隔是一个时间量,在7.25 ms和4 s之间的1.25 ms的倍数,由连接的Master(您的Pi的HCI)在连接时设置。它可以由Master任意更新。 Slave可以请求修改Master中的参数,但是master可以做任何想做的事情(大多数Master实现尝试尊重Slave的约束)。
如果您测量的平均延迟为50毫秒,则可能使用的是100毫秒的连接间隔(由于链中的常量延迟,可能会少一点)。
Bluez包含一个hcitool lecup
命令行,可以更改给定连接的连接参数。