CH579 断开后有广播无法连接

调试许久无法定位问题点,无奈只能求助各位大佬,还望指点

现象是手动断开后有时有一定概率设备就无法被连接了,单重启中心设备后仍无法连接,单重启设备后可以正常连接

再说下结构,就是我的CH579是作为从设备,中心设备也是一片579实现的,通讯逻辑是这样的:

  1. 中心设备调用 GATT_WriteCharValue 向从设备写一定量的数据 (连接后配置MTU为236 ,实际最大通讯包长为208字节)

  2. 从设备收到后执行一定操作(用时比较短,十几毫秒以内)后,调用 GATT_Notification 以通知形式向主设备发送响应数据

以上是通讯过程,实际测试时多数时候能正常工作,但有时断开连接(我测试的方法是直接断掉中心设备电源),这是中心设备就再也无法连接到从设备了,此时仍能收到从设备广播数据,但不完整,调用 GAPRole_CentralEstablishLink 方法返回成功,但是无法收到GAP_LINK_ESTABLISHED_EVENT事件,用手机端软件同样可以扫描到从设备,广播数据不完整,无法连接,

下面放两种状态的广播数据图

1644931919834475.jpg

1644931919250285.jpg

基本就是这样的现象,无法连接后从设备其他程序运行正常 请教下这种问题有可能是哪里的问题或者怎么去查找原因呢?

补充一下,观察发现,如果每次断开连接后进入的GAPROLE_ADVERTISING事件中,

微信截图_20220216011118.png

多数情况是进入2这个分支,之后就可以再次连接上。但是偶尔进入1这个分支后,就变成之前叙述的无法连接了


再或者请教下工程师 有没有不重启设备重置BLE协议栈的标准流程,如果实在解决不了我打算检测到断开连接后就重置协议栈,这样解决问题应该也行


首先我看你的部分代码可以看出你有比较大的改动,与我们官方例程不符,你断开连接后,用ble调试助手获取广播参数,扫描应答包是丢失了的,这可能是你动态改变过广播参数导致的,想进一步解决的话可以把代码工程发我邮箱hy@wch.cn


已发送邮箱,感谢


你好客服,请问我这个代码的大概解决方向改如何考虑?或者说重启协议栈的方法流程可以发我参考一下吗?


根据你二楼的描述,你断开连接后,分支1是肯定会进的啊,分支1会将连接信息恢复默认,使能广播,打印断开连接原因。

分支2应该只有从就绪态进入广播态才会进入分支2,并且你的分支2也是没有使能广播,你在分支2加上使能广播,在分支1使能广播的地方加上打印,确保广播使能。



只有登录才能回复,可以选择微信账号登录