現象: 設備做爲主設備,去連接從設備。每次都可以連接上,但是在發現服務的過程中出錯。
static uint32_t service_discover(client_t * p_client)
{
uint32_t err_code = NRF_SUCCESS;
p_client->state = STATE_SERVICE_DISC;
if(p_client->client_info.uuid.type == BLE_UUID_TYPE_VENDOR_BEGIN) {
//每次在這裏都返回一個錯誤碼4
err_code = sd_ble_uuid_vs_add(&p_client->client_info.service_base_uuid, &p_client->client_info.uuid.type);
if(err_code != NRF_SUCCESS)
{
NRF_LOG_INFO("service_discover err 1:%x",err_code);
return err_code;
}
} else {
...
}
...
}
錯誤碼4的定義(nrf_error.h):
#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation
錯誤是說沒有足夠的內存給到用戶。
解決方案:
sdk_config.h
// <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs.
#ifndef NRF_SDH_BLE_VS_UUID_COUNT
#define NRF_SDH_BLE_VS_UUID_COUNT 1
#endif
NRF_SDH_BLE_VS_UUID_COUNT的默認值爲0,該值表示可以添加多少個自定義服務的UUID到協議棧。如果爲0則表示協議棧不會給用戶的自定義的服務分配內存空間,所以爲0的時候會報NRF_ERROR_NO_MEM錯誤。將該值設置成合適的值(需要向協議棧添加多少個自定義服務UUID就把該值設置爲多少)。