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

Best way to send larger chunks of data through BLE UART?

Right now i have based myself on the BLE UART example where it is UART over BLE.

So naturally I use ble_nus_string_send to send data. After some digging I saw that this takes max 20 bytes of data. Also there seems to be a fixed queue size, so anything after a filled queue will be disregarded with an error returned from this function. The qeue size by the looks of it is 6, right?

So, how do I send bigger chunks (all the data is one big chunk which is treated as one entity)? First I tried to just retry if ble_nus_string_send returned an error with a nrf_delay_ms(20) in a loop with 100 retries. It does work, but it can't be an elegant solution. Also on the 2nd chunk of data sent over, it seems to struggle a lot more when sent over. It comes in small portions of 3 chunks over time. I am testing on android with the NRF UART app.

Thanks!

Parents
  • @Emil: You can do what you are doing, try to queue the notification packets as long as the buffer is not full, and try again after you receive BLE_EVT_TX_COMPLETE event (meaning there are packet sent in the last connection event).

    Or you can declare your characteristics with bigger size than 20byte (max 510 bytes) and let the central to use long read to retreive the value. I don't think notification is supported to send long characteristic.

  • @Emil: NUS service is simply a proprietary that we created to show how you can have your own proprietary services and characteristics. You can modify it as you wish. sd_ble_gatts_hvx() requires a notifiable characteristic. You can use other characteristic not the UART one, but still need a notifiable characteristic/attribute. If you plan to have access to lower layer with no attribute, you would need to use the L2CAP api provided by the softdevice.

Reply
  • @Emil: NUS service is simply a proprietary that we created to show how you can have your own proprietary services and characteristics. You can modify it as you wish. sd_ble_gatts_hvx() requires a notifiable characteristic. You can use other characteristic not the UART one, but still need a notifiable characteristic/attribute. If you plan to have access to lower layer with no attribute, you would need to use the L2CAP api provided by the softdevice.

Children
No Data
Related