USB CDC ACM: RX data gets overwritten in app_usbd_cdc_acm_read_any() at end of data transmission

To handle RX of USB CDC ACM we are polling data using:

ret = app_usbd_cdc_acm_read_any(&m_app_cdc_acm, m_rx_buffer, MIN(BUFFER_SIZE,size));

On

case NRF_SUCCESS:

rx_size = app_usbd_cdc_acm_rx_size(&m_app_cdc_acm);
copy_rx_data(buffer, n, m_rx_buffer);

We assume data has been transferred to our use buffer `m_rx_buffer` and get the data directly.

On

case NRF_ERROR_IO_PENDING:

usb_txrx_state = USB_TXRX_STATE_RX;

We assume data has been NOT been transferred and assume to we get the data in the event handler instead.

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);
last_usb_cdc_event = event;
ret_code_t ret;
switch (event)
{
...
case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:

rx_size = app_usbd_cdc_acm_rx_size(p_cdc_acm);
copy_rx_data(buffer, n, m_rx_buffer);

This works well until the end of the data (583 bytes in total) is transferred.

On the NEXT TO LAST call to app_usbd_cdc_acm_read_any() we get NRF_SUCCESS and get correct data.

On the last call to app_usbd_cdc_acm_read_any() we get NRF_ERROR_IO_PENDING, but we see that correct data anyway has still been transferred to m_rx_buffer.

But because we assume there are no data directly available (it should be fetched in event handler) we make an intermediate call to:

while (app_usbd_event_queue_process()) {
}

To finalize the transfer event handler.

Stepping through app_usbd_event_queue_process() we see the following sequence of calls ...

#if (APP_USBD_CONFIG_SOF_HANDLING_MODE == APP_USBD_SOF_HANDLING_COMPRESS_QUEUE)
if (p_event_item->sof_cnt > 0)
{
if (p_event_item->start_frame > USBD_FRAMECNTR_FRAMECNTR_Msk)
{
p_event_item->start_frame = 0;
}
sof_event.drv_evt.data.sof.framecnt = (p_event_item->start_frame)++;
--(p_event_item->sof_cnt);
app_usbd_event_execute(&sof_event);
return true;
}
#endif // (APP_USBD_CONFIG_SOF_HANDLING_MODE == APP_USBD_SOF_HANDLING_COMPRESS_QUEUE)

==> app_usbd_event_execute(&(p_event_item->evt));

...

/**
* @brief @ref app_usbd_class_methods_t::event_handler
*/
static ret_code_t cdc_acm_event_handler(app_usbd_class_inst_t const * p_inst,
app_usbd_complex_evt_t const * p_event)
{
ASSERT(p_inst != NULL);
ASSERT(p_event != NULL);

ret_code_t ret = NRF_SUCCESS;
switch (p_event->app_evt.type)
{
...
case APP_USBD_EVT_DRV_EPTRANSFER:
==> ret = cdc_acm_endpoint_ev(p_inst, p_event);
break;

...

static ret_code_t cdc_acm_endpoint_ev(app_usbd_class_inst_t const * p_inst,
app_usbd_complex_evt_t const * p_event)
{

==> ret = cdc_acm_rx_block_finished(p_inst);

...

static ret_code_t cdc_acm_rx_block_finished(app_usbd_class_inst_t const * p_inst)
{

...

==> memcpy(p_cdc_acm_ctx->rx_transfer[0].p_buf,
p_cdc_acm_ctx->internal_rx_buf,
bytes_to_cpy);

The final memcpy finally COPIES OLD DATA from p_cdc_acm_ctx into our user buffer (which contained good data).

So there seems to be some internal USB stack state machine problem here ...

To summarise:

1. Correct data is transferred from app_usbd_cdc_acm_read_any() even if we got NRF_ERROR_IO_PENDING.
2. Consective call app_usbd_event_queue_process() copies old data (i.e. overwrites good data) to user buffer. This should not be possible if USB state contained in p_cdc_acm_ctx is valid.
3. We dont get APP_USBD_CDC_ACM_USER_EVT_RX_DONE event as expected until user buffer is overwritten by app_usbd_event_queue_process()


We are using SDK 17.0.2.

We have enabled APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED, but it does not give any good indication.

One addional note: This is size dependent as well. So if last call returns data pending (which seems to be size dependent) internal buffer seems to be corrupted.

615 OK
593 - 599 OK
581-592 NOK


  • Ok no problem. I think it would be good if you could try to reproduce on a Linux machine if possible. 

  • Hi Peter,

    I tried to get Linux working but wasn't very successful. I admittedly didn't try that much though, because I decided to fall back to the Python options.

    With Python, I was able to reproduce some problems... The state machine in usb.c resulted in app_usbd_cdc_acm_read_any() being called even when the transmission is over, which leads to an infinite loop where app_usbd_cdc_acm_read_any() would return 8, NRF_ERROR_INVALID_STATE.

    Furthermore, I see that with both the working_sample and not_working_sample...

    This test was run with usb-test-packed-2.tgz with these modifications:

    1. A 5000ms delay after usb_config() in main.c, as discussed in this reply.
    2. usb.c::usb_read_buf() to not flush the log, as suggested by my colleague in this reply.
    3. usb.c::usb_read_buf() to let the debugger stop the execution if app_usbd_cdc_acm_read_any() starts returning 8 too many times.

    Due to circumstances, I will be away from DevZone for the several weeks. However, I have made sure that another engineer will be arranged to support you.

    I am really sorry that it has taken so much time and I essentially hasn't been able to help at all.

    Below are overviews of my work and all related files attached, for both your and Susheel's references.

    Python 3 script:

    # Require pyserial ~3.5. Installs with `pip install pyserial`
    import serial
    
    working_sample =        "ABC00DEFGHIJKLMNOP;ABC01DEFGHIJKLMNOPQR;ABC02DEFGHIJKLMNOPQR;ABC03DEFGHIJKLMNOPQR;ABC04DEFGHIJKLMNOPQR;ABC05DEFGHIJKLMNOPQR;ABC06DEFGHIJKLMNOP;ABC07DEFGHIJKLMNOPQR;ABC08DEFGHIJKLMNOPQR;ABC09DEFGHIJKLMNOPQR;ABC10DEFGHIJKLMNOPQR;ABC11DEFGHIJKLMNOP;ABC12DEFGHIJKLMNOPQR;ABC13DEFGHIJKLMNOPQR;ABC14DEFGHIJKLMNOPQR;ABC15DEFGHIJKLMNOP;ABC16DEFGHIJKLMNOPQR;ABC17DEFGHIJKLMNOPQR;ABC18DEFGHIJKLMNOPQR;ABC19DEFGHIJKLMNOP;ABC20DEFGHIJKLMNOP;ABC21DEFGHIJKLMNOP;ABC22DEFGHIJKLMNOP;ABC23DEFGHIJKLMNOP;ABC24DEFGHIJKL;ABC26DEFGHIJKL;ABC27DEFGHIJKL;ABC28DEFGHIJKL;ABC29DEFGHIJKL;ABC30DEFGHIJKLM;ABC31DEFGHIJKLM;EOT;"
    not_working_sample =    "ABC00DEFGHIJKLMNOP;ABC01DEFGHIJKLMNOPQR;ABC02DEFGHIJKLMNOPQR;ABC03DEFGHIJKLMNOPQR;ABC04DEFGHIJKLMNOPQR;ABC05DEFGHIJKLMNOPQR;ABC06DEFGHIJKLMNOP;ABC07DEFGHIJKLMNOPQR;ABC08DEFGHIJKLMNOPQR;ABC09DEFGHIJKLMNOPQR;ABC10DEFGHIJKLMNOPQR;ABC11DEFGHIJKLMNOP;ABC12DEFGHIJKLMNOPQR;ABC13DEFGHIJKLMNOPQR;ABC14DEFGHIJKLMNOPQR;ABC15DEFGHIJKLMNOP;ABC16DEFGHIJKLMNOPQR;ABC17DEFGHIJKLMNOPQR;ABC18DEFGHIJKLMNOPQR;ABC19DEFGHIJKLMNOP;ABC20DEFGHIJKLMNOP;ABC21DEFGHIJKLMNOP;ABC22DEFGHIJKLMNOP;ABC23DEFGHIJKLMNOP;ABC24DEFGHIJKL;ABC26DEFGHIJKL;ABC27DEFGHIJKL;ABC28DEFGHIJKL;ABC29DEFGHIJKL;ABC30DEFGHIJKLM;EOT;"
    
    
    def send_message(port, message):
        # Configure serial port
        ser = serial.Serial()
        ser.baudrate = 9600  # Set baud rate to 9600
        ser.timeout = 5  # Set timeout to 1 second
        ser.port = port
    
        try:
            # Open the serial port
            ser.open()
        except serial.SerialException as e:
            print("Could not open serial port: {}".format(str(e)))
            return
    
        # Write the message to the serial port
        try:
            ser.write(message.encode())
        except Exception as e:
            print("Could not write to serial port: {}".format(str(e)))
        finally:
            # Close the serial port
            ser.close()
    
    
    def main():
        send_message("COM30", working_sample)
        # send_message("COM30", not_working_sample)
    
    
    if __name__ == '__main__':
        main()
    
    

    One sample RTT log when tested with working_sample string:

    <info> app: APP_USBD_EVT_POWER_DETECTED
    <info> app: Try NOP command to see if USB is connected ...
    .<info> app: APP_USBD_EVT_POWER_READY
    <info> app: APP_USBD_EVT_STARTED
    ..<info> app: APP_USBD_EVT_DRV_SUSPEND
    .<info> app: APP_USBD_EVT_DRV_RESUME
    ..........................................................................................<info> app:
    Get items ...
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 29
    <info> app: m_rx_buffer: ABC00DEFGHIJKLMNOP;ABC01DEFGH
    <info> app: resp: ABC01DEFGH (resp_len: 10)
    <info> app: row: ABC00DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC02DEF
    <info> app: resp: ABC02DEF (resp_len: 8)
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 16
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC
    <info> app: resp: ABC (resp_len: 3)
    <info> app: row: ABC02DEFGHIJKLMNOPQR; (resp_len: 3, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 26
    <info> app: m_rx_buffer: 03DEFGHIJKLMNOPQR;ABC04DEF
    <info> app: resp: ABC04DEF (resp_len: 8)
     0)
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC05DEF
    <info> app: resp: ABC05DEF (resp_len: 8)
    <info> app: row: ABC04DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 17
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC0
    <info> app: resp: ABC0 (resp_len: 4)
    <info> app: row: ABC05DEFGHIJKLMNOPQR; (resp_len: 4, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    _RX_DONE: rx_size = 25
    0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC08DEF
    <info> app: resp: ABC08DEF (resp_len: 8)
    <info> app: row: ABC07DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 20
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC09DE
    <info> app: resp: ABC09DE (resp_len: 7)
    <info> app: row: ABC08DEFGHIJKLMNOPQR; (resp_len: 7, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC11DEF
    <info> app: resp: ABC11DEF (resp_len: 8)
    <info> app: row: ABC10DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOP;ABC12DEFGH
    <info> app: resp: ABC12DEFGH (resp_len: 10)
    <info> app: row: ABC11DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC14DEF
    <info> app: resp: ABC14DEF (resp_len: 8)
    <info> app: row: ABC13DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC15DEF
    <info> app: resp: ABC15DEF (resp_len: 8)
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 3
    <info> app: m_rx_buffer: GHI
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 18
    <info> app: m_rx_buffer: JKLMNOP;ABC16DEFGH
    <info> app: resp: ABC16DEFGH (resp_len: 10)
    <info> app: row: ABC15DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 6
    <info> app: m_rx_buffer: GHIJKL
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 15
    <info> app: m_rx_buffer: MNOPQR;ABC19DEF
    <info> app: resp: ABC19DEF (resp_len: 8)
    <info> app: row: ABC18DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOP;ABC21DEFGH
    <info> app: resp: ABC21DEFGH (resp_len: 10)
    <info> app: row: ABC20DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 9
    <info> app: m_rx_buffer: IJKLMNOP;
    <info> app: resp:  (resp_len: 0)
    )
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 29
    <info> app: m_rx_buffer: ABC22DEFGHIJKLMNOP;ABC23DEFGH
    <info> app: resp: ABC23DEFGH (resp_len: 10)
    <info> app: row: ABC22DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOP;ABC24DEFGH
    0)
    <info> app: NRF_SUCCESS: rx_size = 16
    <info> app: m_rx_buffer: IJKL;ABC26DEFGHI
    <info> app: resp: ABC26DEFGHI (resp_len: 11)
    <info> app: row: ABC24DEFGHIJKL; (resp_len: 11, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 18
    <info> app: m_rx_buffer: JKL;ABC27DEFGHIJKL
    <info> app: row: ABC26DEFGHIJKL; (resp_len: 14, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC28DEFGHIJKL
    <info> app: resp: ABC28DEFGHIJKL (resp_len: 14)
    
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC29DEFGHIJKL
    <info> app: resp: ABC29DEFGHIJKL (resp_len: 14)
    <info> app: row: ABC28DEFGHIJKL; (resp_len: 14, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC30DEFGHIJKL
    <info> app: resp: ABC30DEFGHIJKL (resp_len: 14)
    <info> app: row: ABC29DEFGHIJKL; (resp_len: 14, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: m_rx_buffer: M
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 0
    <info> app: m_rx_buffer:
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    
    // Breakpoint hit

    One sample RTT log when tested with not_working_sample string:

    <info> app: APP_USBD_EVT_POWER_DETECTED
    <info> app: Try NOP command to see if USB is connected ...
    .<info> app: APP_USBD_EVT_POWER_READY
    <info> app: APP_USBD_EVT_STARTED
    ..<info> app: APP_USBD_EVT_DRV_SUSPEND
    .<info> app: APP_USBD_EVT_DRV_RESUME
    ......................................................................<info> app:
    Get items ...
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 29
    <info> app: m_rx_buffer: ABC00DEFGHIJKLMNOP;ABC01DEFGH
    <info> app: resp: ABC01DEFGH (resp_len: 10)
    <info> app: row: ABC00DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC02DEF
    <info> app: resp: ABC02DEF (resp_len: 8)
    <info> app: row: ABC01DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 16
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 26
    <info> app: m_rx_buffer: 03DEFGHIJKLMNOPQR;ABC04DEF
    <info> app: resp: ABC04DEF (resp_len: 8)
    <info> app: row: ABC03DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 17
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC0
    <info> app: resp: ABC0 (resp_len: 4)
    <info> app: row: ABC05DEFGHIJKLMNOPQR; (resp_len: 4, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 25
    <info> app: m_rx_buffer: 6DEFGHIJKLMNOP;ABC07DEFGH
    0)
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC08DEF
    <info> app: resp: ABC08DEF (resp_len: 8)
    <info> app: row: ABC07DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 20
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC09DE
    <info> app: resp: ABC09DE (resp_len: 7)
    <info> app: row: ABC08DEFGHIJKLMNOPQR; (resp_len: 7, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 22
    <info> app: m_rx_buffer: FGHIJKLMNOPQR;ABC10DEF
    <info> app: resp: ABC10DEF (resp_len: 8)
     0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC11DEF
    <info> app: resp: ABC11DEF (resp_len: 8)
    <info> app: row: ABC10DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC13DEF
    <info> app: resp: ABC13DEF (resp_len: 8)
    <info> app: row: ABC12DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC14DEF
     0)
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC15DEF
    <info> app: resp: ABC15DEF (resp_len: 8)
    <info> app: row: ABC14DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 3
    <info> app: m_rx_buffer: GHI
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 18
    <info> app: m_rx_buffer: JKLMNOP;ABC16DEFGH
    <info> app: resp: ABC16DEFGH (resp_len: 10)
    0)
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOPQR;ABC17DEF
    <info> app: resp: ABC17DEF (resp_len: 8)
    <info> app: row: ABC16DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOPQR;ABC18DEF
    <info> app: resp: ABC18DEF (resp_len: 8)
    <info> app: row: ABC17DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: m_rx_buffer: GHIJKL
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 15
    <info> app: m_rx_buffer: MNOPQR;ABC19DEF
    <info> app: row: ABC18DEFGHIJKLMNOPQR; (resp_len: 8, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 21
    <info> app: m_rx_buffer: GHIJKLMNOP;ABC20DEFGH
    <info> app: resp: ABC20DEFGH (resp_len: 10)
    0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOP;ABC21DEFGH
    <info> app: resp: ABC21DEFGH (resp_len: 10)
    <info> app: row: ABC20DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 9
    )
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 29
    <info> app: m_rx_buffer: ABC22DEFGHIJKLMNOP;ABC23DEFGH
    <info> app: resp: ABC23DEFGH (resp_len: 10)
    <info> app: row: ABC22DEFGHIJKLMNOP; (resp_len: 10, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 19
    <info> app: m_rx_buffer: IJKLMNOP;ABC24DEFGH
    <info> app: resp: ABC24DEFGH (resp_len: 10)
    0)
    <info> app: NRF_SUCCESS: rx_size = 16
    <info> app: m_rx_buffer: IJKL;ABC26DEFGHI
    <info> app: resp: ABC26DEFGHI (resp_len: 11)
    <info> app: row: ABC24DEFGHIJKL; (resp_len: 11, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT_RX_DONE: rx_size = 18
    <info> app: m_rx_buffer: JKL;ABC27DEFGHIJKL
    <info> app: resp: ABC27DEFGHIJKL (resp_len: 14)
    <info> app: row: ABC26DEFGHIJKL; (resp_len: 14, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC28DEFGHIJKL
    
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC29DEFGHIJKL
    <info> app: resp: ABC29DEFGHIJKL (resp_len: 14)
    <info> app: row: ABC28DEFGHIJKL; (resp_len: 14, usb buffer: 0)
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 15
    <info> app: m_rx_buffer: ;ABC30DEFGHIJKL
    <info> app: resp: ABC30DEFGHIJKL (resp_len: 14)
    
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: NRF_SUCCESS: rx_size = 1
    <info> app: m_rx_buffer: M
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): USB_TXRX_STATE_RX
    <info> app: APP_USBD_CDC_ACM_USER_EVT_PORT_CLOSE
    <info> app: cdc_acm_user_ev_handler(): APP_USBD_CDC_ACM_USER_EVT<info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    <info> app: app_usbd_cdc_acm_read_any(): other 8
    <info> app: app_usbd_cdc_acm_read_any()
    
    
    // Breakpoint hit

    Modified usb.c::usb_read_buf():
    // The changes a bit higher is also just a commented out NRF_LOG_FLUSH().

    Modified main.c:

    Here is my test setup:

    Device side:

    usb-test-packed-2-hieu-231204.zip

    Host PC side, including logs:

    c315710_python_script.zip

    Once again, my apology for having been unable to help.

    Best regards,

    Hieu

Related