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

Dependencies:   mbed

Revision:
0:2a0d1131965d
Child:
1:4486f14a88ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Mar 12 22:12:29 2015 +0000
@@ -0,0 +1,108 @@
+#include "mbed.h"
+
+//------------------------------------
+// Hyperterminal configuration
+// 9600 bauds, 8-bit data, no parity
+//------------------------------------
+
+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];
+
+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
+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;
+            continue;
+        }else{serial_end_line=false;}
+        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;
+                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;
+            }
+        } else if(serial_buffer2_where!=buffer_fill) {
+            serial_buffer2[serial_buffer2_where++]=character;
+            if(serial_buffer2_where==buffer_size) {
+                serial_buffer2[buffer_size-1]='\0';
+                serial_buffer2_where=buffer_fill;
+                return;
+            }
+            if(character==13 || character==10) {
+                serial_buffer2[serial_buffer2_where-1]='\0';
+                serial_buffer2_where=buffer_fill;
+                serial_end_line=true;
+            }
+        } /*else {
+            while(!pc.writeable());
+            pc.printf("Code is too slow!\n");
+            //pc.printf("I get: \"%c\", v deci: %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
+int serialGetBuffer(char * data)
+{
+    if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) {
+        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);
+        serial_buffer2_where=0;
+        return 1;
+    } else if(serial_buffer_where==buffer_fill) {
+        memcpy(data, serial_buffer, strlen(serial_buffer)+1);
+        serial_buffer_where=0;
+        return 1;
+    } else {
+        return 0;
+    }
+}
+