解决 Nordic central 中心设备连接外围设备错误 Disconnected, reason 0x8

解决 Nordic central 中心设备连接外围设备错误 Disconnected, reason 0x8

我需要用蓝牙Downgle来实现电脑串口发送数据到我的外围设备上,进行数据测试等。

但是遇到 uuid 过滤失败的情况,暂时还没有解决。我用SDK中的Demo工程,都能连接ble_uart设备,但是我的工程是在ble_uart上进行修改的,没有更改 nus service 的 uuid,但就是过滤识别不到我的设备。

因此我在 NRF_BLE_SCAN_EVT_NOT_FOUND事件中处理我的连接。
先关掉 uuid 过滤器,然后再scan_evt_handler回调里面设置上述事件,扫描到指定MAC的设备后,直接进行连接。

static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
    ret_code_t err_code;
	ble_gap_evt_adv_report_t const *p_adv = p_scan_evt->params.filter_match.p_adv_report;
	ble_gap_scan_params_t const *p_scan_param = p_scan_evt->p_scan_params;
	ble_gap_evt_connected_t const * p_connected = p_scan_evt->params.connected.p_connected;
	ble_gap_evt_adv_report_t const  * p_not_found = p_scan_evt->params.p_not_found;

    switch(p_scan_evt->scan_evt_id)
    {
		case NRF_BLE_SCAN_EVT_FILTER_MATCH:
		{
			NRF_LOG_INFO("match ");
			
		  NRF_LOG_INFO("scan to target %02x%02x%02x%02x%02x%02x",
		  p_adv->peer_addr.addr[0],
		  p_adv->peer_addr.addr[1],
		  p_adv->peer_addr.addr[2],
		  p_adv->peer_addr.addr[3],
		  p_adv->peer_addr.addr[4],
		  p_adv->peer_addr.addr[5]
		  );
			
		} break;
		
		case NRF_BLE_SCAN_EVT_NOT_FOUND:
		{
			uint8_t addr[6] = {0xA8, 0xbc, 0xc8, 0x55, 0xa7, 0xc0};
			if (memcmp(addr, p_not_found->peer_addr.addr, 6) == 0)
			{
							NRF_LOG_INFO("not found target %02x%02x%02x%02x%02x%02x",
		  p_not_found->peer_addr.addr[0],
		  p_not_found->peer_addr.addr[1],
		  p_not_found->peer_addr.addr[2],
		  p_not_found->peer_addr.addr[3],
		  p_not_found->peer_addr.addr[4],
		  p_not_found->peer_addr.addr[5]
		  );
				ret_code_t ret_code = sd_ble_gap_connect(&(p_not_found->peer_addr), p_scan_param, &m_connection_param, 1);
				if (ret_code != NRF_SUCCESS)
				{
					NRF_LOG_INFO("connect failed.");
				}
				scan_stop();
			}
		} break;

然后,中心设备是能扫描并且连接到指定外围设备了,但是一会儿就断开连接了。并且报错:Disconnected, reason 0x8。最后再Nordic论坛,发现需要调整连接参数。
调整如下:

#define MIN_CONNECTION_INTERVAL     MSEC_TO_UNITS(20, UNIT_1_25_MS)    /**< Determines minimum connection interval in milliseconds. */
#define MAX_CONNECTION_INTERVAL     MSEC_TO_UNITS(75, UNIT_1_25_MS)    /**< Determines maximum connection interval in milliseconds. */
#define SLAVE_LATENCY               0                                   /**< Determines slave latency in terms of connection events. */
#define SUPERVISION_TIMEOUT         MSEC_TO_UNITS(4000, UNIT_10_MS)     /**< Determines supervision time-out in units of 10 milliseconds. */

static ble_gap_conn_params_t const m_connection_param =
{
    (uint16_t)MIN_CONNECTION_INTERVAL,
    (uint16_t)MAX_CONNECTION_INTERVAL,
    (uint16_t)SLAVE_LATENCY,
    (uint16_t)SUPERVISION_TIMEOUT
};

重新连接后,没有问题了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值