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

Multiperipheral UART Example

I am using 3 nrf52 DKs with S132 and SDK13 to try and implement a combination of the multilink and UART examples. I started with the ble_app_uart_c example and added the relevant code from the ble_app_multilink_central example to connect to multiple (in my case 2) peripherals via the NUS instead of the device name as it does in the multilink example. I programmed the two peripherals with the standard ble_app_uart example code, and it works -- the peripherals connect and I can see that the central has assigned connection handles to each of the devices.

However, when I try to send data from the peripherals to the central via a terminal I only get the output from one peripheral, and it's always the one that connected first. BUT if I connect both peripherals, and then unpower the one that connected first, the second one starts to work.

Has anyone seen this problem? One possible clue is the handles for the two devices. Namely, the nus_* handles are all zero for the second device. Could this be the problem?

The first peripheral: {uuid_type = 2 '\002', conn_handle = 0, handles = {nus_tx_handle = 18, nus_tx_cccd_handle = 19, nus_rx_handle = 16}, evt_handler = 0x22121 <ble_nus_c_evt_handler>}

And the second: {uuid_type = 2 '\002', conn_handle = 1, handles = {nus_tx_handle = 0, nus_tx_cccd_handle = 0, nus_rx_handle = 0}, evt_handler = 0x22121 <ble_nus_c_evt_handler>}

Parents
  • Hi Villaran,

    Seems that on the second device you haven't done service discovery. This explain why the nus_tx_handle was 0 . This is done by calling ble_db_discovery_start() when BLE_GAP_EVT_CONNECTED event occurred. Please have a look at on_ble_evt() event in main.c

    Note that you would need an array to store the attribute table (the handles), if you have 2 devices, you need space for two tables. In the ble_app_uart example it's a single m_ble_db_discovery but in the multilink, it's an array m_ble_db_discovery[]

  • I have loaded the same code on to both peripherals -- it's just the standard ble_app_uart example code. But I really only need one-way communication from each peripheral to the central. I believe I'm assigning handles and setting the CCCDs for both peripherals with these lines when I get the 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->conn_handle, &p_ble_nus_evt->handles);
    err_code = ble_nus_c_tx_notif_enable(&p_ble_nus_c[p_ble_nus_evt->conn_handle]);
    
Reply
  • I have loaded the same code on to both peripherals -- it's just the standard ble_app_uart example code. But I really only need one-way communication from each peripheral to the central. I believe I'm assigning handles and setting the CCCDs for both peripherals with these lines when I get the 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->conn_handle, &p_ble_nus_evt->handles);
    err_code = ble_nus_c_tx_notif_enable(&p_ble_nus_c[p_ble_nus_evt->conn_handle]);
    
Children
No Data
Related