@@ -168,7 +168,7 @@ int UARTClass::read( void )
168
168
169
169
void UARTClass::flush ( void )
170
170
{
171
- while (_tx_buffer->_iHead != _tx_buffer->_iTail ); // wait for transmit data to be sent
171
+ while (_tx_buffer->_iHead != *( volatile int *)&( _tx_buffer->_iTail ) ); // wait for transmit data to be sent
172
172
// Wait for transmission to complete
173
173
while (!uart_tx_complete (CONFIG_UART_CONSOLE_INDEX));
174
174
}
@@ -179,11 +179,11 @@ size_t UARTClass::write( const uint8_t uc_data )
179
179
return (0 );
180
180
181
181
// Is the hardware currently busy?
182
- if (_tx_buffer->_iTail != _tx_buffer->_iHead )
182
+ if (_tx_buffer->_iTail != _tx_buffer->_iHead || ! uart_tx_ready (CONFIG_UART_CONSOLE_INDEX) )
183
183
{
184
184
// If busy we buffer
185
185
int l = (_tx_buffer->_iHead + 1 ) % SERIAL_BUFFER_SIZE;
186
- while (_tx_buffer->_iTail == l)
186
+ while (*( volatile int *)&( _tx_buffer->_iTail ) == l)
187
187
; // Spin locks if we're about to overwrite the buffer. This continues once the data is sent
188
188
189
189
_tx_buffer->_aucBuffer [_tx_buffer->_iHead ] = uc_data;
@@ -201,17 +201,22 @@ size_t UARTClass::write( const uint8_t uc_data )
201
201
202
202
void UARTClass::IrqHandler ( void )
203
203
{
204
- uint8_t uc_data ;
205
- int ret;
206
- ret = uart_poll_in ( CONFIG_UART_CONSOLE_INDEX, &uc_data);
207
-
208
- while ( ret != - 1 ) {
209
- _rx_buffer-> store_char (uc_data) ;
204
+ uart_irq_update (CONFIG_UART_CONSOLE_INDEX) ;
205
+ // if irq is Receiver Data Available
206
+ if ( uart_irq_rx_ready ( CONFIG_UART_CONSOLE_INDEX))
207
+ {
208
+ uint8_t uc_data;
209
+ int ret ;
210
210
ret = uart_poll_in (CONFIG_UART_CONSOLE_INDEX, &uc_data);
211
+
212
+ while ( ret != -1 ) {
213
+ _rx_buffer->store_char (uc_data);
214
+ ret = uart_poll_in (CONFIG_UART_CONSOLE_INDEX, &uc_data);
215
+ }
211
216
}
212
217
213
- // Do we need to keep sending data?
214
- if (! uart_irq_tx_ready (CONFIG_UART_CONSOLE_INDEX))
218
+ // if irq is Transmitter Holding Register
219
+ else if ( uart_irq_tx_ready (CONFIG_UART_CONSOLE_INDEX))
215
220
{
216
221
if (_tx_buffer->_iTail != _tx_buffer->_iHead ) {
217
222
uart_poll_out (CONFIG_UART_CONSOLE_INDEX, _tx_buffer->_aucBuffer [_tx_buffer->_iTail ]);
0 commit comments