Libuarte+app template ERROR 0 [NRF_SUCCESS]

Hi,
I have added libuarte example in-app template and sent data from Arduino to nRF52840 successfully. But after receiving some data and I am getting the following error. Any solution please?
Thanks!




Parents
  • Hi,

    Have you remembered to free the RX buffer in the uart event handler? Could you show me how the handler has been implemented? 

    regards

    Jared 

  • Thanks for the reply. Here is the function

    void uart_event_handler(void * context, nrf_libuarte_async_evt_t * p_evt)
    {
        nrf_libuarte_async_t * p_libuarte = (nrf_libuarte_async_t *)context;
        ret_code_t ret;
    
        switch (p_evt->type)
        {
            case NRF_LIBUARTE_ASYNC_EVT_ERROR:
                break;
            case NRF_LIBUARTE_ASYNC_EVT_RX_DATA:
    
                if((unsigned char)*(p_evt->data.rxtx.p_data)!=0)
                {
                      received_data[count_data]=(unsigned char)*(p_evt->data.rxtx.p_data);
                      count_data=count_data+1;
                      if((unsigned char)*(p_evt->data.rxtx.p_data)==35)
                          data_completed=true;
                }
    
                m_loopback_phase = true;
                break;
            case NRF_LIBUARTE_ASYNC_EVT_TX_DONE:
                if (m_loopback_phase)
                {
                    nrf_libuarte_async_rx_free(p_libuarte, p_evt->data.rxtx.p_data, p_evt->data.rxtx.length);
                    if (!nrf_queue_is_empty(&m_buf_queue))
                    {
                        buffer_t buf;
                        ret = nrf_queue_pop(&m_buf_queue, &buf);
                        APP_ERROR_CHECK(ret);
                        UNUSED_RETURN_VALUE(nrf_libuarte_async_tx(p_libuarte, buf.p_data, buf.length));
                    }
                }
    
                printf("Tx Called\n");
    
                break;
            default:
                break;
        }
    }
    
    
    //UART
    
    


  • Hello Muqarrab, sorry about the delay.

    It does seem that the buffersize is too small for some reason.

    As it has been 21 days, I guess I should ask if you have already figured it out?

    Best regards,

    Elfving

Reply Children
  • Hi
    I was on holiday and just join today :). Can you please point out the issue? how to resolve issue?
    Thanks!

  • Hello!

    It seems that you are trying to free more space from the buffer than the actual buffer size is.

    Have modified a lot of the example? Did it work earlier at any point? I believe this is a loop-back example, but I guess you are mainly planning on just using it for receiving the information from the Arduino, right?

    Best regards,

    Elfving


  • Yes, the code is working but after receiving some data it gives the above error. 
    Yes, I am receiving information from Arduino.

  • Hello Muqarrab,

    I assume this example should work by default. However it does seem like you have made some serious changes to it? You removed the nrf_libuarte_async_tx call from the RX event for instance? I dont see the reasoning behind that.

    At the heart of the issue, you are trying to free more bytes than you have actually received somewhere. But with potential modifications made in several places its hard to know where the issue stems from.

    What version of the nRF5SDK are you using? And could you try to make this work with less modifications done to the original, in order to locate the error?

    Best regards,

    Elfving



  • You removed the nrf_libuarte_async_tx call from the RX event for instance? I dont see the reasoning behind that.

    Actually, I want to save coming data from Arduino in the array so I remove that. If add the following part it sends the same received data to tx.


    //UART
    
    void uart_event_handler(void *context, nrf_libuarte_async_evt_t *p_evt) {
      nrf_libuarte_async_t *p_libuarte = (nrf_libuarte_async_t *)context;
      ret_code_t ret;
    
      switch (p_evt->type) {
      case NRF_LIBUARTE_ASYNC_EVT_ERROR:
        break;
      case NRF_LIBUARTE_ASYNC_EVT_RX_DATA:
    
        ret = nrf_libuarte_async_tx(p_libuarte, p_evt->data.rxtx.p_data, p_evt->data.rxtx.length);
        if (ret == NRF_ERROR_BUSY) {
          buffer_t buf = {
              .p_data = p_evt->data.rxtx.p_data,
              .length = p_evt->data.rxtx.length,
          };
    
          ret = nrf_queue_push(&m_buf_queue, &buf);
          APP_ERROR_CHECK(ret);
        } else {
          APP_ERROR_CHECK(ret);
        }
    
        if (count_data < 50) {
          if ((unsigned char)*(p_evt->data.rxtx.p_data) != 0) {
            received_data[count_data] = (unsigned char)*(p_evt->data.rxtx.p_data);
            count_data = count_data + 1;
            if ((unsigned char)*(p_evt->data.rxtx.p_data) == 35)
              data_completed = true;
          }
        } else {
          count_data = 0;
        }
    
        m_loopback_phase = true;
        break;
      case NRF_LIBUARTE_ASYNC_EVT_TX_DONE:
        if (m_loopback_phase) {
          nrf_libuarte_async_rx_free(p_libuarte, p_evt->data.rxtx.p_data, p_evt->data.rxtx.length);
          if (!nrf_queue_is_empty(&m_buf_queue)) {
            buffer_t buf;
            ret = nrf_queue_pop(&m_buf_queue, &buf);
            APP_ERROR_CHECK(ret);
            UNUSED_RETURN_VALUE(nrf_libuarte_async_tx(p_libuarte, buf.p_data, buf.length));
          }
        }
    
        printf("Tx Called\n");
    
        break;
      default:
        break;
      }
    }
    
    //UART
    


    At the heart of the issue, you are trying to free more bytes than you have actually received somewhere. But with potential modifications made in several places its hard to know where the issue stems from.

    I have not made so many changes but just merge two codes. if you asked I upload the complete code.

    What version of the nRF5SDK are you using?

    nRF5_SDK_17.0.2_d674dde.

    code work but after receiving some data it shows the following error.



    The issue is related to RX buffer. can you guide how can I handle that?

Related