65 lines
1.7 KiB
C++
65 lines
1.7 KiB
C++
/*
|
|
bridge USB-serial to hardware-serial
|
|
|
|
for Arduinos based on ATmega32u4 (Leonardo and compatible Pro Micro, Micro)
|
|
hardware serial is configured with baud-rate, databits, stopbits, parity as send over USB
|
|
|
|
see https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/cores/arduino
|
|
-> CDC.cpp|HardwareSerial.cpp for serial implementation details
|
|
|
|
this sketch is mainly for demonstration / test of CDC communication
|
|
performance as real usb-serial bridge would be inacceptable as each byte is send in separate USB packet
|
|
*/
|
|
|
|
uint32_t baud = 9600;
|
|
uint8_t databits = 8;
|
|
uint8_t stopbits = 1;
|
|
uint8_t parity = 0;
|
|
|
|
void setup() {
|
|
Serial.begin(baud); // USB
|
|
Serial1.begin(baud, SERIAL_8N1);
|
|
}
|
|
|
|
void loop() {
|
|
// show USB connected state
|
|
if (Serial) TXLED1;
|
|
else TXLED0;
|
|
|
|
// configure hardware serial
|
|
if (Serial.baud() != baud ||
|
|
Serial.numbits() != databits ||
|
|
Serial.stopbits() != stopbits ||
|
|
Serial.paritytype() != parity) {
|
|
baud = Serial.baud();
|
|
databits = Serial.numbits();
|
|
stopbits = Serial.stopbits();
|
|
parity = Serial.paritytype();
|
|
uint8_t config = 0; // ucsrc register
|
|
switch (databits) {
|
|
case 5: break;
|
|
case 6: config |= 2; break;
|
|
case 7: config |= 4; break;
|
|
case 8: config |= 6; break;
|
|
default: config |= 6;
|
|
}
|
|
switch (stopbits) {
|
|
case 2: config |= 8;
|
|
// 1.5 stopbits not supported
|
|
}
|
|
switch (parity) {
|
|
case 1: config |= 0x30; break; // odd
|
|
case 2: config |= 0x20; break; // even
|
|
// mark, space not supported
|
|
}
|
|
Serial1.end();
|
|
Serial1.begin(baud, config);
|
|
}
|
|
|
|
// bridge
|
|
if (Serial.available() > 0)
|
|
Serial1.write(Serial.read());
|
|
if (Serial1.available() > 0)
|
|
Serial.write(Serial1.read());
|
|
}
|