More generic and scalable parser
Dependencies: SLCD mbed-rtos mbed
Fork of Serial_IO_test_v6 by
Diff: serialO_v5.cpp
- Revision:
- 2:8196b4cc681b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serialO_v5.cpp Mon Mar 09 00:33:25 2015 +0000 @@ -0,0 +1,97 @@ +#include "mbed.h" +#include <iostream> +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <locale.h> +#include "rtos.h" +#include "SLCD.h" + +#define LCDLEN 10 +#define MAXCHAR 4 +#define ALL8 "8888" +#define LCDUPDATE 100 //ms +#define LEDBLINKTIME 300 // ms *** NOTE Change of units *** +#define SERIALREADTIME 50 //ms +// ASCII constants +#define CR '\r' + + + + +DigitalOut rLed(LED_RED); + + +Serial pc(USBTX, USBRX); // tx, rx +SLCD slcd; //define LCD display +char rxChar; +char rxString[LCDLEN]; +string rxRealString; + +void clearString (char * aString){ + int i; + int sSize = sizeof(aString); + + for (i=0; i< sSize; i++){ + aString[i] = NULL; + } + return; +} + + + +void LCDMessNoDwell(char *lMess){ + slcd.Home(); + slcd.clear(); + slcd.printf(lMess); +} + +// use "thread" in the name to keep things straight +// note the use of void constant * args - understand memory resources +// Thes are "forever loops" +void LCDdis_thread(void const *args){ + while(true) { + LCDMessNoDwell(rxString); + Thread::wait(LCDUPDATE); + } +} + +void serial_thread(void const *args){ + static int charIndex =0; + int rxStringLen; + while(true) { + if (pc.readable()) { // only read from the serial port if there is a character + rxChar= toupper(pc.getc()); // reading clears the buffer + // construct a 4-digit string for the LCD + // check for carriage return + if (rxChar == CR) { + rxRealString.assign(rxString); + rxStringLen = rxRealString.length(); + pc.printf("%s - StringLen = %d OK \n\r", rxString, rxStringLen); + charIndex = 0; // start building string from position zero next time around + } else { + if(charIndex == 0) clearString(rxString); + rxString[charIndex] = rxChar; + rxRealString.assign(rxString); + pc.printf("%s\n\r", rxString); + charIndex = (charIndex + 1)% (MAXCHAR); // Only allow 4 characters then roll over + + } + } + Thread::wait(SERIALREADTIME); + } +} + +int main() +{ + + Thread lthread(LCDdis_thread); + Thread serthread(serial_thread); + + sprintf(rxString,"%s",ALL8); // just put something on the LCD to show it's working + + while (true) { + rLed = !rLed; // toggle led + Thread::wait(LEDBLINKTIME); + } +} \ No newline at end of file