@@ -50,10 +50,13 @@ void Uart::end()
5050{
5151 sercom->resetUART ();
5252 rxBuffer.clear ();
53+ txBuffer.clear ();
5354}
5455
5556void Uart::flush ()
5657{
58+ while (txBuffer.available ()); // wait until TX buffer is empty
59+
5760 sercom->flushUART ();
5861}
5962
@@ -63,6 +66,16 @@ void Uart::IrqHandler()
6366 rxBuffer.store_char (sercom->readDataUART ());
6467 }
6568
69+ if (sercom->isDataRegisterEmptyUART ()) {
70+ if (txBuffer.available ()) {
71+ uint8_t data = txBuffer.read_char ();
72+
73+ sercom->writeDataUART (data);
74+ } else {
75+ sercom->disableDataRegisterEmptyInterruptUART ();
76+ }
77+ }
78+
6679 if (sercom->isUARTError ()) {
6780 sercom->acknowledgeUARTError ();
6881 // TODO: if (sercom->isBufferOverflowErrorUART()) ....
@@ -79,7 +92,7 @@ int Uart::available()
7992
8093int Uart::availableForWrite ()
8194{
82- return (sercom-> isDataRegisterEmptyUART () ? 1 : 0 );
95+ return txBuffer. availableForStore ( );
8396}
8497
8598int Uart::peek ()
@@ -94,7 +107,16 @@ int Uart::read()
94107
95108size_t Uart::write (const uint8_t data)
96109{
97- sercom->writeDataUART (data);
110+ if (sercom->isDataRegisterEmptyUART () && txBuffer.available () == 0 ) {
111+ sercom->writeDataUART (data);
112+ } else {
113+ while (txBuffer.isFull ()); // spin lock until a spot opens up in the buffer
114+
115+ txBuffer.store_char (data);
116+
117+ sercom->enableDataRegisterEmptyInterruptUART ();
118+ }
119+
98120 return 1 ;
99121}
100122
0 commit comments