微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 如果同时Notify两个char,连续Notify时会失败

如果同时Notify两个char,连续Notify时会失败

时间:10-02 整理:3721RD 点击:

我的代码如下,是写在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成功。

新手入门,望不吝赐教。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top