如果同时Notify两个char,连续Notify时会失败
我的代码如下,是写在simpleBLEPeripheral_ProcessEvent里的。
目的是用RecordBuf Notify16次数据,TransferCounter用于指示传到第几次数据了,也是Notfy的。
我发现,传到第9次,就会停在第一个断点。也就是说传到第9次,就会Notify失败。
如果把断点去掉,在LightBlue里看,就会发现第9次之后没能接收到RecordBuf和TransferCounter的数据。
如果把Line1和Line2中屏蔽掉任何一句,RecordBuf或TransferCounter就可以正确接收到16次了。
但是我希望两个都Notify。
请问我这样实现有什么问题吗?应该如何来实现?
谢谢!
读取速度慢一点试试
Hi Viki Shi,
非常感谢回复!
SBP_HISTORY_NOTIFY_EVT_PERIOD的值为1ms。我试了下,将它至少增大到6ms,传输就不会断了。
如果设置为1-5ms,ret返回值为MSG_BUFFER_NOT_AVAIL(0x04)。
我在BLEPeripheral_Init函数中有使用以下两句来使能overlapped processing:
"HCI_EXT_HaltDuringRfCmd(HCI_EXT_HALT_DURING_RF_DISABLE);
HCI_EXT_OverlappedProcessingCmd(HCI_EXT_ENABLE_OVERLAPPED_PROCESSING);"
请问,增大SBP_HISTORY_NOTIFY_EVT_PERIOD是解决这个问题的唯一办法吗?有没有可能从程序上保证传输不出现此问题?因为尽管现在PERIOD=6ms可行,但是我不知道会不会某一天运行几个小时候连接中断,或者当其他charisteristic也在notify的时候,连接中断。
另一方面,当PERIOD=6ms时,传输速率为1000/6*20B=3.33kB/s。我看TI论坛上有个TI的测试结果,CC2541最高速率大约3.8kB/s.所以,如果我将PERIOD固定为6ms,可能也浪费了带宽。
我尝试了将代码改为这样:
循环发送一直到发送成功。我用LightBlue试了一下,就目前的程序,这样是可以的,成功完整发送了,并且连接没有中断。但是我不知道这样是不是一个通常的解决方案,这样循环尝试发送是否有问题?会不会某次因为循环时间过长导致连接中断?请问,通常的解决方案是怎么样的?
谢谢!
Frank
您好!
想问一下您最后这个策略可行吗?
MSG_BUFFER_NOT_AVAIL的情况下,需要至少等到下一个连接事件把notify实际发送出去以后缓冲区才会有空闲吧,假设连接间隔是30ms,
那么如果定时器间隔是1ms,可能即使开启了HCI_EXT_ENABLE_OVERLAPPED_PROCESSING也不足以在两个连接间隔中间缓存30个notify(是不是有这个可能?我不太懂这个设置的意思)
那如果定时器的执行函数里while(ret!=success)条件成立,会卡死在这个循环里直到notify缓冲区有空闲,而定时器会1ms再次触发,有没有可能再次进入while循环?还是说OSAL是单线程模型?前一个timer的执行体没执行完成不会并行触发下一次?(把函数执行放入等待队列,那么这个队列是否会无限增长,还是说OSAL会直接放弃这次timer的触发?)
如果用if(ret!=success) return;这种写法是否可行?等待1ms之后定时器再次触发的时候再检查尝试是否可以GATT_Notification成功。
新手入门,望不吝赐教。