我用LightBlue来接收我板子Notify出来的数据。
我程序是基于SimpleBLEPeripehral改的,这是我程序中的主要设置:
1.#define NOTIFY_EVT_PERIOD 1 // 1 ms 在ProcessEvent设置周期性任务为1ms
2.LightBlue默认设置连接间隔为30ms。
3. 打开 overlapped processing
HCI_EXT_HaltDuringRfCmd(HCI_EXT_HALT_DURING_RF_DISABLE);
HCI_EXT_OverlappedProcessingCmd(HCI_EXT_ENABLE_OVERLAPPED_PROCESSING);
当我设置Notify的Charicteristic为7个Byte长时,经过长时间多次测试,一直正常,没有丢帧现象。数据速率为为1.13kB/s。
我将Charisteristic增长,当我将Notify的Charicteristic为20个Byte长时,发现了大量丢帧的现象。
比如,发出515个帧,LightBLue只收到387个帧。我一开始怀疑是不是LIghtBLue有问题,但是我用PacketSniffer抓包发现,确实就只有387个帧。丢包率达到了25%。
请问为什么会丢包呢?如何解决呢?协议栈的BUG吗?
谢谢。
Frank
Yan:
Feng,
1ms间隔太短了。
iOS默认connection interval大概30ms不到,你每隔1ms 往下面发大量数据,肯定会丢包呀。
Feng Xu3:
回复 Yan:
Yan,
你好,
明白。但是,我起用了overlapped processing,希望在一个Connection Interval内尽量多发数据。据看到的资料说,一个Connection Interval内最多能发4-6个Packet。
那么在Connection Interval=30ms的情况下,如果我希望尽可能提高数据速率而又不丢包,应该设置Notify_Event的间隔为多少ms呢?
我怎样才知道,应该设置多大的发送间隔,才会不丢包?难道只能设置好了,测试一下吗?可是这也不能保证永远不丢包啊。
或者,TI的BLE1.4.0协议栈有什么样的机制可以保证不丢包?
十分感谢!
Feng
Yan:
回复 Feng Xu3:
Feng,
和iOS你就别想在一个connection event里面发多次了。。。
Feng Xu3:
回复 Yan:
Yan,
为什么啊?
我设置为7B的时候,就没有掉过包,并且我用PacketSniffer看过了,每个Connection Interval传了4-5个包。这不是一个Connection Interval里发了多次了吗?
而且,现在这和IOS没有关系啊,我用PacketSniffer抓包看过了,设备发出来的时候包就少了。
或者我这么问,如果我用安卓或者另外一块CC2541做主设备,接收从设备发来的Notification,运用怎样的机制才能保证不丢包呢?
Feng