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


Parents
  • Hi

    Hieu will be back in office to continue this case tomorrow, but in the meantime one of our experts on the USB stack has taken a look at your project and has some feedback for you.

    Although we couldn't pinpoint what the error is likely to be we have some suggestions to what it could be.

    First off, do you do the intermediate call to while (app_usbd_event_queue_process() from an interrupt? If so that will definitely cause trouble with the priorities in your application. You could test the application in IRQ mode, with the event queue disabled to see if that changes anything.

    There might be a problem with the way you're using the app_usbd_event_queue_process() function, asthe point is to call it in your while loop, and not wherever you think it "fits" into your application.

    You're also using multiple blocking delays within your project, and the entire nRF5 SDK is based on asynchronous APIs, with callbacks when there is data to process. We would recommend you set up your project similarly, and go to a sleep mode at the end of your while loop instead of just running a delay. Based on the number of iterations we've had of our USB stack in the nRF5 SDK we don't think this is inherently an issue within the stack.

    Best regards,

    Simon

  • Yes, app_usbd_event_queue_process() is only called in main() in test app above and not from any interrupt routine.

    I also tried to replace blocking nrf_delay_ms() calls with RTC based events, but the same behavior persists.

    Not exactly sure what you mean by this:
    "You could test the application in IRQ mode, with the event queue disabled to see if that changes anything."

    Should IRQ be disabled at some state of the program?

    Anyway I have attached my updated version here. Only modified main.c 
    usb-test-packed-2.tgz


    Best regards / Peter

  • Another engineer took a quick look and pointed out that you are having NRF_LOG_FLUSH() in the USB event handler, which would cause delay in interrupt execution, potentially caused timing issues.

    Could you please disable logging entirely and run a test?

  • Ok, yes I tried both to comment out all logging in usb.c i.e. in all eventhandlers and also tried to disable in sdk_config (NRF_LOG_ENABLED = 0), but it seems to behave as before.

    When I run this on Ubuntu 20.04 the "working_sample" continues i.e. transmission completes with multiple transmissions. While "not_working_sample" does not. 

    This is the code I used in this test.
    usb-test-packed-4.tgz

    I also tried to detect USB device on a newly installed WIndows 10 Home machine, but that behaves like the previous one. I got a short flash something like "Detected new USB device USB CDC PALOS", but it is not detected in Device Manager. On a collegues Windows it works though. I don't know why this differ.

  • Hi Peter,

    Just letting you know I am still on this case. We have been in a shorthanded situation, and it's been difficult for me to allocate the amount of time this case deserves.

    I am sorry for the inconvenience. I will try to get to it as soon as I could.

  • 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

Reply
  • 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

Children
No Data
Related