Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.
Dependencies: mbed
Diff: main.cpp
- 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; + } +} +