X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/0bcc82ac28ef9461f04e47f0b0885ee156d926f9..ca007f91f2aa959a738649d35becb54cb1efc8b8:/Projects/USBtoSerial/USBtoSerial.c diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c index 918986883..b59a3648f 100644 --- a/Projects/USBtoSerial/USBtoSerial.c +++ b/Projects/USBtoSerial/USBtoSerial.c @@ -84,7 +84,7 @@ int main(void) /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ for (uint8_t DataBytesRem = CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); DataBytesRem != 0; DataBytesRem--) { - if (!(BUFFER_SIZE - USBtoUSART_Buffer.Count)) + if (RingBuffer_IsFull(&USBtoUSART_Buffer)) break; RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); @@ -120,12 +120,11 @@ void SetupHardware(void) clock_prescale_set(clock_div_1); /* Hardware Initialization */ - Serial_Init(9600, false); LEDs_Init(); USB_Init(); - /* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */ - TCCR0B = ((1 << CS02) | (1 << CS00)); + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ + TCCR0B = (1 << CS02); } /** Event handler for the library USB Connection event. */ @@ -199,9 +198,17 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); break; } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1A = 0; + UCSR1B = 0; + UCSR1C = 0; + + /* Set the new baud rate before configuring the USART */ + UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ UCSR1A = (1 << U2X1); UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); - UCSR1C = ConfigMask; - UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + UCSR1C = ConfigMask; }