This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Not receiving tx notification (NUS service) from second peripheral.

I have a central device (nRF52832/Soft device s132) that connects to two peripherals. Both peripherals send data to the central via NUS. I have incorporated the required changes for the NUS_C by refering to the LBS_C service from multi-link central example.

Declaration:

BLE_NUS_C_ARRAY_DEF(m_ble_nus_c, NRF_SDH_BLE_CENTRAL_LINK_COUNT);
BLE_DB_DISCOVERY_ARRAY_DEF(m_db_disc, NRF_SDH_BLE_CENTRAL_LINK_COUNT);

Initialization:

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;

  for (uint32_t i = 0; i < NRF_SDH_BLE_CENTRAL_LINK_COUNT; i++)
    {
        err_code = ble_nus_c_init(&m_ble_nus_c[i], &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->conn_handle], p_evt);
}

Handler function:

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) {
  ret_code_t err_code;

  switch (p_ble_nus_evt->evt_type) {
    case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:

      err_code = ble_nus_c_handles_assign(p_ble_nus_c, p_ble_nus_evt->conn_handle, &p_ble_nus_evt->handles);
      APP_ERROR_CHECK(err_code);
   
    err_code = ble_nus_c_tx_notif_enable(p_ble_nus_c);
    APP_ERROR_CHECK(err_code);
    break;

  case BLE_NUS_C_EVT_NUS_TX_EVT:
    ble_nus_chars_received_uart_print(p_ble_nus_evt->p_data, p_ble_nus_evt->data_len);
    break;

  case BLE_NUS_C_EVT_DISCONNECTED:
    NRF_LOG_INFO("Disconnected.");
    break;

  default:
    break;
  }
}

The snippet from the ble_evt_handler:

case BLE_GAP_EVT_CONNECTED:
    // Discover peer's services.
      err_code = ble_nus_c_handles_assign(&m_ble_nus_c[p_gap_evt->conn_handle], p_ble_evt->evt.gap_evt.conn_handle, NULL);
      APP_ERROR_CHECK(err_code);

      err_code = ble_db_discovery_start(&m_db_disc[p_gap_evt->conn_handle], p_ble_evt->evt.gap_evt.conn_handle);
      APP_ERROR_CHECK(err_code);
      break;
    }

I can see both the peripherals getting connected. Both peripherals stream data from on-board sensors distinguishable from the sensor Id. The issue is, I see the data only from the peripheral that connects first. If peripheral 1 connects first, i only see the data from peripheral 1. If peripheral 2 connects first then I see the data only from peripheral 2. In the function:

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)

I am printing the address of the p_ble_nus_c using:

NRF_LOG_INFO("nus instance = %u.", p_ble_nus_c);

When the nus handler runs for the case BLE_NUS_C_EVT_DISCOVERY_COMPLETE,  I see two different instances, like these - 

nus instance = 536900620 - from peripheral1, and

nus instance = 536900636 - from peripheral2

But when the nus handler runs for the case BLE_NUS_C_EVT_NUS_TX_EVT, I only see 

nus instance = 536900620 - which is the peripheral that was connected first. Is it possible to stream data from both the peripherals simultaneously? Is there something I am missing?

Parents Reply
  • Hi Torbjørn, I tried debugging the peripherals but I have no clue. I can actually connect the two peripherals to the nRF Connect app (Android) and I can see the data streaming from both the peripherals in the logs. Both peripherals are identical (My peripheral is an Adafruit Feather nRF52832 Bluefruit LE device ... two of them running same code ... only difference is the hardcoded sensor Id which I am using to distinguish the data from the sensors). 

Children
No Data
Related