NRF_LOG_INFO output problem (output is not what actually provided)

First of all,I don't study the LOG module yet,just copy & paste from example.

I'm trying to process APP_USBD_CDC_ACM_USER_EVT_RX_DONE event,print debug info to monitor the execution.

This is the buffer to receive data from USB,5 bytes max per time,reserve 1 byte for '\0':

static char m_rx_buffer[5+1];
 

Limit the packet size to 5 bytes to test the code:

case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:
{
    ret_code_t ret;
			
	//test : pkt len = 5
	//it should can process data len bigger than 5
			
	const uint8_t bufferLen = 5;
	char buffer[50]={0};
	buffer[0] = m_rx_buffer[0];
	char* p = buffer + 1 ;
	uint8_t cntToreadPertime,cntRead;
				
    uint16_t waitingCharCount = app_usbd_cdc_acm_bytes_stored(p_cdc_acm);
    NRF_LOG_INFO("Bytes waiting: %d",waitingCharCount );

	NRF_LOG_INFO("1st byte: %c",m_rx_buffer[0] );
	
	if(waitingCharCount>0){
		while(true){
			if(waitingCharCount>bufferLen){
				cntToreadPertime = bufferLen;
				waitingCharCount -= bufferLen;
			}else{
				cntToreadPertime = waitingCharCount;
				waitingCharCount = 0;
			}
			
			NRF_LOG_INFO("read: %d chars",cntToreadPertime );
			for(int i=0;i<sizeof(m_rx_buffer);i++)
				m_rx_buffer[i] = 0;
			ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, m_rx_buffer, cntToreadPertime);
			
			if(ret == NRF_SUCCESS){
				cntRead = app_usbd_cdc_acm_rx_size(p_cdc_acm);
				
				NRF_LOG_INFO("have read in %d chars : %s",cntRead,m_rx_buffer );
				
				memcpy(p,m_rx_buffer,cntRead);
				p += cntRead;
				
				if(cntRead<cntToreadPertime){
					NRF_LOG_INFO("what read out is less than want: %d < %d",cntRead,cntToreadPertime );
					waitingCharCount = app_usbd_cdc_acm_bytes_stored(p_cdc_acm);
					NRF_LOG_INFO("refresh waiting bytes: %d",waitingCharCount );
				}
			}else{
				//what to do? error triggered
				NRF_LOG_WARNING("return of app_usbd_cdc_acm_read() is error: %d,it should be 0",ret );
				break;
			}
			
			//exit,
			if(waitingCharCount == 0){
				break;
			}
			
		}//while(true)
		
	}//if(waitingCharCount>0)
	
	//waiting for following data
	//if error happened?
	app_usbd_cdc_acm_read(&m_app_cdc_acm, m_rx_buffer, 1);

	NRF_LOG_INFO("All bytes: %s",buffer );
	NRF_LOG_INFO("APP_USBD_CDC_ACM_USER_EVT_RX_DONE"); 
	
	UNUSED_VARIABLE(ret);
    UNUSED_VARIABLE(waitingCharCount);
    break;
}

Debug info is not right if data count from USB is bigger than 6:

7 bytes data means:

1) 1 byte returned by previous call to app_usbd_cdc_acm_read();

2) 5 bytes returned by current 1st call to app_usbd_cdc_acm_read();

3) 1 byte returned by current 2nd call to app_usbd_cdc_acm_read();

But the actual output like this(send string: "2345678"):

<info> app: APP_USBD_CDC_ACM_USER_EVT_PORT_OPEN
<info> app: Bytes waiting: 6
<info> app: 1st byte: 2
<info> app: read: 5 chars
<info> app: have read in 5 chars : 8
<info> app: read: 1 chars
<info> app: have read in 1 chars : 8
<info> app: All bytes: 
<info> app: APP_USBD_CDC_ACM_USER_EVT_RX_DONE

We can see the the info for 1st call is wrong, it is same with 2nd call,and no info for whole string("2345678").

I have traced the code,the returned data are right.

I thought the reason:

1)this is based on event processing model, the real process should delay for some time;

2)when real process executed,the data in variable has been changed(m_rx_buffer will keep the last data:"8" )

But I don't think the real data not buffered by LOG module.

How to do it? 

Related