NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)

       在调试公司项目中的蓝牙生理传感器(该传感器为Peripheral,连接上Central后等待pc机端指令,指令到达将Peripheral中采集到的生理数据经由Central传输到PC端)过程中,遇到一个问题,主从机连接上后,Server接收到指令向Client发送数据,这是突然将Server重启,重新与Client连接上后,接收到PC端指令,Server开始发送数据,出现Server每发送一组数据,Client都会接收到两组相同的数据,连续进入到ble_nus_c_evt_handler函数两次。

       分析:

     (1)经过几次咨询与讨论,了解到,有之前的同事在做从机不做主机的情况下直接与手机app端对接,将从机重新启动,然后从机每发送一组数据,手机app端就会接收到两组。经过安卓app工程师,修改bug了解到,从机重新启动断开连接后,手机app需要关闭一个相关的通知,下一次重启之后才不会接收到两组数据。

     (2)若是这类问题无法解决,可以强制屏蔽此类问题。

       解决过程:

     (1)参考分析(1)中的问题,由于自己是蓝牙方面的小白,身边也没有什么技术上真正的懂这方面的,所以只能在艾克姆用户讨论群中,分享自己的问题,并向大佬请教,可是群里的管理员说自己并没有遇到此类的问题;所以我向管理员要了他说过的没有出现过这类问题的例程,一个一对多主机程序和一个从机程序,两个从机串口助手端  都以2hz的速度自动发送数据, 主机的串口助手端也是可以以4hz接收到两个从机的数据,这个时候我将从机A断开, 主机串口端  一开始 会以2hz的速度接收从机B的数据,过了大概3秒左右,主机的串口助手又以4hz的速度接收数据 ,而且是主机是接收到从机一次的数据,它串口连续发送两次 连续进入
这个函数也是两次。说明这不单单是我自己存在这个问题。

     (2)针对于分析(2),我是用的方法是利用cortm系列内核专用复位函数NVIC_SystemReset(); 在主从机连接完好的情况下,只要有一个断开连接,那么我就将主机重新启动,重新连接。首先我将复位函数添加到ble_nus_c_evt_handler函数中的BLE_NUS_C_EVT_DISCONNECTED位置中,当我将其中一个从机断开连接后,主机死机;然后,我又将函数添加到ble_event_handler函数的BLE_GAP_EVT_DISCONNECTED位置中,发现还是主机死机;(经过我的思考,添加到的这两个位置是ble协议栈中的从机断开连接的处理事件的位置,此时在协议栈中可能设置与内核相关的内容,既然如此我就不在你协议栈运行的时候去软件复位,我在主循环中进行处理,当然这只是我的猜测。)  然后我就在ble_nus_c_evt_handler函数中的BLE_NUS_C_EVT_DISCONNECTED位置中,放置一个标志位,当运行从机断开连接,运行到此位置时,标志位置一,然后在主循环中(此时与ble协议栈无关)运行NVIC_SystemReset(),成功复位(看来我的猜测也是比较符合的)。这也是一种解决问题的方式。

       办法:

     (1)关于此类问题,我自己还是无法解决的(我承认我是个ble的小白),最后艾克姆解决了他自己的例程的问题,他把例程发给了我,发现这货居然把协议栈里的东西给改了好多。主要修改的思路是,连接断开后清空客户端的全部参数。如下几幅图这是ble_nus_c.c文件修改位置之前的配置。

NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第1张图片NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第2张图片NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第3张图片

下几幅图为修改之后的配置:

NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第4张图片

NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第5张图片NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第6张图片

NRF52832蓝牙ble多个server连接client向上位机发送数据,断开一个从机,主机多发重复数据问题(server并没有多发)_第7张图片

改好的例程请参考:

           https://download.csdn.net/download/qq_26575553/11803966     

     (2)根据解决过程(2)主机主动断开蓝牙或者重新启动。可以作为,备选方案。

 

 

注:在主设备与从设备未发生连接之前两个角色分别叫:Central和 Peripheral;连接建立后,角色更变为Client和Server。

你可能感兴趣的:(nrf52832,问题总结类)