Reception of multiple characters over UART without interrupting the program. Uses 2 input buffers.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 2:416bbbc23e82
- Parent:
- 1:4486f14a88ad
- Child:
- 3:e316c5e314e1
diff -r 4486f14a88ad -r 416bbbc23e82 main.cpp --- a/main.cpp Sun Mar 22 13:31:00 2015 +0000 +++ b/main.cpp Mon Apr 20 21:41:02 2015 +0000 @@ -16,7 +16,7 @@ /* Function prototypes -----------------------------------------------------------*/ void serialRx(); -int serialGetBuffer(char * data); +int serialGetBuffer(char * & data); /* Variables ---------------------------------------------------------------------*/ // help variables for incoming data @@ -34,7 +34,7 @@ /******************************************************************************* * Function Name : serialRx. -* Description : Incoming interruption fom serial. Fill two buffers with +* Description : Incoming interruption fom serial. Fill two buffers with * incoming data and prepare it to serialGetBuffer. * Input : None. * Output : None. @@ -45,19 +45,19 @@ while(pc.readable()) { // read all data from serial char character=pc.getc(); // get a char form serial if(((int)character==10 || (int)character==13) && serial_end_line) { // search for end line /r or /n - serial_end_line=false; // end was find in previous char, so skip it + serial_end_line=true; // end was find in previous char, so skip it continue; } else { serial_end_line=false; // clear serial_end_line flag } - if(serial_buffer_where!=buffer_fill) { + if(serial_buffer_where!=buffer_fill && !(serial_buffer2_where != 0 && serial_buffer2_where!=buffer_fill)/* && ( serial_buffer_where!=0 || (serial_buffer2_where !=0 && serial_buffer_where==0 ))*/) { serial_buffer[serial_buffer_where++]=character; if(serial_buffer_where==buffer_size) { // check if incoming data are smaller than buffe size serial_buffer[buffer_size-1]='\0'; // posibility to lost data, if the incoming data are too big serial_buffer_where=buffer_fill; // set index array to indicate buffer fill - return; + continue; } - if(character==13 || character==10) { // if end of line (\r \n) is indicate, prepare the buffer to serialGetBuffer + if(character==13 || character==10) { // if end of line (\r \n) is indicate, prepare the buffer to serialGetBuffer serial_buffer[serial_buffer_where-1]='\0'; // set end of buffer with 0 serial_buffer_where=buffer_fill; // set index array to indicate buffer fill serial_end_line=true; // end of line was find, set serial_end_line flag @@ -67,7 +67,7 @@ if(serial_buffer2_where==buffer_size) { serial_buffer2[buffer_size-1]='\0'; serial_buffer2_where=buffer_fill; - return; + continue; } if(character==13 || character==10) { serial_buffer2[serial_buffer2_where-1]='\0'; @@ -89,18 +89,21 @@ * Output : Char array with incoming data. * Return : 0 - on no data, 1 - one buffer is fill, 2 -two buffers are fill (posibility to lost data) *******************************************************************************/ -int serialGetBuffer(char * data) +int serialGetBuffer(char * & data) { if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) { - memcpy(data, serial_buffer, strlen(serial_buffer)+1); + data=serial_buffer; + //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); + data=serial_buffer2; + //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); + data=serial_buffer; + //memcpy(data, serial_buffer, strlen(serial_buffer)+1); serial_buffer_where=0; return 1; } else { @@ -119,23 +122,31 @@ { int i = 1; int j = 0; + int k = 0; //array for incomng data to user - char prijata_data[buffer_size]; + char * prijata_data; pc.baud(115200); // set serial speed to 115200 pc.attach(&serialRx,Serial::RxIrq); // attach serialRx to incoming interruption pc.printf("Hello World !\n"); while(1) { - wait(1); // wait 1 second + wait_ms(10); // wait 1 second if(serialGetBuffer(prijata_data)) { // get char array from serial sscanf (prijata_data,"%d",&j); // sscanf for searching integer pc.printf("From PC:%d.\n" ,j); // write to serial incoming integer - } else { - pc.printf("This program runs since %d seconds.\n", i++); // write to serial some string } - myled = !myled; // blink LED + + k++; + + if (k>=100) { + pc.printf("This program runs since %d seconds.\n", i++); // write to serial some string + + myled = !myled; // blink LED + + k=0; + } } }