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;
    }
}