Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.
Dependencies: mbed
main.cpp
- Committer:
- dousape2
- Date:
- 2015-03-12
- Revision:
- 0:2a0d1131965d
- Child:
- 1:4486f14a88ad
File content as of revision 0:2a0d1131965d:
#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; } }