Parallax Data Logger interfacing via UART at 2Mbaud

Here is some code for basic data logging. It isn't very robust, but it works. Hopes this helps anyone who wants to use this little device. Using this thing brings data storage times down into the 5ms and below range. This code could use a lot of improvements, but this is a nice start.

#include <PString.h>


#define POTPIN 2
#define SWITCHPIN 3

//Serial.write chokes on a zero for some reason
const uint8_t hexZero = 0x00;

char inByte;

char parseBuffer[30];
char outBuffer[100];

PString parseString(parseBuffer,30);
PString outString(outBuffer,100);

int i;


union{
  unsigned long outBytes;
  byte outBytesHex[4];
}
outBytesUnion;

int potValue = 5;

unsigned long timeStampStart = 0;
unsigned long timeStampEnd = 0;

boolean switchPinPrevious = 0;

long writeTimer = 0;
void setup(){

  pinMode(SWITCHPIN,INPUT);
  parseString.begin();
  delay(5000);//wait for the logger to boot
  //the logger can run at 3Mbaud but I was only able to interface at 2Mbaud
  Serial2.begin(2000000);
  //switch to short commands
  Serial1.begin(9600);
  Serial1.write(0x10);
  Serial1.write(0x0D);
  Serial1.flush();
  //change baud rate to 2Mbaud
  Serial1.write(0x14);
  Serial1.write(0x20);
  Serial1.write(0x01);
  Serial1.write(hexZero);

  Serial1.write(hexZero);
  Serial1.write(0x0D);
  Serial1.flush();
  Serial1.end();
  //wait then restart the serial port
  delay(500);
  Serial1.begin(2000000);
  delay(1000);



  writeTimer = millis();
}

void loop(){

  if(millis() - writeTimer >=10){
    timeStampStart = millis();
    potValue = analogRead(POTPIN);
    if(digitalRead(SWITCHPIN) == HIGH){
      if (switchPinPrevious == 0){
        OpenFile();
      }
      LogData();
      switchPinPrevious = 1;
    }
    else{
      if (switchPinPrevious == 1){
        CloseFile();
        switchPinPrevious = 0;
      }
    }
    timeStampEnd = millis();
    writeTimer = millis();
  }
}
void LogData(){

  Serial1.write(0x0D);

  parseString.begin();
  while(Serial1.available() < 1 ){
  }
  while(Serial1.available() > 0){
    inByte = Serial1.read();
    parseString += inByte;
  }

  if(strncmp(parseBuffer,">\r",2) != 0){

    Serial2.println("failed prompt check log");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    LogData();
  }

  outString.begin();
  outString+=timeStampStart;
  outString+=",";
  outString+=timeStampEnd;
  outString+=",";
  outString+=potValue;
  outString+="\r\n";
  outBytesUnion.outBytes = outString.length();


  Serial1.write(0x08);
  Serial1.write(0x20);
  Serial1.write(outBytesUnion.outBytesHex[3]);
  Serial1.write(outBytesUnion.outBytesHex[2]);
  Serial1.write(outBytesUnion.outBytesHex[1]);
  Serial1.write(outBytesUnion.outBytesHex[0]);
  Serial1.write(0x0D);
  Serial1.write(outString);
  Serial1.write(0x0D);

  parseString.begin();
  while(Serial1.available() < 1 ){
  }
  while(Serial1.available() > 0 ){
    inByte = Serial1.read();
    parseString += inByte;
  }
  if(strncmp(parseBuffer,"BC",2) == 0){  

    Serial2.println("bad command log");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    LogData();
  }

}

void OpenFile(){

  Serial1.write(0x0D);

  parseString.begin();
  while(Serial1.available() < 1 ){
  }
  while(Serial1.available() > 0){
    inByte = Serial1.read();
    parseString += inByte;
  }

  if(strncmp(parseBuffer,">\r",2) != 0){
    Serial2.println("no prompt open");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    OpenFile();
  }


  Serial1.write(0x09);
  Serial1.write(0x20);
  Serial1.write("log.csv");
  Serial1.write(0x0D);
  parseString.begin();
  while(Serial1.available() < 1 ){

  }
  while(Serial1.available() > 0 ){
    inByte = Serial1.read();
    parseString += inByte; 
  }

  if(strncmp(parseBuffer,"BC",2) == 0){  
    Serial2.println("bad command open");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    OpenFile();
  }

  Serial1.write(0x01);
  Serial1.write(0x0D);

  parseString.begin();
  while(Serial1.available() < 6 ){
  }
  while(Serial1.available() > 0){
    inByte = Serial1.read();
    parseString += inByte;
  }

  if(strncmp(parseBuffer,"\rLOG.CSV\r>\r",11) != 0){

    Serial2.println("did not return file name");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    OpenFile();
  }
} 
void CloseFile(){

  Serial1.write(0x0D);

  parseString.begin();
  while(Serial1.available() < 1 ){
  }
  while(Serial1.available() > 0){
    inByte = Serial1.read();
    parseString += inByte;
  }

  if(strncmp(parseBuffer,">\r",2) != 0){

    Serial2.println(parseString);
    Serial2.println("no prompt  close");
    delay(1000);
    Serial1.flush();
    CloseFile();
  }


  Serial1.write(0x0A);
  Serial1.write(0x20);
  Serial1.write("log.csv");
  Serial1.write(0x0D);
  parseString.begin();
  while(Serial1.available() < 1 ){
  }
  while(Serial1.available() > 0 ){
    inByte = Serial1.read();
    parseString += inByte;
  }


  if(strncmp(parseBuffer,"BC",2) == 0){  
    Serial2.println("bad command");
    Serial2.println(parseString);
    delay(1000);
    Serial1.flush();
    CloseFile();
  }
}