Precursor top to simple parser multi threaded use of c++ basic string library. For Ambient computing NMNU Spring 2015
Dependencies: SLCD mbed-rtos mbed
Fork of Serial_IO_test_v3 by
serialO_v5.cpp
- Committer:
- scohennm
- Date:
- 2015-03-09
- Revision:
- 2:8196b4cc681b
File content as of revision 2:8196b4cc681b:
#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); } }