uart_event_handle not called when need receive string data in ble application

Hello everyone,

I'm working in a ble project that use uart interface. When I sent string data in nrf connect app, the uart_event_handle is not called. 

I started my project using ble_app_template, and the uart functions I copied by the ble_app_uart example.

The string that I need send my device using nrf connect app is: "z0,73,137,197,529;0.0,5.02,9.51,13.54,35.50"

I have some parameters that I sent to device, but are one letters, for example: "a" or "c" and it works fine.

Other information is that the ble_app_uart, this string was received correct and works fine, but in my project not.

This is my uart init function:

static void uart_init(void)
{
    uint32_t                     err_code;
    app_uart_comm_params_t const comm_params =
    {
        .rx_pin_no    = NRF_UART_PSEL_DISCONNECTED,
        .tx_pin_no    = NRF_LOG_BACKEND_UART_TX_PIN,
        .rts_pin_no   = NRF_UART_PSEL_DISCONNECTED,
        .cts_pin_no   = NRF_UART_PSEL_DISCONNECTED,
        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
        .use_parity   = false,
#if defined (UART_PRESENT)
        .baud_rate    = NRF_UART_BAUDRATE_115200
#else
        .baud_rate    = NRF_UARTE_BAUDRATE_115200
#endif
    };

    APP_UART_FIFO_INIT(&comm_params,
                       UART_RX_BUF_SIZE,
                       UART_TX_BUF_SIZE,
                       uart_event_handle,
                       APP_IRQ_PRIORITY_LOWEST,
                       err_code);
    APP_ERROR_CHECK(err_code);
}

My uart_evt_handle function:

void uart_event_handle(app_uart_evt_t * p_event)
{
    //static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
    static uint8_t index = 0;
    uint32_t       err_code;

    switch (p_event->evt_type)
    {
        case APP_UART_DATA_READY:
            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
            index++;

            if ((data_array[index - 1] == '\n') ||
                (data_array[index - 1] == '\r') ||
                (index >= m_ble_nus_max_data_len))
            {
                if (index > 1)
                {
                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);

                    do
                    {
                        uint16_t length = (uint16_t)index;
                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
                            (err_code != NRF_ERROR_RESOURCES) &&
                            (err_code != NRF_ERROR_NOT_FOUND))
                        {
                            APP_ERROR_CHECK(err_code);
                        }
                    } while (err_code == NRF_ERROR_RESOURCES);
                }

                index = 0;
            }
            break;

        case APP_UART_COMMUNICATION_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_communication);
            break;

        case APP_UART_FIFO_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_code);
            break;

        default:
            break;
    }
}

Initialize NUS inside the services_init function:

    // Initialize NUS. //todo ble_uart-------------------
    memset(&nus_init, 0, sizeof(nus_init));

    nus_init.data_handler = nus_data_handler;

    err_code = ble_nus_init(&m_nus, &nus_init);
    APP_ERROR_CHECK(err_code);
    NRF_LOG_INFO("NUS inicializado e handler registrado.");

my nus_data_handler funcion:

static void nus_data_handler(ble_nus_evt_t * p_evt)
{
    if (p_evt->type == BLE_NUS_EVT_RX_DATA)
    {
        NRF_LOG_INFO("Dados recebidos via BLE NUS:");
        NRF_LOG_HEXDUMP_INFO(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);

        nus_Uart_control = p_evt->params.rx_data.p_data[0];

        if (nus_Uart_control == 'z' || nus_Uart_control == 'y') 
        {
            memset(&m_calib_recebida, 0, sizeof(m_calib_recebida));

            if (parse_lut_data(p_evt->params.rx_data.p_data, &m_calib_recebida))
            {
                wait_for_calibration = true;
                m_scale.calibrating = true;     
                m_scale.calibrating_offset = false;
            }
            else
            {
                NRF_LOG_ERROR("Falha no parse dos dados da LUT recebidos.");
            }
        }
    }
}

and finally, my ble_evt_hander function

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t err_code = NRF_SUCCESS;
    ble_gatts_rw_authorize_reply_params_t auth_reply;
    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
            err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
            APP_ERROR_CHECK(err_code);
            m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
             err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
            APP_ERROR_CHECK(err_code);
               NRF_LOG_INFO("ble_evt_handler: BLE_GAP_EVT_CONNECTED ");//todo debug
            break;

        case BLE_GAP_EVT_DISCONNECTED:
            m_conn_handle = BLE_CONN_HANDLE_INVALID;
            NRF_LOG_INFO("ble_evt_handler: BLE_GAP_EVT_DISCONNECTED ");//todo debug
            (void) sd_ble_gap_adv_stop(m_advertising.adv_handle); // <- PARA o advertising
            advertising_start(false);
            break;
        
        case BLE_EVT_USER_MEM_REQUEST:
            NRF_LOG_INFO("BLE_EVT_USER_MEM_REQUEST recebido, ignorado.");
            break;
       
        case BLE_GATTS_OP_EXEC_WRITE_REQ_NOW:
        //NRF_LOG_INFO("ble_evt_handler: BLE_GATTS_OP_EXEC_WRITE_REQ_NOW ");//todo debug
            break;
        
        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
        
            NRF_LOG_DEBUG("PHY update request.");
            ble_gap_phys_t const phys =
            {
                .rx_phys = BLE_GAP_PHY_AUTO,
                .tx_phys = BLE_GAP_PHY_AUTO,
            };
            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
            APP_ERROR_CHECK(err_code);
            break;
        //-----------------------------------------------------------------------------------

        default:
            break;
    }
  
}

if I send one letter "c", the result works:

But if I sent my string "z0,73,137,197,529;0.0,5.02,9.51,13.54,35.50" is ignored.

Anyone can help me to solve it?

Regards

Laerte

Parents Reply Children
No Data
Related