Added fushing functions and destructor

This commit is contained in:
BlackMark 2016-05-24 20:59:46 +02:00
parent 30c0269fca
commit 07474c7e19
2 changed files with 37 additions and 5 deletions

View File

@ -235,6 +235,20 @@ void USART0::setMode( Mode enmMode )
setUCSRC( ui8UCSRC ); setUCSRC( ui8UCSRC );
} }
//////////////////////////////////////////////////////////////////////////
USART0::~USART0()
{
flushTransmit();
setBaudRate( 0 );
setRXState( false );
setTXState( false );
setRXInterrupt( false );
setUDREInterrupt( false );
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
USART0& USART0::inst() USART0& USART0::inst()
{ {
@ -278,7 +292,7 @@ bool USART0::receiveByte( uint8_t &ui8Data )
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
bool USART0::receiveByte( uint8_t &ui8Data, uint16_t ui16DelayMS ) bool USART0::receiveByte( uint8_t &ui8Data, uint16_t ui16TimeoutMS )
{ {
uint16_t ui16DelayCounter = 0; uint16_t ui16DelayCounter = 0;
@ -286,7 +300,7 @@ bool USART0::receiveByte( uint8_t &ui8Data, uint16_t ui16DelayMS )
{ {
_delay_ms( 1 ); _delay_ms( 1 );
if( ui16DelayCounter++ >= ui16DelayMS ) if( ui16DelayCounter++ >= ui16TimeoutMS )
{ {
return false; return false;
} }
@ -317,6 +331,14 @@ bool USART0::receiveLine( char *szBuffer, size_t sizeBufferLength, const char *s
return false; return false;
} }
//////////////////////////////////////////////////////////////////////////
void USART0::flushReceive( uint16_t ui16TimeoutMS )
{
uint8_t ui8Received;
while( receiveByte( ui8Received, ui16TimeoutMS ) );
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
void USART0::transmitByte( uint8_t ui8Data ) void USART0::transmitByte( uint8_t ui8Data )
{ {
@ -359,6 +381,12 @@ void USART0::transmitString( const char *szString )
} }
} }
//////////////////////////////////////////////////////////////////////////
void USART0::flushTransmit()
{
while( m_vsizeTXBufferHead != m_vsizeTXBufferTail && !( *m_vui8pUCSRA & ( 1 << UDRE_D ) ) );
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
void USART0::receiveInterruptHandler() void USART0::receiveInterruptHandler()
{ {

View File

@ -1,7 +1,7 @@
/* /*
* Copyright (c) by BlackMark 2015-2016 * Copyright (c) by BlackMark 2015-2016
* Date 21/05/2016 * Date 22/05/2016
* Version 2.7 * Version 2.8
*/ */
#ifndef USART_H #ifndef USART_H
@ -128,6 +128,8 @@ private:
void setStopBits( StopBit enmStopBits ); void setStopBits( StopBit enmStopBits );
void setMode( Mode enmMode ); void setMode( Mode enmMode );
~USART0();
public: public:
static USART0& inst(); static USART0& inst();
USART0( const USART0& ) = delete; USART0( const USART0& ) = delete;
@ -136,11 +138,13 @@ public:
void init( uint32_t ui32BaudRate = 9600, uint8_t ui8DataBits = 8, Parity enmParity = Parity::DISABLED, StopBit enmStopBits = StopBit::ONE, Mode enmMode = Mode::ASYNCHRONOUS ); void init( uint32_t ui32BaudRate = 9600, uint8_t ui8DataBits = 8, Parity enmParity = Parity::DISABLED, StopBit enmStopBits = StopBit::ONE, Mode enmMode = Mode::ASYNCHRONOUS );
bool receiveByte( uint8_t &ui8Data ); bool receiveByte( uint8_t &ui8Data );
bool receiveByte( uint8_t &ui8Data, uint16_t ui16DelayMS ); bool receiveByte( uint8_t &ui8Data, uint16_t ui16TimeoutMS );
bool receiveLine( char *szBuffer, size_t sizeBufferLength, const char *szLineTerminator = "\r\n" ); bool receiveLine( char *szBuffer, size_t sizeBufferLength, const char *szLineTerminator = "\r\n" );
void flushReceive( uint16_t ui16TimeoutMS );
void transmitByte( uint8_t ui8Data ); void transmitByte( uint8_t ui8Data );
void transmitString( const char *szString ); void transmitString( const char *szString );
void flushTransmit();
void receiveInterruptHandler(); void receiveInterruptHandler();
void transmitInterruptHandler(); void transmitInterruptHandler();