I can't comment in https://devzone.nordicsemi.com/f/nordic-q-a/56685/missing-ble_gatts_evt_hvn_tx_complete-events as it is closed but I am also seeing issues with the TX_COMPLETE event. Please keep me informed of progress.
I use a fifo to push handles as I transmit and a pop on TX_COMPLETE. This fifo is filling at times (perhaps when bt connection is poor).
nrf52832 / sdk15.3 / softdevice6.1.1
ret_code_t err_code = BLE_ERROR_GATTS_SYS_ATTR_MISSING; uint8_t retry_count = 0; while(err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING && retry_count++ < 10) { err_code = sd_ble_gatts_hvx(m_conn_handle, &hvx_params); if (err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING) { nrf_delay_ms(50); } } if (err_code == NRF_SUCCESS) { // push the handle of the characteristic so we can pop it in the txdone callback uint32_t write_count = sizeof(cccd_handle); ret_code_t err_code2 = app_fifo_write(&m_tx_fifo, (uint8_t*) &cccd_handle, &write_count); if (err_code2 != NRF_SUCCESS) { // debug for https://github.com/ProxxiTech/proxxiband-fw-nrf52/issues/166 // and https://github.com/ProxxiTech/proxxiband-fw-nrf52/issues/104 prx_error_handler_metadata_t metadata; metadata.u16[0] = m_tx_fifo.read_pos; metadata.u16[1] = m_tx_fifo.write_pos; metadata.u16[2] = m_tx_fifo.buf_size_mask; prx_error_handler_set_metadata(&metadata); } APP_ERROR_CHECK(err_code2); APP_ERROR_CHECK_BOOL(write_count == sizeof(cccd_handle)); }
case BLE_GATTS_EVT_HVN_TX_COMPLETE: { for (uint32_t count = 0; count < p_ble_evt->evt.gatts_evt.params.hvn_tx_complete.count; count++) { uint16_t handle = 0; uint32_t size = sizeof(handle); ret_code_t err_code = app_fifo_read(&m_tx_fifo, (uint8_t*) &handle, &size); APP_ERROR_CHECK(err_code); APP_ERROR_CHECK_BOOL(size == sizeof(handle)); ble_ems_char_t* p_char = ble_ems_get_characteristic(handle); if (p_char != NULL) { ble_ems_on_tx_complete(p_char); } } }
I asked to have the handles returned from the callback over a year ago, this would be so much easier.