@@ -168,7 +168,7 @@ int UARTClass::read( void )
168168
169169void UARTClass::flush ( void )
170170{
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
172172 // Wait for transmission to complete
173173 while (!uart_tx_complete (CONFIG_UART_CONSOLE_INDEX));
174174}
@@ -179,11 +179,11 @@ size_t UARTClass::write( const uint8_t uc_data )
179179 return (0 );
180180
181181 // 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) )
183183 {
184184 // If busy we buffer
185185 int l = (_tx_buffer->_iHead + 1 ) % SERIAL_BUFFER_SIZE;
186- while (_tx_buffer->_iTail == l)
186+ while (*( volatile int *)&( _tx_buffer->_iTail ) == l)
187187 ; // Spin locks if we're about to overwrite the buffer. This continues once the data is sent
188188
189189 _tx_buffer->_aucBuffer [_tx_buffer->_iHead ] = uc_data;
@@ -201,17 +201,22 @@ size_t UARTClass::write( const uint8_t uc_data )
201201
202202void UARTClass::IrqHandler ( void )
203203{
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 ;
210210 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+ }
211216 }
212217
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))
215220 {
216221 if (_tx_buffer->_iTail != _tx_buffer->_iHead ) {
217222 uart_poll_out (CONFIG_UART_CONSOLE_INDEX, _tx_buffer->_aucBuffer [_tx_buffer->_iTail ]);
0 commit comments