Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 1:4486f14a88ad
- Parent:
- 0:2a0d1131965d
- Child:
- 2:416bbbc23e82
--- a/main.cpp Thu Mar 12 22:12:29 2015 +0000 +++ b/main.cpp Sun Mar 22 13:31:00 2015 +0000 @@ -1,68 +1,68 @@ +/********************************************************************************** +* @file main.cpp +* @author Petr Dousa +* @version V1.00 +* @date 22-March-2015 +* @brief Every 1 second push to serial message and read from serial integer number +* Serial speed is set to 115200. +***********************************************************************************/ + +/* Includes ----------------------------------------------------------------------*/ #include "mbed.h" -//------------------------------------ -// Hyperterminal configuration -// 9600 bauds, 8-bit data, no parity -//------------------------------------ +/* Defines -----------------------------------------------------------------------*/ +#define buffer_size 256 // incoming buffer size +#define buffer_fill buffer_size+1 // number, when buffer is ready + +/* Function prototypes -----------------------------------------------------------*/ +void serialRx(); +int serialGetBuffer(char * data); +/* Variables ---------------------------------------------------------------------*/ +// help variables for incoming data +char serial_buffer[buffer_size]; // buffer to save incoming data +char serial_buffer2[buffer_size]; // second buffer to save incoming data +int serial_buffer_where=0; // index array for buffer +int serial_buffer2_where=0; // index array for second buffer +bool serial_end_line = false; // searching for end line + +//mbed - initialization of peripherals Serial pc(SERIAL_TX, SERIAL_RX); DigitalOut myled(LED1); -// definice a promenne pro prijem dat -#define buffer_size 256 -#define buffer_fill buffer_size+1 -char serial_buffer[buffer_size]; -char serial_buffer2[buffer_size]; -int serial_buffer_where=0; -int serial_buffer2_where=0; -void serialRx(); -int serialGetBuffer(char * data); -bool serial_end_line = false; - -//pole prijatych znaku -char prijata_data[buffer_size]; +/* Functions----------------------------------------------------------------------*/ -int main() -{ - int i = 1; - int j = 0; - pc.attach(&serialRx,Serial::RxIrq); // preruseni pro prijem znaku z UART - - pc.printf("Hello World !\n"); - while(1) { - wait(1); - if(serialGetBuffer(prijata_data)) { // prijmout char buffer z UART komunikace - sscanf (prijata_data,"%d",&j); // pouziti sscanf pro hledani prvniho cisla - pc.printf("From PC:%d.\n" ,j); - } else { - pc.printf("This program runs since %d seconds.\n", i++); - } - myled = !myled; - } -} - -// preruseni pro prijem dat z UART +/******************************************************************************* +* Function Name : serialRx. +* Description : Incoming interruption fom serial. Fill two buffers with +* incoming data and prepare it to serialGetBuffer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ void serialRx() { - while(pc.readable()) { - char character=pc.getc(); - if(((int)character==10 || (int)character==13) && serial_end_line) { // jine konce radku, prizpusobeni - serial_end_line=false; + while(pc.readable()) { // read all data from serial + char character=pc.getc(); // get a char form serial + if(((int)character==10 || (int)character==13) && serial_end_line) { // search for end line /r or /n + serial_end_line=false; // end was find in previous char, so skip it continue; - }else{serial_end_line=false;} + } else { + serial_end_line=false; // clear serial_end_line flag + } if(serial_buffer_where!=buffer_fill) { serial_buffer[serial_buffer_where++]=character; - if(serial_buffer_where==buffer_size) { // kontrola nepreteceni bufferu - serial_buffer[buffer_size-1]='\0'; - serial_buffer_where=buffer_fill; + if(serial_buffer_where==buffer_size) { // check if incoming data are smaller than buffe size + serial_buffer[buffer_size-1]='\0'; // posibility to lost data, if the incoming data are too big + serial_buffer_where=buffer_fill; // set index array to indicate buffer fill return; } - if(character==13 || character==10) { // ukonceni a pripraveni bufferu - serial_buffer[serial_buffer_where-1]='\0'; - serial_buffer_where=buffer_fill; - serial_end_line=true; + if(character==13 || character==10) { // if end of line (\r \n) is indicate, prepare the buffer to serialGetBuffer + serial_buffer[serial_buffer_where-1]='\0'; // set end of buffer with 0 + serial_buffer_where=buffer_fill; // set index array to indicate buffer fill + serial_end_line=true; // end of line was find, set serial_end_line flag } - } else if(serial_buffer2_where!=buffer_fill) { + } else if(serial_buffer2_where!=buffer_fill) { // same for second buffer serial_buffer2[serial_buffer2_where++]=character; if(serial_buffer2_where==buffer_size) { serial_buffer2[buffer_size-1]='\0'; @@ -74,23 +74,25 @@ serial_buffer2_where=buffer_fill; serial_end_line=true; } - } /*else { + } /*else { // buffer are fill and data are lost while(!pc.writeable()); pc.printf("Code is too slow!\n"); - //pc.printf("I get: \"%c\", v deci: %d\n",character,(int)character); + //pc.printf("I get: \"%c\", DEC: %d\n",character,(int)character); }*/ } } - -//vstup pole stejné velikosti jako buffery -// návrat int - 0 - žádná přijatá data -// - 1 - přijatá data -// - 2 - dvoje přijatá data, pravděpodobnost nezaznamenání dalších dat +/******************************************************************************* +* Function Name : serialGetBuffer. +* Description : Timer overflow handle. Blinks the LED. +* Input : Char array with size buffer_size. +* Output : Char array with incoming data. +* Return : 0 - on no data, 1 - one buffer is fill, 2 -two buffers are fill (posibility to lost data) +*******************************************************************************/ int serialGetBuffer(char * data) { if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) { - memcpy(data, serial_buffer, strlen(serial_buffer)+1); + memcpy(data, serial_buffer, strlen(serial_buffer)+1); serial_buffer_where=0; return 2; } else if(serial_buffer2_where==buffer_fill) { @@ -106,3 +108,34 @@ } } +/*********************************************************************************** +* Function Name : main. +* Description : Main routine. +* Input : None. +* Output : None. +* Return : None. +***********************************************************************************/ +int main() +{ + int i = 1; + int j = 0; + + //array for incomng data to user + char prijata_data[buffer_size]; + + pc.baud(115200); // set serial speed to 115200 + pc.attach(&serialRx,Serial::RxIrq); // attach serialRx to incoming interruption + pc.printf("Hello World !\n"); + + while(1) { + wait(1); // wait 1 second + if(serialGetBuffer(prijata_data)) { // get char array from serial + sscanf (prijata_data,"%d",&j); // sscanf for searching integer + pc.printf("From PC:%d.\n" ,j); // write to serial incoming integer + } else { + pc.printf("This program runs since %d seconds.\n", i++); // write to serial some string + } + myled = !myled; // blink LED + } +} +