首先,一些背景信息。我使用的是5.0.2.1 SDK的ble_app_peripheral示例的修改版本。我正在运行一个自定义服务,从user_cust1改编而来。我正在运行DA14580作为一个独立的MCU,通过UART与另一个MCU通信。DA14580的主要功能是作为一个中继,接收数据包并通过BLE发送,接收数据包并通过UART发送。DA14580还向第二个MCU发送数据包,以通知BLE状态变化(连接,断开等)。
我看到的问题是,如果我开始从基于DA14580的系统向另一个BLE设备发送数据,并将该设备携带出范围,BLE连接将断开,但DA14580似乎没有意识到这一点。DA14580不会再次开始发布广告,它也不会通知第二个MCU断开连接事件。如果我没有在BLE上传输任何数据,那么连接下降是正确识别的。
什么好主意吗?我在custs1_task.c中的gapc_disconnect_ind_handler()函数中通知我的第二个MCU断开连接事件。
关键词:
设备:
嗨jzahn,
我不完全明白这个配置是完全嵌入的还是完全托管的。我假设这是一个完全托管的设备,当从超出范围断开连接或由主机断开连接时触发的处理程序是相同的,user_app_disconnect()。请检查这是在两种情况下触发的处理程序(不要使用睡眠和放置断点以确认它)。此外,为了让设备重新启动广告,如果应用程序的状态处于指定状态,则有一个条件指示应用程序开始广告,您也可以检查这个条件,也许您的设备状态不同。还要检查user_app_disconnect()之后是否在custs1_task.c中触发了gapc_disconnect_ind_handler()。在ble_app_peripheral中,在这两种情况下都应该调用两个断开连接函数。
由于MT_dialog
嘿,MT_dialog,
为了澄清,我将DA14580作为一个带有BLE的独立皮层M0运行,并在其上使用一个应用程序与另一个独立皮层M3对话。
我尝试使用user_app_disconnect()回调来检测断开连接,但该回调也没有被调用。如果我干净地终止BLE连接,将按此顺序调用user_app_disconnect()和gapc_disconnect_ind_handler()处理程序。
我又运行了几次测试,如果每秒发送的数据包不超过两个20字节,那么就可以正确地识别出超出范围的断开连接。如果我发送的数据比这个频率更频繁,则无法识别超出范围的断开连接。
是否有一个较低的堆栈级别可以识别我可以尝试钩入的断开连接?
我刚刚用另一个使用DSPS配置文件的设备做了一个测试,我看到了类似于相同的问题。如果数据正在以2Hz或更快的速度流动,并且连接的设备超出了范围,系统就不会回到广告状态。我没有调试该设备的权限,所以我不能确切地确认发生了什么,但症状是一样的。
嗨jzahn,
现在你已经给了我一些关于你的应用程序的更多信息,我假设当超出范围你的设备重置。我认为你分配了太多的数据,当超出范围时,这些数据被积累起来,淹没你的堆,580进入平台重置。你必须使用一种流量控制,也许在发送下一个通知之前等待前一个通知已成功发送的确认。
由于MT_dialog
成功!
我在user_custs1_b_data_ntf_cfm_handler()中的user_custs1_b_data_ntf_cfm_handler()中设置了一个标志,以确保除非前一个通知已经确认,否则不会提交新的BLE通知,并且我的问题已经修复。
感谢MT_dialog的帮助,你为我节省了大量的时间和理智。