Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.

Dependencies:   mbed

Revision:
2:416bbbc23e82
Parent:
1:4486f14a88ad
Child:
3:e316c5e314e1
--- a/main.cpp	Sun Mar 22 13:31:00 2015 +0000
+++ b/main.cpp	Mon Apr 20 21:41:02 2015 +0000
@@ -16,7 +16,7 @@
 
 /* Function prototypes -----------------------------------------------------------*/
 void serialRx();
-int serialGetBuffer(char * data);
+int serialGetBuffer(char * & data);
 
 /* Variables ---------------------------------------------------------------------*/
 // help variables for incoming data
@@ -34,7 +34,7 @@
 
 /*******************************************************************************
 * Function Name  : serialRx.
-* Description    : Incoming interruption fom serial. Fill two buffers with 
+* Description    : Incoming interruption fom serial. Fill two buffers with
 *                   incoming data and prepare it to serialGetBuffer.
 * Input          : None.
 * Output         : None.
@@ -45,19 +45,19 @@
     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
+            serial_end_line=true;                                          // end was find in previous char, so skip it
             continue;
         } else {
             serial_end_line=false;                                          // clear serial_end_line flag
         }
-        if(serial_buffer_where!=buffer_fill) {
+        if(serial_buffer_where!=buffer_fill && !(serial_buffer2_where != 0 && serial_buffer2_where!=buffer_fill)/* && ( serial_buffer_where!=0 || (serial_buffer2_where !=0 && serial_buffer_where==0 ))*/) {
             serial_buffer[serial_buffer_where++]=character;
             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;
+                continue;
             }
-                if(character==13 || character==10) {                        // if end of line (\r \n) is indicate, prepare the buffer to serialGetBuffer
+            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
@@ -67,7 +67,7 @@
             if(serial_buffer2_where==buffer_size) {
                 serial_buffer2[buffer_size-1]='\0';
                 serial_buffer2_where=buffer_fill;
-                return;
+                continue;
             }
             if(character==13 || character==10) {
                 serial_buffer2[serial_buffer2_where-1]='\0';
@@ -89,18 +89,21 @@
 * 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)
+int serialGetBuffer(char * & data)
 {
     if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) {
-        memcpy(data, serial_buffer, strlen(serial_buffer)+1);
+        data=serial_buffer;
+        //memcpy(data, serial_buffer, strlen(serial_buffer)+1);
         serial_buffer_where=0;
         return 2;
     } else if(serial_buffer2_where==buffer_fill) {
-        memcpy(data, serial_buffer2, strlen(serial_buffer2)+1);
+        data=serial_buffer2;
+        //memcpy(data, serial_buffer2, strlen(serial_buffer2)+1);
         serial_buffer2_where=0;
         return 1;
     } else if(serial_buffer_where==buffer_fill) {
-        memcpy(data, serial_buffer, strlen(serial_buffer)+1);
+        data=serial_buffer;
+        //memcpy(data, serial_buffer, strlen(serial_buffer)+1);
         serial_buffer_where=0;
         return 1;
     } else {
@@ -119,23 +122,31 @@
 {
     int i = 1;
     int j = 0;
+    int k = 0;
 
     //array for incomng data to user
-    char prijata_data[buffer_size];
+    char * prijata_data;
 
     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
+        wait_ms(10);                            // 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
+        
+        k++;
+
+        if (k>=100) {
+            pc.printf("This program runs since %d seconds.\n", i++);    // write to serial some string
+
+            myled = !myled;   // blink LED
+            
+            k=0;
+        }
     }
 }