@@ -117,16 +117,39 @@ size_t USBCDC::setRxBufferSize(size_t rx_queue_len){
117
117
size_t currentQueueSize = rx_queue ?
118
118
uxQueueSpacesAvailable (rx_queue) + uxQueueMessagesWaiting (rx_queue) : 0 ;
119
119
120
- if (rx_queue && (!rx_queue_len || rx_queue_len != currentQueueSize)) {
121
- vQueueDelete (rx_queue);
122
- rx_queue = NULL ;
123
- }
124
- if (!rx_queue_len || rx_queue_len == currentQueueSize){
125
- return 0 ;
126
- }
127
- rx_queue = xQueueCreate (rx_queue_len, sizeof (uint8_t ));
128
- if (!rx_queue){
129
- return 0 ;
120
+ if (rx_queue_len != currentQueueSize) {
121
+ xQueueHandle new_rx_queue = NULL ;
122
+ if (rx_queue_len) {
123
+ new_rx_queue = xQueueCreate (rx_queue_len, sizeof (uint8_t ));
124
+ if (!new_rx_queue){
125
+ log_e (" CDC Queue creation failed." );
126
+ return 0 ;
127
+ }
128
+ if (rx_queue) {
129
+ size_t copySize = uxQueueMessagesWaiting (rx_queue);
130
+ if (copySize > 0 ) {
131
+ for (size_t i = 0 ; i < copySize; i++) {
132
+ uint8_t ch = 0 ;
133
+ xQueueReceive (rx_queue, &ch, 0 );
134
+ if (!xQueueSend (new_rx_queue, &ch, 0 )) {
135
+ arduino_usb_cdc_event_data_t p;
136
+ p.rx_overflow .dropped_bytes = copySize - i;
137
+ arduino_usb_event_post (ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_OVERFLOW_EVENT, &p, sizeof (arduino_usb_cdc_event_data_t ), portMAX_DELAY);
138
+ log_e (" CDC RX Overflow." );
139
+ break ;
140
+ }
141
+ }
142
+ }
143
+ vQueueDelete (rx_queue);
144
+ }
145
+ rx_queue = new_rx_queue;
146
+ return rx_queue_len;
147
+ } else {
148
+ if (rx_queue) {
149
+ vQueueDelete (rx_queue);
150
+ rx_queue = NULL ;
151
+ }
152
+ }
130
153
}
131
154
return rx_queue_len;
132
155
}
@@ -249,26 +272,19 @@ void USBCDC::_onLineCoding(uint32_t _bit_rate, uint8_t _stop_bits, uint8_t _pari
249
272
}
250
273
251
274
void USBCDC::_onRX (){
275
+ arduino_usb_cdc_event_data_t p;
252
276
uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE+1 ];
253
277
uint32_t count = tud_cdc_n_read (itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE);
254
-
255
- if (rx_queue == NULL ) {
256
- return ;
257
- }
258
- if (uxQueueSpacesAvailable (rx_queue) < count) {
259
- // this VTaskDelay gives, to Arduino's task, time to the CPU do its processing
260
- // without it, data may be lost when the number of bytes received is higher than CDC buffer size
261
- vTaskDelay (10 );
262
- }
263
278
for (uint32_t i=0 ; i<count; i++){
264
- if (!xQueueSend (rx_queue, buf+i, 0 )){
265
- // rx_queue overflow - data will be lost
279
+ if (rx_queue == NULL || !xQueueSend (rx_queue, buf+i, 10 )) {
280
+ p.rx_overflow .dropped_bytes = count - i;
281
+ arduino_usb_event_post (ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_OVERFLOW_EVENT, &p, sizeof (arduino_usb_cdc_event_data_t ), portMAX_DELAY);
282
+ log_e (" CDC RX Overflow." );
266
283
count = i;
267
284
break ;
268
285
}
269
286
}
270
287
if (count) {
271
- arduino_usb_cdc_event_data_t p;
272
288
p.rx .len = count;
273
289
arduino_usb_event_post (ARDUINO_USB_CDC_EVENTS, ARDUINO_USB_CDC_RX_EVENT, &p, sizeof (arduino_usb_cdc_event_data_t ), portMAX_DELAY);
274
290
}
0 commit comments