Hi Nordic.
I have an issue that I'm really stuck on. I am trying to send data from a radar sensor via your nRF52 DK BLE board. I've managed to make a working connection between the sensor and the board but when I enable notification the data I see is not correct. I've tried printing the frames out from the Segger studio debug terminal and the data looks fine on that end.
I've used the custom service example from your github as base since I would like to add more characteristics in the future. The radar frame being sent is 288 bytes long and I am adding char like this:
static uint32_t custom_value_char_add(ble_cus_t * p_cus, const ble_cus_init_t * p_cus_init) { uint32_t err_code; ble_gatts_char_md_t char_md; ble_gatts_attr_md_t cccd_md; ble_gatts_attr_t attr_char_value; ble_uuid_t ble_uuid; ble_gatts_attr_md_t attr_md; // Add Custom Value characteristic memset(&cccd_md, 0, sizeof(cccd_md)); // Read operation on cccd should be possible without authentication. BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); cccd_md.write_perm = p_cus_init->custom_value_char_attr_md.cccd_write_perm; cccd_md.vloc = BLE_GATTS_VLOC_STACK; memset(&char_md, 0, sizeof(char_md)); char_md.char_props.read = 1; char_md.char_props.write = 1; char_md.char_props.notify = 1; char_md.p_char_user_desc = NULL; char_md.p_char_pf = NULL; char_md.p_user_desc_md = NULL; char_md.p_cccd_md = &cccd_md; char_md.p_sccd_md = NULL; ble_uuid.type = p_cus->uuid_type; ble_uuid.uuid = CUSTOM_VALUE_CHAR_UUID; memset(&attr_md, 0, sizeof(attr_md)); attr_md.read_perm = p_cus_init->custom_value_char_attr_md.read_perm; attr_md.write_perm = p_cus_init->custom_value_char_attr_md.write_perm; attr_md.vloc = BLE_GATTS_VLOC_STACK; attr_md.rd_auth = 0; attr_md.wr_auth = 0; attr_md.vlen = 1; memset(&attr_char_value, 0, sizeof(attr_char_value)); ; attr_char_value.p_uuid = &ble_uuid; attr_char_value.p_attr_md = &attr_md; attr_char_value.init_len = BIN_COUNT * sizeof(float32_t); attr_char_value.init_offs = 0; attr_char_value.max_len = BIN_COUNT * sizeof(float32_t); err_code = sd_ble_gatts_characteristic_add(p_cus->service_handle, &char_md, &attr_char_value, &p_cus->custom_value_handles); if (err_code != NRF_SUCCESS) { return err_code; } return NRF_SUCCESS; }
I've tried printing the frames out from the Segger studio debug terminal and the data looks fine.
uint32_t ble_cus_custom_value_update(ble_cus_t * p_cus, uint8_t* custom_value) { if (p_cus == NULL) { return NRF_ERROR_NULL; } uint32_t err_code = NRF_SUCCESS; ble_gatts_value_t gatts_value; // Initialize value struct. memset(&gatts_value, 0, sizeof(gatts_value)); gatts_value.len = 288; gatts_value.offset = 0; gatts_value.p_value = &custom_value; // Update database. err_code = sd_ble_gatts_value_set(p_cus->conn_handle, p_cus->custom_value_handles.value_handle, &gatts_value); if (err_code != NRF_SUCCESS) { return err_code; } // Send value if connected and notifying. if ((p_cus->conn_handle != BLE_CONN_HANDLE_INVALID)) { ble_gatts_hvx_params_t hvx_params; memset(&hvx_params, 0, sizeof(hvx_params)); hvx_params.handle = p_cus->custom_value_handles.value_handle; hvx_params.type = BLE_GATT_HVX_NOTIFICATION; hvx_params.offset = gatts_value.offset; hvx_params.p_len = &gatts_value.len; hvx_params.p_data = gatts_value.p_value; err_code = sd_ble_gatts_hvx(p_cus->conn_handle, &hvx_params); NRF_LOG_INFO("sd_ble_gatts_hvx result: %x. \r\n", err_code); } else { err_code = NRF_ERROR_INVALID_STATE; NRF_LOG_INFO("sd_ble_gatts_hvx result: NRF_ERROR_INVALID_STATE. \r\n"); } return err_code; }
This is where I update the char.
When I look at my phone only one or two byte seems to change, while in the Debugging terminal every byte change, like expected.
Can you see any errors?
Sincerely
Aksel