Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.
Dependencies: mbed
main.cpp@0:2a0d1131965d, 2015-03-12 (annotated)
- 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?
User | Revision | Line number | New 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 |