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

cdc_acm overwrite.

I use SDK16 and softdevice S140. I use cdc_acm to simulate a UART port. My data traffic is very heavy. It cause data overwrite and send out many zero. My source code snippet is as follows.

Does anyone know how to prevent from UART  (cdc_acm) overwriting?

UART receives message. Send out many 0, it seems overwriting. (NULL is 0x00)
2021/3/30 13:37:35.431 [RX] - <NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>
2021/3/30 13:37:35.479 [RX] -  98588A110014    10014    15    24    2.89    0    0    -066    11    24    BSI03-T-SB <CR><LF>

2021/3/30 13:37:35.484 [RX] -  98588A0FC414    1C414    0    25    2.92    129    136    -056    0d    08    BSE09-T <CR><LF>

2021/3/30 13:37:35.489 [RX] -  98588A0FC4C2    1C4C2    0    25    2.92    144    139    -052    0d    08    BSE09-T <CR><LF>

2021/3/30 13:37:35.525 [RX] -  98588A110014    10014    15    24    2.89    0    0    -066    11    24    BSI03-T-SB <CR><LF>

2021/3/30 13:37:35.561 [RX] -  98588A0023FF    023FF    0    24    2.87    0    0    -053    11    24    BSI03-T-SB <CR><LF>

2021/3/30 13:37:35.569 [RX] -  98588A110014    10014    15    24    2.89    0    0    -078    11    24    BSI03-T-SB <CR><LF>

2021/3/30 13:37:35.618 [RX] - <NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>

My source code snippet.

char m_dongle_buffer[200];

void sysg_send_uart_string_to_device(uint8_t* pdata, uint8_t len)
{
    app_usbd_cdc_acm_write(&m_app_cdc_acm, pdata, len);
}

void output_char(void)
{
    char buf[64];
    ....
    memset(m_dongle_buffer, 0, sizeof(m_dongle_buffer));
    sprintf((char*)m_dongle_buffer," %02X%02X%02X%02X%02X%02X%02X%02X       ",
        p_adv_report->data.p_data[0],p_adv_report->data.p_data[1],p_adv_report->data.p_data[2],p_adv_report->data.p_data[3],
        p_adv_report->data.p_data[4],p_adv_report->data.p_data[5],p_adv_report->data.p_data[6],p_adv_report->data.p_data[7]);

    sprintf((buf," %02X%02X%02X%02X%02X%02X%02X%02X       ",
        ....
    strcat(m_dongle_buffer, buf);

    sysg_send_uart_string_to_device(m_dongle_buffer, strlen(m_dongle_buffer));
    ...
}

Parents
  • Hello,

    When it prints <NUL> <NUL> ... is the string populated with the p_data correctly before you send it?

    Best regards,

    Edvin

  • Hello Edvin,

    Yes, it was cleared by memset at the function of output_char. I add a flag of cdc_acm_data_sending and set it to false at event of APP_USBD_CDC_ACM_USER_EVT_TX_DONE. and check the flag of cdc_acm_data_sending at the function of output_char. It seems to fix this bug. The code is as follows. Is it correct?

    bool cdc_acm_data_sending = false;
    static void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_cdc_acm_user_event_t event)
    {
        app_usbd_cdc_acm_t const * p_cdc_acm = app_usbd_cdc_acm_class_get(p_inst);
        switch (event)
        {
            case APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN:
            {
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN");
                ...
                break;
            }
            case APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE:
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE");
                break;
    				
            case APP_USBD_CDC_ACM_USER_EVT_TX_DONE:
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_TX_DONE");
                cdc_acm_data_sending = false;
                break;
    				
            case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:
            {
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_RX_DONE");
                ....
            }
            ...
        }
    }

    void output_char(void)
    {
        char buf[64];
        ....
        if(cdc_acm_data_sending == true)
            return 0;               // data is very heavy. prevent from overwriting
    
        memset(m_dongle_buffer, 0, sizeof(m_dongle_buffer));
        sprintf((char*)m_dongle_buffer," %02X%02X%02X%02X%02X%02X       ",
            p_adv_report->data.p_data[0],p_adv_report->data.p_data[1],p_adv_report->data.p_data[2],p_adv_report->data.p_data[3],
            p_adv_report->data.p_data[4],p_adv_report->data.p_data[5]);
    
        sprintf((buf," %X%02X%02X       ",
            ....
        strcat(m_dongle_buffer, buf);
    
        sysg_send_uart_string_to_device(m_dongle_buffer, strlen(m_dongle_buffer));
        ...
    }

Reply
  • Hello Edvin,

    Yes, it was cleared by memset at the function of output_char. I add a flag of cdc_acm_data_sending and set it to false at event of APP_USBD_CDC_ACM_USER_EVT_TX_DONE. and check the flag of cdc_acm_data_sending at the function of output_char. It seems to fix this bug. The code is as follows. Is it correct?

    bool cdc_acm_data_sending = false;
    static void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_cdc_acm_user_event_t event)
    {
        app_usbd_cdc_acm_t const * p_cdc_acm = app_usbd_cdc_acm_class_get(p_inst);
        switch (event)
        {
            case APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN:
            {
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN");
                ...
                break;
            }
            case APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE:
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE");
                break;
    				
            case APP_USBD_CDC_ACM_USER_EVT_TX_DONE:
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_TX_DONE");
                cdc_acm_data_sending = false;
                break;
    				
            case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:
            {
                NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_RX_DONE");
                ....
            }
            ...
        }
    }

    void output_char(void)
    {
        char buf[64];
        ....
        if(cdc_acm_data_sending == true)
            return 0;               // data is very heavy. prevent from overwriting
    
        memset(m_dongle_buffer, 0, sizeof(m_dongle_buffer));
        sprintf((char*)m_dongle_buffer," %02X%02X%02X%02X%02X%02X       ",
            p_adv_report->data.p_data[0],p_adv_report->data.p_data[1],p_adv_report->data.p_data[2],p_adv_report->data.p_data[3],
            p_adv_report->data.p_data[4],p_adv_report->data.p_data[5]);
    
        sprintf((buf," %X%02X%02X       ",
            ....
        strcat(m_dongle_buffer, buf);
    
        sysg_send_uart_string_to_device(m_dongle_buffer, strlen(m_dongle_buffer));
        ...
    }

Children
Related