关于CC2541的连接问题,求解惑。
本人以CC2541模块作为从设备,向主机手机段发送一段最少500多字节的数据,循环发送 一次发送15个,等到数据发送完毕之后,等待几秒从机端就会自动断开连接然后重新广播,百思不得其解。求解惑!谢谢。
Escher,
是否每次自动断开的时间都一样?
有没有可能存在没数据传,系统为了节省功耗,启动timer计时,自动断开的可能性?
Hi Yan,
好像每次的断开时间间隔都差不多,这个我没有细数去计时。在我没有数据传输的情况下 连接时正常保持的。我也没有启用睡眠等方式来节省功耗,也没有对定时器做过相关操作, 之前我在串口那边做了很多Flash读写操作 执行完毕后其也会断开连接重新广播,但是后来我认为是其连接间隔的问题,所以将其调大了点 之后这个问题解决了,但是现在这个情况与之前的问题是一样的,可是我不论怎么修改连接间隔参数 它同样会 断链重新广播。 代码如下:当我把sbpSerialAppSendNoti(bufrx+i,numBytes);注释掉之后 连接保持正常。
int SendData(uint32 DsADDR,uint32 DeADDR)
{
int i=0,CONT=0;
uint8 BBuf[15];
while(DsADDR<DeADDR)
{ SerialPrintString("-------->DATA:");
SpiByteRead(DsADDR,bufrx,256);
for(i=0;i<256;i++)
{
if((i)%15==0)
{
for(int k = i; k < i+15; k++)
SerialPrintValue32("",*(bufrx+k),16);
sbpSerialAppSendNoti(bufrx+i,numBytes);
}
}
SerialPrintString("\r\nSEND OK!\r\n");
DsADDR+=0x100;
}
return 0;
}
你就搜索GAPRole_TerminateConnection这个函数,看看到底是哪里调用了它。
关注!可能执行的任务很多?
Li Zongwu你好
我按照你的办法在GAPRole_TerminateConnection 函数下加了 一句串口打印,该函数在peripheral.C文件中有两处地方低啊用,可是没有一句相关的串口输出。
大秦正声
你好,我确实有在串口回调函数中做过较多操作 但是我的连接断开并不是超时导致的,因为它并没有提示超时。并且我是在做完所有操作之后 停留将近10秒然后 断开重新广播。
我能看到的就是
// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an
// incoming Signaling command up to an upper layer application.
这说明,你所描述的bug是TI的协议栈里bug,这个就无法解决啦。TI的弟兄们,赶紧的,BLE的4.1啥时候出来呀?
遇到同样的问题,多次连接后,发现连接不上,一会儿又可以了。谁能解释一下?
你好 bool zale
我的问题不知道是否与你的问题是同样原因,但是造成我的问题的原因是因为操作占用的时间太长,影响到了蓝牙的逻辑链路层的状态切换,导致操作中途断开连接了。所以我没法确认你的频繁连接是否也影响到了 状态机的切换导致了断开,这点需要你自己去验证了, 我只能帮你到这里了。
我也碰到这样的问题,每隔30s自动断开连接然后重新广播,求解,谢谢!
你好 Escher she !
请问下你的问题因为操作占用时间过长,影响了蓝牙逻辑链路层的状态切换导致中途断开如何解决的? 我现在也有这样一个问题,就是2541做从机 与安卓APP连接后频繁按键发送消息,但是按下几百次以后中途有时候就会断开,不知道是不是与你的问题一样?麻烦跟我说下你是怎么解决这个问题的?
你好 Andy chou2
我的问题是由于发送的数据过大并且还需要对flash进行读操作,所以过长的处理时间导致了类似阻塞的情况出现从而蓝牙的状态机制处理不及时然后挂掉了。貌似与你的问题有点点类似。但是从机主动断开连接的原因是有限的,你是通过按键来发送消息 所以按键的频率决定了你消息推送的频率,个人建议你测试下是否是由于你的按键频率太快导致的....你可以尝试用较慢的速度按键,不出问题的话 我觉得应该能够挺过那几百下的.......
谢谢。
你好 Escher she!
非常感谢你的解答!那么请问你是如何解决这个问题的?你说的蓝牙链接链路层切换这个有办法改善吗? 另外我也想问下从机在什么情况下会断开连接,因为连接事件主要是由主机来完成的。关于我按键问题,其频率挺快的,一秒钟能有几下,大约五六下这样的频率,有时候会少一点,我之前怀疑是不是按键频率太快,导致主机响应不过来,或者从机这边蓝牙状态切换不过来导致断开?你觉得呢?
谢谢!
你好 Andy chou2
我当时采用类似于分时的方法来做修正的,在某个时段发送一块数据,某个时段操作flash。这样的话就可以有效的保持蓝牙状态机的切换了。如果全部在一个时间段里面操作,那么就会形成类似阻塞的情况。所以首先建议你先验证下是否是频率的问题导致的,如果找到了问题所在那么解决起来才会有针对性...至于从机不明所以的主动断开连接的问题 很多情况下应该都是状态机的问题(仅此个人观点)
谢谢。
你好 Escher she!
非常感谢你的详细回答! 我晚上实验了下,如果不频繁按键的话确实是不怎么会造成断开的现象,但是如果是要频繁按键的情况下如何改善从机蓝牙状态机的切换呢? 还是说没法做改变?而且请教个问题,状态机指的是协议栈里面的哪一块?GAP层还是GATT层?还是链路层?
谢谢!
hi Andy chou2
这个问题很显然是可以解决的,但不是直接去修改协议栈。因为TI的协议栈本身是没有什么问题的,主要的原因是你自身的处理直接影响了 状态的切换,从而间接的导致了现在这种情况出现。所以,你应该吧问题定位到你自己的程序处理上去.....至于你问的问题我已经记不清了,已经有很长时间没做这个了,建议你去看看相关的资料。
谢谢。