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

Dependencies:   mbed

Committer:
dousape2
Date:
Thu Mar 12 22:12:29 2015 +0000
Revision:
0:2a0d1131965d
Child:
1:4486f14a88ad
UART getc buffer prijem char pole

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dousape2 0:2a0d1131965d 1 #include "mbed.h"
dousape2 0:2a0d1131965d 2
dousape2 0:2a0d1131965d 3 //------------------------------------
dousape2 0:2a0d1131965d 4 // Hyperterminal configuration
dousape2 0:2a0d1131965d 5 // 9600 bauds, 8-bit data, no parity
dousape2 0:2a0d1131965d 6 //------------------------------------
dousape2 0:2a0d1131965d 7
dousape2 0:2a0d1131965d 8 Serial pc(SERIAL_TX, SERIAL_RX);
dousape2 0:2a0d1131965d 9 DigitalOut myled(LED1);
dousape2 0:2a0d1131965d 10
dousape2 0:2a0d1131965d 11 // definice a promenne pro prijem dat
dousape2 0:2a0d1131965d 12 #define buffer_size 256
dousape2 0:2a0d1131965d 13 #define buffer_fill buffer_size+1
dousape2 0:2a0d1131965d 14 char serial_buffer[buffer_size];
dousape2 0:2a0d1131965d 15 char serial_buffer2[buffer_size];
dousape2 0:2a0d1131965d 16 int serial_buffer_where=0;
dousape2 0:2a0d1131965d 17 int serial_buffer2_where=0;
dousape2 0:2a0d1131965d 18 void serialRx();
dousape2 0:2a0d1131965d 19 int serialGetBuffer(char * data);
dousape2 0:2a0d1131965d 20 bool serial_end_line = false;
dousape2 0:2a0d1131965d 21
dousape2 0:2a0d1131965d 22 //pole prijatych znaku
dousape2 0:2a0d1131965d 23 char prijata_data[buffer_size];
dousape2 0:2a0d1131965d 24
dousape2 0:2a0d1131965d 25 int main()
dousape2 0:2a0d1131965d 26 {
dousape2 0:2a0d1131965d 27 int i = 1;
dousape2 0:2a0d1131965d 28 int j = 0;
dousape2 0:2a0d1131965d 29 pc.attach(&serialRx,Serial::RxIrq); // preruseni pro prijem znaku z UART
dousape2 0:2a0d1131965d 30
dousape2 0:2a0d1131965d 31 pc.printf("Hello World !\n");
dousape2 0:2a0d1131965d 32 while(1) {
dousape2 0:2a0d1131965d 33 wait(1);
dousape2 0:2a0d1131965d 34 if(serialGetBuffer(prijata_data)) { // prijmout char buffer z UART komunikace
dousape2 0:2a0d1131965d 35 sscanf (prijata_data,"%d",&j); // pouziti sscanf pro hledani prvniho cisla
dousape2 0:2a0d1131965d 36 pc.printf("From PC:%d.\n" ,j);
dousape2 0:2a0d1131965d 37 } else {
dousape2 0:2a0d1131965d 38 pc.printf("This program runs since %d seconds.\n", i++);
dousape2 0:2a0d1131965d 39 }
dousape2 0:2a0d1131965d 40 myled = !myled;
dousape2 0:2a0d1131965d 41 }
dousape2 0:2a0d1131965d 42 }
dousape2 0:2a0d1131965d 43
dousape2 0:2a0d1131965d 44 // preruseni pro prijem dat z UART
dousape2 0:2a0d1131965d 45 void serialRx()
dousape2 0:2a0d1131965d 46 {
dousape2 0:2a0d1131965d 47 while(pc.readable()) {
dousape2 0:2a0d1131965d 48 char character=pc.getc();
dousape2 0:2a0d1131965d 49 if(((int)character==10 || (int)character==13) && serial_end_line) { // jine konce radku, prizpusobeni
dousape2 0:2a0d1131965d 50 serial_end_line=false;
dousape2 0:2a0d1131965d 51 continue;
dousape2 0:2a0d1131965d 52 }else{serial_end_line=false;}
dousape2 0:2a0d1131965d 53 if(serial_buffer_where!=buffer_fill) {
dousape2 0:2a0d1131965d 54 serial_buffer[serial_buffer_where++]=character;
dousape2 0:2a0d1131965d 55 if(serial_buffer_where==buffer_size) { // kontrola nepreteceni bufferu
dousape2 0:2a0d1131965d 56 serial_buffer[buffer_size-1]='\0';
dousape2 0:2a0d1131965d 57 serial_buffer_where=buffer_fill;
dousape2 0:2a0d1131965d 58 return;
dousape2 0:2a0d1131965d 59 }
dousape2 0:2a0d1131965d 60 if(character==13 || character==10) { // ukonceni a pripraveni bufferu
dousape2 0:2a0d1131965d 61 serial_buffer[serial_buffer_where-1]='\0';
dousape2 0:2a0d1131965d 62 serial_buffer_where=buffer_fill;
dousape2 0:2a0d1131965d 63 serial_end_line=true;
dousape2 0:2a0d1131965d 64 }
dousape2 0:2a0d1131965d 65 } else if(serial_buffer2_where!=buffer_fill) {
dousape2 0:2a0d1131965d 66 serial_buffer2[serial_buffer2_where++]=character;
dousape2 0:2a0d1131965d 67 if(serial_buffer2_where==buffer_size) {
dousape2 0:2a0d1131965d 68 serial_buffer2[buffer_size-1]='\0';
dousape2 0:2a0d1131965d 69 serial_buffer2_where=buffer_fill;
dousape2 0:2a0d1131965d 70 return;
dousape2 0:2a0d1131965d 71 }
dousape2 0:2a0d1131965d 72 if(character==13 || character==10) {
dousape2 0:2a0d1131965d 73 serial_buffer2[serial_buffer2_where-1]='\0';
dousape2 0:2a0d1131965d 74 serial_buffer2_where=buffer_fill;
dousape2 0:2a0d1131965d 75 serial_end_line=true;
dousape2 0:2a0d1131965d 76 }
dousape2 0:2a0d1131965d 77 } /*else {
dousape2 0:2a0d1131965d 78 while(!pc.writeable());
dousape2 0:2a0d1131965d 79 pc.printf("Code is too slow!\n");
dousape2 0:2a0d1131965d 80 //pc.printf("I get: \"%c\", v deci: %d\n",character,(int)character);
dousape2 0:2a0d1131965d 81 }*/
dousape2 0:2a0d1131965d 82 }
dousape2 0:2a0d1131965d 83 }
dousape2 0:2a0d1131965d 84
dousape2 0:2a0d1131965d 85
dousape2 0:2a0d1131965d 86 //vstup pole stejné velikosti jako buffery
dousape2 0:2a0d1131965d 87 // návrat int - 0 - žádná přijatá data
dousape2 0:2a0d1131965d 88 // - 1 - přijatá data
dousape2 0:2a0d1131965d 89 // - 2 - dvoje přijatá data, pravděpodobnost nezaznamenání dalších dat
dousape2 0:2a0d1131965d 90 int serialGetBuffer(char * data)
dousape2 0:2a0d1131965d 91 {
dousape2 0:2a0d1131965d 92 if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) {
dousape2 0:2a0d1131965d 93 memcpy(data, serial_buffer, strlen(serial_buffer)+1);
dousape2 0:2a0d1131965d 94 serial_buffer_where=0;
dousape2 0:2a0d1131965d 95 return 2;
dousape2 0:2a0d1131965d 96 } else if(serial_buffer2_where==buffer_fill) {
dousape2 0:2a0d1131965d 97 memcpy(data, serial_buffer2, strlen(serial_buffer2)+1);
dousape2 0:2a0d1131965d 98 serial_buffer2_where=0;
dousape2 0:2a0d1131965d 99 return 1;
dousape2 0:2a0d1131965d 100 } else if(serial_buffer_where==buffer_fill) {
dousape2 0:2a0d1131965d 101 memcpy(data, serial_buffer, strlen(serial_buffer)+1);
dousape2 0:2a0d1131965d 102 serial_buffer_where=0;
dousape2 0:2a0d1131965d 103 return 1;
dousape2 0:2a0d1131965d 104 } else {
dousape2 0:2a0d1131965d 105 return 0;
dousape2 0:2a0d1131965d 106 }
dousape2 0:2a0d1131965d 107 }
dousape2 0:2a0d1131965d 108