代码编写
说明:本例在主机PHY物理层配置的基础上添加代码。
main.c添加:
BLE_NUS_C_DEF(m_ble_nus_c);
static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, ble_nus_c_evt_t const * p_ble_nus_evt)
{
}
static void nus_c_init(void)//主机客户端初始化
{
ret_code_t err_code;
ble_nus_c_init_t init;
init.evt_handler = ble_nus_c_evt_handler;
err_code = ble_nus_c_init(&m_ble_nus_c, &init);
APP_ERROR_CHECK(err_code);
}
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}
static void db_discovery_init(void)//发现从机服务添加--初始化 DB 发现模块
{
ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
APP_ERROR_CHECK(err_code);
}
主函数添加代码:
int main(void)
{
// Initialize.
log_init();//LOG输出
timer_init();//定时器初始化
buttons_leds_init();//板级设备初始化
db_discovery_init();//发现从机服务添加--初始化 DB 发现模块
power_management_init();//功耗管理
ble_stack_init();//协议栈初始化
gatt_init();//MTU参数协商添加
nus_c_init();//发现从机服务添加//主机客户端初始化
scan_init();//扫描初始化
// Start execution.
NRF_LOG_INFO("BLE central template example started.");
scan_start();//开始扫描
// Enter main loop.
for (;;)
{
idle_state_handle();
}
}
蓝牙事件处理函数添加:
case BLE_GAP_EVT_CONNECTED:
//================发现从机服务添加===START
err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
APP_ERROR_CHECK(err_code);
//================发现从机服务添加===END
//连接的时候指示灯亮
err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
NRF_LOG_INFO("conn_handle: 0x%x",
p_gap_evt->conn_handle
);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("connect OK!");
//主机发起PHY更新请求
err_code = sd_ble_gap_phy_update(p_gap_evt->conn_handle, &phys);
APP_ERROR_CHECK(err_code);
//打印更新请求的参数值
NRF_LOG_INFO("LL_PHY_REQ!");
NRF_LOG_INFO("rx_phys: %d",phys.rx_phys);
NRF_LOG_INFO("tx_phys: %d",phys.tx_phys);
//================发现从机服务添加===START
NRF_LOG_INFO("start discovery services");//添加开始发现服务提示
// 添加主服务数据发现汗水//开启发现服务,nus客户端等地啊发现结果
err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);
APP_ERROR_CHECK(err_code);
//================发现从机服务添加===END
break;
错误及解决
错误1:ERROR 8 [NRF_ERROR_INVALID_STATE]
现象:
代码段:
ret_code_t err_code;
ble_nus_c_init_t init;
init.evt_handler = ble_nus_c_evt_handler;
err_code = ble_nus_c_init(&m_ble_nus_c, &init);
APP_ERROR_CHECK(err_code);
中err_code = ble_nus_c_init(&m_ble_nus_c, &init);调试log打印:
原因:
未进行初始化 DB 发现模块;
解决:
添加代码:
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}
static void db_discovery_init(void)//发现从机服务添加--初始化 DB 发现模块
{
ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
APP_ERROR_CHECK(err_code);
}
并在主函数里面协议栈初始化之前调用 db_discovery_init();函数。
错误2:无法获取服务
现象:
log打印如下:
原因:
没有将主机查询的基础UUID和服务UUID改成和从机一样;
解决方法:
进入ble_nus_c_init(&m_ble_nus_c, &init);函数修改参数设置:如下图
找到基础UUID和服务uuid改成和从机UUID一样的值;
从机的基础UUID和服务UUID示意图:
修改代码段位置如下:
主机查询的基础UUID修改如下:
#define NUS_BASE_UUID {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} /**< Used vendor specific UUID. */
运行结果: