UART SERIAL BUFFER CLEAR / FLUSH(). There is no direct function to clear UART buffer in Mbed, Trick require to handle this situation. Simple way is mentioned in this program to clear Rx buffer of UART. Jaydeep shah - radhey04ec@gmail.com

main.cpp

Committer:
radhey04ec
Date:
2020-07-24
Revision:
0:3355c5b6d8fd

File content as of revision 0:3355c5b6d8fd:

//UART FLUSH()

// This program is further improvement of circular buffer concepts
/* Note : In Serial class library /or RawSerial class library there is no flush() command.
Sometimes buffer clearing process require when you want to compare receiving data with pre-stored value
or when doing some string related operation, because if you not clear UART buffer you will get old stored data.
*/

/*Note : simple way to clear Buffer : Read it , & reset all UART process related counter.*/

//PROGRAM SUBJECT : UART BUFFER CLEAR / FLUSH()
//Date : 24 July 2020 Version 1.0
//JAYDEEP SHAH -- radhey04ec@gmail.com

// I am sending one by one characters to slave and slave provide response according it , Ex : 'T' = Test Mode

#include "mbed.h"
#define BUFFER_SIZE 90   //SIZE OF BUFFER   ---DEPENDS ON YOUR DATA SIZE  --This is circular buffer

char rxBuffer[BUFFER_SIZE];  //CREATE CIRCULAR BUFFER  -- TO STORE RECEIVE DATA

unsigned int bufferReadingIndex=0;  //CREATE POINTER TO READ DATA FROM UART AND STORE INTO ARRAY

unsigned int i=0; //counter to read data from buffer Array

// 0 - Rx - PA_0   : Board Tx ___ Arduino Connector socket >>> First_pin _Orange  -- If FTDI CABLE USE
// 1 - Tx - PA_1   : Board Rx ____ Arduino connector socket  >>> Second_pin _red  -- If FTDI CABLE USE

//If you use only Serial calss , there is chance of damage OS because of MUTEX GUARD

//use RawSerial class
RawSerial UT(PA_0,PA_1);  //UART PIN DECLARATION
RawSerial pc(USBTX,USBRX);  //HOST PC TERMINAL  - 9600 BAUD WITH 8-N-1 STTING

//NOTE : UT OBJ FOR SLAVE BOARD & pc OBJ FOR TERMINAL

//DEFINE Rx Interrupt function --DECLARATION
void RxInterrupt(void);

//Function that read response data
void response(void);

//FLUSH() UART

void FLUSH(void); //Function declaration only

int main()
{
UT.baud(57600);  //BAUD RATE SETTING
UT.format(8,Serial::None,1);   //FORMAT OF UART COMMUNICATION

//INTERRUPT ATTACHMENT WHEN RECEIVE DATA
UT.attach(&RxInterrupt,Serial::RxIrq);

pc.printf("\n TESTING TURN ON : \n");
wait(1);

UT.putc('T');  //ENTER IN TEST MODE  -- SLAVE BOARD ENTER INTO TEST MODE
wait(0.5);
response();  //Read Response from Slave 
FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA

ThisThread::sleep_for(1000);

UT.putc('d');   // RED LED OF SLAVE BOARD ON
wait(1);
response(); //Read Response from Slave
FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
ThisThread::sleep_for(5000);


UT.putc('b');  // RED LED OF SLAVE BOARD OFF
wait(1);
response();  //Read Response from slave
FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
ThisThread::sleep_for(1000);

UT.putc('Q');  //QUIT FROM TEST MODE -- NORMAL MODE SELECT
wait(1);
response();//Read response from Slave
FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
ThisThread::sleep_for(3000);

while(1)
{
}

}


void RxInterrupt()      //if Rx buffer have data --- Interrupt call
{
    if(UT.readable())  //IF data available
    {
        rxBuffer[bufferReadingIndex++] = UT.getc();   // read and store into Buffer
        if(bufferReadingIndex >= BUFFER_SIZE)  // If limit cross
        {
            bufferReadingIndex =0; // RESET CONTER
        }
    }
}

void response()  //FUNCTION TO READ DATA
{
    char rxByte;

    while(i != bufferReadingIndex)  //READ WHILE COMPLETE DATA NOT RECEIVED
    {
        rxByte = rxBuffer[i];  //READ DATA ONE BY ONE CHARACTER
        pc.putc(rxByte); // SEND ON TERMINAL
        i++;  //COUNTER INCREMENT
        
        if(i >= BUFFER_SIZE) //IF LIMIT CROSS
        {
            i = 0;   //RESET COUNTER
        }
    }
}

void FLUSH()            //FLUSH FUNCTIONS
{
    RxInterrupt(); // This is because read data if something available in UART buffer
    
    //Counters which are related with UART reading process make it zero again
    i = 0U;
    bufferReadingIndex = 0U;   
    
}