Niklas G. schrieb:
> Ob der Port in einer Anwendung geöffnet ist oder nicht weiß die
> CDC-Firmware doch überhaupt nicht
Offenbar weiß sie das zumindest nach einem Timeout. Auszug aus
USBSerial.cpp:
1 | size_t USBSerial::write(const uint8_t *buffer, size_t size)
|
2 | {
|
3 | size_t rest = size;
|
4 | while (rest > 0 && CDC_connected()) {
|
5 | // Determine buffer size available for write
|
6 | auto portion = (size_t)CDC_TransmitQueue_WriteSize(&TransmitQueue);
|
7 | // Truncate it to content size (if rest is greater)
|
8 | if (rest < portion) {
|
9 | portion = rest;
|
10 | }
|
11 | if (portion > 0) {
|
12 | // Only if some space in the buffer exists.
|
13 | // TS: Only main thread calls write and writeSize methods,
|
14 | // it's thread-safe since IRQ does not affects
|
15 | // TransmitQueue write position
|
16 | CDC_TransmitQueue_Enqueue(&TransmitQueue, buffer, portion);
|
17 | rest -= portion;
|
18 | buffer += portion;
|
19 | // After storing data, start transmitting process
|
20 | CDC_continue_transmit();
|
21 | }
|
22 | }
|
23 | return size - rest;
|
24 | }
|
Auszug aus usbd_cdc_if.c:
1 | bool CDC_connected()
|
2 | {
|
3 | /* Save the transmitStart value in a local variable to avoid twice reading - fix #478 */
|
4 | uint32_t transmitTime = transmitStart;
|
5 | if (transmitTime) {
|
6 | transmitTime = HAL_GetTick() - transmitTime;
|
7 | }
|
8 | return ((hUSBD_Device_CDC.dev_state == USBD_STATE_CONFIGURED)
|
9 | && (transmitTime < USB_CDC_TRANSMIT_TIMEOUT)
|
10 | && dtrState);
|
11 | }
|
Die Abfrage von CDC_connected() ist wohl dafür entscheidend, dass der
Ausgabepuffer nicht mehr voll läuft, wenn der Port geschlossen ist.
Aber eigentlich würde ich gerne klären, warum es heute mit dem cat
Befehl funktioniert, vor ein paar Monaten aber nicht. Falls jemand dazu
etwas weiß, wäre super.