Allow PC to send serial commands to arduino.

#include <Streaming.h>
//######################
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  blink(); delay(1000); blink(); delay(1000); blink(); delay(1000); blink();
};
//######################
void loop(void)
{  
  blink();
  if (Serial.available() ) { cmds(); }
}
//######################
void blink() {
  static boolean blinkLed;
  static unsigned long Blinktime;
  const int ledPin = 13;
  const int delayMsec = 1000;
  pinMode(ledPin, OUTPUT);
  if ( millis() > Blinktime ) {
    if (blinkLed) { digitalWrite(ledPin, HIGH); }
    else { digitalWrite(ledPin, LOW); }
    blinkLed = !blinkLed;
    Blinktime = millis() + delayMsec;
  }; 
}
//######################
void cmds() {
  //Reads serial looking for commands in format {cmd:datadata}
  char inByte;  // for incoming serial data
  const int maxLenCmd = 10;
  const int maxLenData = 20;
  const boolean debug = false;
  static char cmd_command[maxLenCmd+1] = "/0"; // {xxx:
  static char cmd_data[maxLenData+1]    = "/0"; // yyyy}
  static int cmdstate = 0; //  0=discard, 1=readcmd, 2=readdata, 3=process
  static int cmdlen = 0;
  int count = 0;
  if (debug) {Serial << endl << "CMDS.. ";}
  while (Serial.available() > 0) {
    // read the incoming byte:
    if (cmdstate != 3 ) { inByte = Serial.read(); count++; } 
    // busy reading data 
    if ( cmdstate == 2 ) {
      if (inByte  != '}') {
        cmd_data[cmdlen] = inByte; cmdlen++; //add txt.
        //test for overrun on cmd
        if ( cmdlen >= maxLenData ) {
          cmd_data[cmdlen] = 0;
          Serial << "Err DATA overrun " << cmd_data << endl;
          cmd_command[0] = 0; cmd_data[0] = 0; cmdlen=0; cmdstate=0;
        }
      } 
      else { //found closing bracket
        cmd_data[cmdlen] = 0; cmdstate = 3; cmdlen = 0;
      }
    }    
    // busy reading command text
    if ( cmdstate == 1 ) {
      if ( !( (inByte==':') or (inByte=='}') or (inByte=='{')) ) {
        cmd_command[cmdlen] = inByte; cmdlen++; //add txt.
        //test for overrun on cmd
        if ( cmdlen >= maxLenCmd ) {
          cmd_command[cmdlen] = 0;
          Serial << "Err CMD overrun " << cmd_command << endl;
          cmd_command[0] = 0; cmdlen=0; cmdstate=0;          
        }
      } 
      else { //Found controll char
        if (debug) { Serial << "CMD - Found Ctrl[" << inByte << "]"; }
        cmd_command[cmdlen] = 0; cmdstate = 2; cmd_data[0] = 0;
        if (inByte == '}') { cmdstate = 3; } //skip data
        if ( (cmdlen == 0) or (inByte == '{') ) { cmdstate = 0; } //command to short
        cmdlen = 0; 
      }
    }
   // search for opening bracket
    if (cmdstate==0) {
      if ( inByte=='{' )  {
        cmdstate = 1; cmdlen = 0;
      }
      else {
        if (count < 2) { Serial << "Discard:"; }
        Serial << (char)inByte;
      }
    };    
    if ( cmdstate == 3 ) {
      if (debug) {Serial << "Command{" << cmd_command << "} Data{" << cmd_data << "}" << endl;}
      // Do something !!
      boolean cmdfound = false;
      //strcmp returns 0 if match.
      if (!strcmp(cmd_command,"temp")) { cmdfound = true;
        Serial << "Run temperature read .." << cmd_data << endl;
        //call custom function 1 here
      }
      if (!strcmp(cmd_command,"test2")) { cmdfound = true;
        Serial << "Found Test2.." << cmd_data;
        //call custom function2 here
      }
      if (! cmdfound) {
        Serial << "Cmd{" << cmd_command << "} not found." << endl;
      }
      cmdstate = 0; cmdlen = 0 ; cmd_data[0] = 0 ; cmd_command[0] = 0;
    }
    // say what you got:
    //Serial << "IN:" << inByte << ":";
  } //while
  if (debug) {Serial << endl;}
}

//######################

...

Arduino.ScetchSerialPcControll (last edited 2011-12-24 13:30:56 by PieterSmit)