赞
踩
本文主要讲Nordic的NRF52832主机主动断开连接函数sd_ble_gap_disconnect()使用过程中遇到的问题
首先来说NRF52832的主机断开连接使用的是SDK函数sd_ble_gap_disconnect(),函数sd_ble_gap_disconnect()原型
uint32_t sd_ble_gap_disconnect(uint16_t conn_handle,uint8_t hci_status_code);
参数conn_handle:断连设备的连接句柄
参数hci_status_code表示断连原因,有两种情况
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION:连接间隔在实际应用中不被接受时使用
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION:用户操控蓝牙断连,大多数情况下使用这个参数
在本项目中的要求是,手机向主从一体设备发送指令(指令包含了从机的MAC地址),主从一体接收到指令后,1)stop_scan,2)断开与从机的连接sd_ble_gap_disconnect(),3)将从机MAC保存到片上Flash,4)重新scan去连接新的从机
在第2)步时需要使用函数sd_ble_gap_disconnect()。
在实际使用时,以为主从一体与从机连接的connection_handle固定为0,就写了固定值0,
这样做的结果:每次主机给主从一体发送指令,有时正常,有时主从一体就会爆出Fatal error进而死机
查了很多关于函数sd_ble_gap_disconnect()的用法,发现没错呀,很是郁闷。
一个周一的早上,思路清晰了,再看这段代码,突发奇想,既然时Fatal error,那么error code是多少呢?于是调整代码如下
编译烧录,发现error code值是0x3002
那么0x3002代表什么呢?于是根据宏定义NRF_SUCCESS找线索
有点眉目了,NRF_SUCCESS的base值为NRF_ERROR_BASE_NUM,而0x3000对应的base值为NRF_ERROR_STK_BASE_NUM,那么根据NRF_SUCCESS的定义方法,0x3002可能就是NRF_ERROR_STK_BASE_NUM + 2的宏定义吧,继续找NRF_ERROR_STK_BASE_NUM使用的地方,果不其然,找到了
而0x3002对应的注释为Invalid connection handle。而函数sd_ble_gap_disconnect()的第一个参数就是connection_handle,也就是这个参数错了,不能固定为0,那么主从一体与从机连接的实际connection_handle应该是多少呢?
既然固定为0有时可以,有时不可以,那就把它调成可以的情况看看能不能找到。
主从一体连接了两个设备,一个从机,一个主机,那么上图的两个Connecting to target就是主机和从机的MAC,那么哪个是主机哪个是从机呢?
第一个Connecting to target下边几行打印信息,有start discovery services、start discovery characteristics、start discovery descriptor rsp,所以可以判定第一个连接的target就是从机的MAC,再细看有这样一行打印信息
这不就是要找的connection_handle吗,很好。那就把这个connection_handle定义个全局变量提出来。于是再调整代码如下
再用主机给主从一体发指令
Perfact,完美解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。