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

Sending more than 1 packet per connection with nRF52840

As I'm new to the nRF52840 and Bluetooth, I read documents and DevZone posts related to the bluetooth maximum throughput.

According to the references like Jimmy and Sigurd and so on, it seems that I can get higher throughput if I set MTU to the maximum value and send multiple packets per connection.

The problem is that it was not able for me to find options to enable sending multiple packets.

Currently, I mixed ble_app_uart and saadc examples to get signal and send them via bluetooth. And the data length extension and MTU size are set to the maximum as I know.

And I send data using the following code which is written by another team member

static void nus_data_handler(ble_nus_evt_t * p_evt)
{

    if (p_evt->type == BLE_NUS_EVT_RX_DATA)
    {
        uint32_t err_code;

        NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);

        for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
        {
            do
            {
                err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
                if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
                {
                    APP_ERROR_CHECK(err_code);
                }
            } while (err_code == NRF_ERROR_BUSY);
        }
        if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r')
        {
            while (app_uart_put('\n') == NRF_ERROR_BUSY);
        }
    }

}

Are there any examples sending multiple packets per connection so I can try to implement to mine?

Parents
  • Sorry for my mistake. The code above was not related to the BLE transmission.

    void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
    {
        if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
        {
            ret_code_t err_code;
    
            err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
            APP_ERROR_CHECK(err_code);
            SEGGER_RTT_WriteString(0, "saadc_callback function\n");
    
            saadc2ble_convert();   
            uint16_t length = (uint16_t)(SAMPLES_IN_BUFFER * 2);            
            SEGGER_RTT_WriteString(0, "Trying to send data.\n");  
            
            notification_err_code = ble_nus_data_send(&m_nus, adc_output, &length, m_conn_handle);   
            sprintf(error_string, "Error number: %#x\n", notification_err_code);
            SEGGER_RTT_WriteString(0, error_string);  
            if ((notification_err_code != NRF_ERROR_INVALID_STATE) &&
                        (notification_err_code != NRF_ERROR_RESOURCES) &&
                        (notification_err_code != NRF_ERROR_NOT_FOUND))
            {
                //APP_ERROR_CHECK(notification_err_code);                    
            }
        }
    }

    This is the actual one.

    And another question is that is there any other function rather than ble_nus_data_send?

    I think that uart interface is not so fast

Reply
  • Sorry for my mistake. The code above was not related to the BLE transmission.

    void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
    {
        if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
        {
            ret_code_t err_code;
    
            err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
            APP_ERROR_CHECK(err_code);
            SEGGER_RTT_WriteString(0, "saadc_callback function\n");
    
            saadc2ble_convert();   
            uint16_t length = (uint16_t)(SAMPLES_IN_BUFFER * 2);            
            SEGGER_RTT_WriteString(0, "Trying to send data.\n");  
            
            notification_err_code = ble_nus_data_send(&m_nus, adc_output, &length, m_conn_handle);   
            sprintf(error_string, "Error number: %#x\n", notification_err_code);
            SEGGER_RTT_WriteString(0, error_string);  
            if ((notification_err_code != NRF_ERROR_INVALID_STATE) &&
                        (notification_err_code != NRF_ERROR_RESOURCES) &&
                        (notification_err_code != NRF_ERROR_NOT_FOUND))
            {
                //APP_ERROR_CHECK(notification_err_code);                    
            }
        }
    }

    This is the actual one.

    And another question is that is there any other function rather than ble_nus_data_send?

    I think that uart interface is not so fast

Children
No Data
Related