USB CDC ACM: fix sending loop (and spacing)
This commit is contained in:
parent
5b0523f751
commit
e32e27100d
@ -358,13 +358,12 @@ static void usb_cdcacm_data_tx_cb(usbd_device *usbd_dev, uint8_t ep)
|
||||
uint16_t usb_length = (tx_used > USB_DATA_TRANSFER_SIZE ? USB_DATA_TRANSFER_SIZE : tx_used); // length of data to be transmitted (respect max packet size)
|
||||
usb_length = (usb_length > (LENGTH(tx_buffer) - tx_i) ? LENGTH(tx_buffer) - tx_i : usb_length); // since here we use the source array not as ring buffer, only go up to the end
|
||||
usb_length = usbd_ep_write_packet(usb_device, 0x82, (void*)(&tx_buffer[tx_i]), usb_length); // transmit data (put into USB FIFO)
|
||||
tx_i = (tx_i + usb_length)%LENGTH(tx_buffer); // update location on buffer
|
||||
tx_i = (tx_i + usb_length) % LENGTH(tx_buffer); // update location on buffer
|
||||
tx_used -= usb_length; // update used size
|
||||
tx_lock = false; // release lock
|
||||
} else {
|
||||
usbd_ep_write_packet(usb_device, usb_cdcacm_data_endpoints[1].bEndpointAddress, NULL, 0); // trigger empty tx for a later callback
|
||||
}
|
||||
usbd_poll(usb_device); // ensure the data gets sent
|
||||
}
|
||||
|
||||
/** USB CDC ACM communication callback
|
||||
@ -427,12 +426,12 @@ void usb_cdcacm_putchar(char c)
|
||||
}
|
||||
while (tx_lock); // wait for lock to be released
|
||||
tx_lock = true; // put lock on transmit buffer
|
||||
if (tx_used<LENGTH(tx_buffer)) { // buffer not full
|
||||
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // put character in buffer
|
||||
if (tx_used < LENGTH(tx_buffer)) { // buffer not full
|
||||
tx_buffer[(tx_i + tx_used) % LENGTH(tx_buffer)] = c; // put character in buffer
|
||||
tx_used++; // update used buffer
|
||||
} else { // buffer full (might be that no terminal is connected to this serial)
|
||||
tx_i = (tx_i+1)%LENGTH(tx_buffer); // shift start
|
||||
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // overwrite old data
|
||||
tx_i = (tx_i + 1) % LENGTH(tx_buffer); // shift start
|
||||
tx_buffer[(tx_i + tx_used) % LENGTH(tx_buffer)] = c; // overwrite old data
|
||||
}
|
||||
tx_lock = false; // release lock on transmit buffer
|
||||
usb_cdcacm_data_tx_cb(NULL, 0); // send data over USB when possible
|
||||
|
Loading…
Reference in New Issue
Block a user