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

Committer:
radhey04ec
Date:
Fri Jul 24 10:37:58 2020 +0000
Revision:
0:3355c5b6d8fd
UART FLUSH - FINAL COMMIT; PROGRAM TESTED AND COMPILED SUCCESSFULLY; ; JAYDEEP SHAH - radhey04ec@gmail.com

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radhey04ec 0:3355c5b6d8fd 1 //UART FLUSH()
radhey04ec 0:3355c5b6d8fd 2
radhey04ec 0:3355c5b6d8fd 3 // This program is further improvement of circular buffer concepts
radhey04ec 0:3355c5b6d8fd 4 /* Note : In Serial class library /or RawSerial class library there is no flush() command.
radhey04ec 0:3355c5b6d8fd 5 Sometimes buffer clearing process require when you want to compare receiving data with pre-stored value
radhey04ec 0:3355c5b6d8fd 6 or when doing some string related operation, because if you not clear UART buffer you will get old stored data.
radhey04ec 0:3355c5b6d8fd 7 */
radhey04ec 0:3355c5b6d8fd 8
radhey04ec 0:3355c5b6d8fd 9 /*Note : simple way to clear Buffer : Read it , & reset all UART process related counter.*/
radhey04ec 0:3355c5b6d8fd 10
radhey04ec 0:3355c5b6d8fd 11 //PROGRAM SUBJECT : UART BUFFER CLEAR / FLUSH()
radhey04ec 0:3355c5b6d8fd 12 //Date : 24 July 2020 Version 1.0
radhey04ec 0:3355c5b6d8fd 13 //JAYDEEP SHAH -- radhey04ec@gmail.com
radhey04ec 0:3355c5b6d8fd 14
radhey04ec 0:3355c5b6d8fd 15 // I am sending one by one characters to slave and slave provide response according it , Ex : 'T' = Test Mode
radhey04ec 0:3355c5b6d8fd 16
radhey04ec 0:3355c5b6d8fd 17 #include "mbed.h"
radhey04ec 0:3355c5b6d8fd 18 #define BUFFER_SIZE 90 //SIZE OF BUFFER ---DEPENDS ON YOUR DATA SIZE --This is circular buffer
radhey04ec 0:3355c5b6d8fd 19
radhey04ec 0:3355c5b6d8fd 20 char rxBuffer[BUFFER_SIZE]; //CREATE CIRCULAR BUFFER -- TO STORE RECEIVE DATA
radhey04ec 0:3355c5b6d8fd 21
radhey04ec 0:3355c5b6d8fd 22 unsigned int bufferReadingIndex=0; //CREATE POINTER TO READ DATA FROM UART AND STORE INTO ARRAY
radhey04ec 0:3355c5b6d8fd 23
radhey04ec 0:3355c5b6d8fd 24 unsigned int i=0; //counter to read data from buffer Array
radhey04ec 0:3355c5b6d8fd 25
radhey04ec 0:3355c5b6d8fd 26 // 0 - Rx - PA_0 : Board Tx ___ Arduino Connector socket >>> First_pin _Orange -- If FTDI CABLE USE
radhey04ec 0:3355c5b6d8fd 27 // 1 - Tx - PA_1 : Board Rx ____ Arduino connector socket >>> Second_pin _red -- If FTDI CABLE USE
radhey04ec 0:3355c5b6d8fd 28
radhey04ec 0:3355c5b6d8fd 29 //If you use only Serial calss , there is chance of damage OS because of MUTEX GUARD
radhey04ec 0:3355c5b6d8fd 30
radhey04ec 0:3355c5b6d8fd 31 //use RawSerial class
radhey04ec 0:3355c5b6d8fd 32 RawSerial UT(PA_0,PA_1); //UART PIN DECLARATION
radhey04ec 0:3355c5b6d8fd 33 RawSerial pc(USBTX,USBRX); //HOST PC TERMINAL - 9600 BAUD WITH 8-N-1 STTING
radhey04ec 0:3355c5b6d8fd 34
radhey04ec 0:3355c5b6d8fd 35 //NOTE : UT OBJ FOR SLAVE BOARD & pc OBJ FOR TERMINAL
radhey04ec 0:3355c5b6d8fd 36
radhey04ec 0:3355c5b6d8fd 37 //DEFINE Rx Interrupt function --DECLARATION
radhey04ec 0:3355c5b6d8fd 38 void RxInterrupt(void);
radhey04ec 0:3355c5b6d8fd 39
radhey04ec 0:3355c5b6d8fd 40 //Function that read response data
radhey04ec 0:3355c5b6d8fd 41 void response(void);
radhey04ec 0:3355c5b6d8fd 42
radhey04ec 0:3355c5b6d8fd 43 //FLUSH() UART
radhey04ec 0:3355c5b6d8fd 44
radhey04ec 0:3355c5b6d8fd 45 void FLUSH(void); //Function declaration only
radhey04ec 0:3355c5b6d8fd 46
radhey04ec 0:3355c5b6d8fd 47 int main()
radhey04ec 0:3355c5b6d8fd 48 {
radhey04ec 0:3355c5b6d8fd 49 UT.baud(57600); //BAUD RATE SETTING
radhey04ec 0:3355c5b6d8fd 50 UT.format(8,Serial::None,1); //FORMAT OF UART COMMUNICATION
radhey04ec 0:3355c5b6d8fd 51
radhey04ec 0:3355c5b6d8fd 52 //INTERRUPT ATTACHMENT WHEN RECEIVE DATA
radhey04ec 0:3355c5b6d8fd 53 UT.attach(&RxInterrupt,Serial::RxIrq);
radhey04ec 0:3355c5b6d8fd 54
radhey04ec 0:3355c5b6d8fd 55 pc.printf("\n TESTING TURN ON : \n");
radhey04ec 0:3355c5b6d8fd 56 wait(1);
radhey04ec 0:3355c5b6d8fd 57
radhey04ec 0:3355c5b6d8fd 58 UT.putc('T'); //ENTER IN TEST MODE -- SLAVE BOARD ENTER INTO TEST MODE
radhey04ec 0:3355c5b6d8fd 59 wait(0.5);
radhey04ec 0:3355c5b6d8fd 60 response(); //Read Response from Slave
radhey04ec 0:3355c5b6d8fd 61 FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
radhey04ec 0:3355c5b6d8fd 62
radhey04ec 0:3355c5b6d8fd 63 ThisThread::sleep_for(1000);
radhey04ec 0:3355c5b6d8fd 64
radhey04ec 0:3355c5b6d8fd 65 UT.putc('d'); // RED LED OF SLAVE BOARD ON
radhey04ec 0:3355c5b6d8fd 66 wait(1);
radhey04ec 0:3355c5b6d8fd 67 response(); //Read Response from Slave
radhey04ec 0:3355c5b6d8fd 68 FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
radhey04ec 0:3355c5b6d8fd 69 ThisThread::sleep_for(5000);
radhey04ec 0:3355c5b6d8fd 70
radhey04ec 0:3355c5b6d8fd 71
radhey04ec 0:3355c5b6d8fd 72 UT.putc('b'); // RED LED OF SLAVE BOARD OFF
radhey04ec 0:3355c5b6d8fd 73 wait(1);
radhey04ec 0:3355c5b6d8fd 74 response(); //Read Response from slave
radhey04ec 0:3355c5b6d8fd 75 FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
radhey04ec 0:3355c5b6d8fd 76 ThisThread::sleep_for(1000);
radhey04ec 0:3355c5b6d8fd 77
radhey04ec 0:3355c5b6d8fd 78 UT.putc('Q'); //QUIT FROM TEST MODE -- NORMAL MODE SELECT
radhey04ec 0:3355c5b6d8fd 79 wait(1);
radhey04ec 0:3355c5b6d8fd 80 response();//Read response from Slave
radhey04ec 0:3355c5b6d8fd 81 FLUSH(); // BEFORE SENDING /RECEIVING NEW DATA
radhey04ec 0:3355c5b6d8fd 82 ThisThread::sleep_for(3000);
radhey04ec 0:3355c5b6d8fd 83
radhey04ec 0:3355c5b6d8fd 84 while(1)
radhey04ec 0:3355c5b6d8fd 85 {
radhey04ec 0:3355c5b6d8fd 86 }
radhey04ec 0:3355c5b6d8fd 87
radhey04ec 0:3355c5b6d8fd 88 }
radhey04ec 0:3355c5b6d8fd 89
radhey04ec 0:3355c5b6d8fd 90
radhey04ec 0:3355c5b6d8fd 91 void RxInterrupt() //if Rx buffer have data --- Interrupt call
radhey04ec 0:3355c5b6d8fd 92 {
radhey04ec 0:3355c5b6d8fd 93 if(UT.readable()) //IF data available
radhey04ec 0:3355c5b6d8fd 94 {
radhey04ec 0:3355c5b6d8fd 95 rxBuffer[bufferReadingIndex++] = UT.getc(); // read and store into Buffer
radhey04ec 0:3355c5b6d8fd 96 if(bufferReadingIndex >= BUFFER_SIZE) // If limit cross
radhey04ec 0:3355c5b6d8fd 97 {
radhey04ec 0:3355c5b6d8fd 98 bufferReadingIndex =0; // RESET CONTER
radhey04ec 0:3355c5b6d8fd 99 }
radhey04ec 0:3355c5b6d8fd 100 }
radhey04ec 0:3355c5b6d8fd 101 }
radhey04ec 0:3355c5b6d8fd 102
radhey04ec 0:3355c5b6d8fd 103 void response() //FUNCTION TO READ DATA
radhey04ec 0:3355c5b6d8fd 104 {
radhey04ec 0:3355c5b6d8fd 105 char rxByte;
radhey04ec 0:3355c5b6d8fd 106
radhey04ec 0:3355c5b6d8fd 107 while(i != bufferReadingIndex) //READ WHILE COMPLETE DATA NOT RECEIVED
radhey04ec 0:3355c5b6d8fd 108 {
radhey04ec 0:3355c5b6d8fd 109 rxByte = rxBuffer[i]; //READ DATA ONE BY ONE CHARACTER
radhey04ec 0:3355c5b6d8fd 110 pc.putc(rxByte); // SEND ON TERMINAL
radhey04ec 0:3355c5b6d8fd 111 i++; //COUNTER INCREMENT
radhey04ec 0:3355c5b6d8fd 112
radhey04ec 0:3355c5b6d8fd 113 if(i >= BUFFER_SIZE) //IF LIMIT CROSS
radhey04ec 0:3355c5b6d8fd 114 {
radhey04ec 0:3355c5b6d8fd 115 i = 0; //RESET COUNTER
radhey04ec 0:3355c5b6d8fd 116 }
radhey04ec 0:3355c5b6d8fd 117 }
radhey04ec 0:3355c5b6d8fd 118 }
radhey04ec 0:3355c5b6d8fd 119
radhey04ec 0:3355c5b6d8fd 120 void FLUSH() //FLUSH FUNCTIONS
radhey04ec 0:3355c5b6d8fd 121 {
radhey04ec 0:3355c5b6d8fd 122 RxInterrupt(); // This is because read data if something available in UART buffer
radhey04ec 0:3355c5b6d8fd 123
radhey04ec 0:3355c5b6d8fd 124 //Counters which are related with UART reading process make it zero again
radhey04ec 0:3355c5b6d8fd 125 i = 0U;
radhey04ec 0:3355c5b6d8fd 126 bufferReadingIndex = 0U;
radhey04ec 0:3355c5b6d8fd 127
radhey04ec 0:3355c5b6d8fd 128 }