B+G E-Tech DRS110M // in-circuit.de USB-RS485 Bridge

// test program rs485
// DRS110M
// Translated from Python; thanks to Marmangra ( Stromzähler mit RS485 - Seite 2)
// Thanks to Frank van de Pol: Arduino/drs110m_test at master · fvdpol/Arduino · GitHub
#define SERIAL_BAUD 57600

int  tx_sel = 2;  // pin to enable MAX485 output

String SerialID = "000000000000";
String Password  = "00000000";

char c_init[] =         {'/', '?', '!', '\r', '
', '\0'}; //Get serial nr

char c_startread[] =    {'/', '?', 'S', 'E', 'R', 'I', 'A', 'L', '!', '\r', '
', '\0'};                            //RETURN: YTL: meterID (12 cijfers)
char c_ack[] =          {0x06, 0x30, ':', 0x31, 0x0D, 0x0A, '\r', '
', '\0'}; //Programming mode                   //RETURN: PO: xxxxxxxx
char c_login[] =        {0x01, 'P', '1', 0x02, '(', 'P', 'A', 'S', 'S', ')', 0x03, 0x61, '\r', '
', '\0'};         //RETURN: nothing
char c_logout[] =       {0x01, 'B', '0', 0x03, 0x71, '/', '?', '!', '\r', '
', '\0'};

char c_voltage[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '0', '(', ')', 0x03, 0x63, '\0'};
char c_amps[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '1', '(', ')', 0x03, 0x62, '\0'};
char c_freq[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '2', '(', ')', 0x03, 0x61, '\0'};     
char c_Pwerkelijk[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '3', '(', ')', 0x03, 0x60, '\0'};     
char c_Pblind[] =       {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '4', '(', ')', 0x03, 0x67, '\0'};     
char c_Pschijn[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '5', '(', ')', 0x03, 0x66, '\0'};     
char c_cosphi[] =       {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '6', '(', ')', 0x03, 0x65, '\0'};     
char c_standused1a[] =  {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '1', '0', '(', ')', 0x03, 0x62, '\0'};     
char c_standused1b[] =  {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '1', '1', '(', ')', 0x03, 0x63, '\0'};     
char c_standsenda[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '2', '0', '(', ')', 0x03, 0x61, '\0'};     
char c_standsendb[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '2', '1', '(', ')', 0x03, 0x60, '\0'};    

char c_tijddatum[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '1', '(', ')', 0x03, 0x61, '\0'}; 
char c_temp[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '2', '(', ')', 0x03, 0x62, '\0'};     

char c_serialnr[] =     {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '4', '(', ')', 0x03, 0x64, '\0'}; 
char c_baudrate[] =     {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '5', '(', ')', 0x03, 0x65, '\0'};
char c_meterid[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '6', '(', ')', 0x03, 0x66, '\0'};

String tmpval;

struct DRSDATA {
  String Serialnr;
  String MeterID;
  
  String Unknown;
  
  float Voltage;
  float Amps;
  float Freq;
  float Cosphi;
  
  int P_Werkelijk;
  int P_Blind;
  int P_Schijn;
  
  float KWH_Verbruik;
  float KWH_Verbruik2;
  float KWH_Geleverd;
  float KWH_Geleverd2;

  float Temp;
  String TimeDate;
  float Baudrate;
};

DRSDATA DRSdata;
void setup() {
  Serial.begin(SERIAL_BAUD);

  pinMode(tx_sel, OUTPUT);
  digitalWrite(tx_sel, LOW);
  Serial3.begin(9600,SERIAL_7E1);
  
}

byte CreateSendString(char value[]){
  clearbuffer();
  digitalWrite(tx_sel, HIGH);
  delay(1);
  
  String retString = value;
  retString.replace("PASS", Password);
  retString.replace("SERIAL", SerialID);

  Serial3.print(retString);
  Serial3.flush();
  delay(1);
  digitalWrite(tx_sel, LOW);
  delay(150);
  return ReadSerial();
}
 
byte ReadSerial() {
  String ReadedLine = "";
  char MyChar[2]{0, '\0'};
  while (Serial3.available()) {
    MyChar[0] = Serial3.read();
    ReadedLine += MyChar;
  }
  if (ReadedLine.startsWith("/YTL:")) { //Meter Serialnr
    DRSdata.Serialnr = ReadedLine.substring(5,17);
    Serial.println("Serialnr: " + DRSdata.Serialnr);
    return 1;
  }
  else if (ReadedLine.startsWith("P0") && ReadedLine.endsWith("`")) { //UNKNOWN
    DRSdata.Unknown = ReadedLine.substring(4,11);
    Serial.println("UnKnown: " + DRSdata.Unknown);
    return 1;
  }
  
  else if (extractIt(ReadedLine, "00000000(")) { //VOLTAGE
      DRSdata.Voltage = tmpval.toFloat() / 10;
      Serial.println("Voltage: " + String(DRSdata.Voltage));
      return 1;
  }
  else if (extractIt(ReadedLine, "00000001(")) { //AMPS
    DRSdata.Amps = tmpval.toFloat() / 10;
    Serial.println("Amps: " + String(DRSdata.Amps));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000002(")) { //FREQ
    DRSdata.Freq = tmpval.toFloat() / 10;
    Serial.println("Freq: " + String(DRSdata.Freq));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000003(")) { //Werkelijk vermogen
    DRSdata.P_Werkelijk = tmpval.toFloat() * 10;
    Serial.println("Werkelijk vermogen: " + String(DRSdata.P_Werkelijk));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000004(")) { //Werkelijk vermogen
    DRSdata.P_Blind = tmpval.toFloat() * 10;
    Serial.println("Blind vermogen: " + String(DRSdata.P_Blind));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000005(")) { //Schijn vermogen
    DRSdata.P_Schijn = tmpval.toFloat() * 10;
    Serial.println("Schijn vermogen: " + String(DRSdata.P_Schijn));
    return 1;
  } 
  else if (extractIt(ReadedLine, "00000006(")) { //CosPhi
    DRSdata.Cosphi = tmpval.toFloat() / 1000 ;
    Serial.println("CosPhi: " + String(DRSdata.Cosphi));
    return 1;
  }   
  else if (extractIt(ReadedLine, "00000010(")) { //Tellerstand 1 (Verbruik)
    DRSdata.KWH_Verbruik = tmpval.toFloat() / 1000 ;
    Serial.println("Verbruikte KWH (1): " + String(DRSdata.KWH_Verbruik));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000011(")) { //Tellerstand 1 (Kopie)
    DRSdata.KWH_Verbruik2 = tmpval.toFloat() / 1000 ;
    Serial.println("Verbruikte KWH (2): " + String(DRSdata.KWH_Verbruik2));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000020(")) { //Tellerstand 2 (Teruggeleverd)
    DRSdata.KWH_Geleverd = tmpval.toFloat() / 1000 ;
    Serial.println("Geleverde KWH: " + String(DRSdata.KWH_Geleverd));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000021(")) { //Tellerstand 2 (Kopie)
    DRSdata.KWH_Geleverd2 = tmpval.toFloat() / 1000 ;
    Serial.println("Geleverde KWH2: " + String(DRSdata.KWH_Geleverd2));
    return 1;
  }  
  
  else if (extractIt(ReadedLine, "00000031(")) { //TijdDatum
    DRSdata.TimeDate = tmpval;
    Serial.println("TijdDatum: " + String(DRSdata.TimeDate));
    return 1;
  }    
  else if (extractIt(ReadedLine, "00000032(")) { //Temp
    DRSdata.Temp = tmpval.toFloat() ;
    Serial.println("Temperatuur: " + String(DRSdata.Temp));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000034(")) { //Serialnr
    DRSdata.Serialnr = tmpval ;
    Serial.println("Serialnr: " + String(DRSdata.Serialnr));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000035(")) { //Baudrate
    DRSdata.Baudrate = tmpval.toFloat() ;
    Serial.println("BaudRate: " + String(DRSdata.Baudrate));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000036(")) { //MeterID
    DRSdata.MeterID = tmpval ;
    Serial.println("MeterID: " + String(DRSdata.MeterID));
    return 1;
  }  

  
  else {
    Serial.println(ReadedLine);
  }
  return 0;
}
bool extractIt(String StringIn, String SearchFor) {
  if (StringIn.substring(1,10) == SearchFor) { //AMPS
    int zoek = findChar(StringIn, ')', 10);
    if (zoek > 0) {
      tmpval = StringIn.substring(10, zoek);
      return true;
    }

  }
  return false;
}

static void handleInput (char c) {
  
    
  switch (c) {
      case 'd':
        while (Serial3.available()) {
          char c = Serial3.read();
          Serial.print("RX: 0x");
          Serial.print(c, HEX);
          if (c>=32) {
            Serial.print("	'");
            Serial.print(char(c));
            Serial.print("'");
          }
          Serial.println();
      }

     case '1':
      byte ret;
      Serial.println(F("Test Msg 1 - check Serial ID"));
      ret = CreateSendString(c_startread);
    
      ret += CreateSendString(c_ack);
      ret += CreateSendString(c_login); 
                 
      ret += CreateSendString(c_voltage);
      ret += CreateSendString(c_amps);
      ret += CreateSendString(c_freq);
      ret += CreateSendString(c_cosphi);
                  
      ret += CreateSendString(c_standused1a);
      ret += CreateSendString(c_standused1b);
      ret += CreateSendString(c_standsenda);
      ret += CreateSendString(c_standsendb);
      ret += CreateSendString(c_tijddatum);
      ret += CreateSendString(c_temp);
      
      ret += CreateSendString(c_baudrate);
      ret += CreateSendString(c_meterid);

      ret += CreateSendString(c_Pwerkelijk);
      ret += CreateSendString(c_Pblind);  
      ret += CreateSendString(c_Pschijn);  

      ret += CreateSendString(c_logout);      

            Serial.println(ret);
      break;
  }
}



void loop() {
  while (Serial.available())
    handleInput(Serial.read());  
}

void clearbuffer() {
  char c;
  while (Serial3.available()) {
    c = Serial3.read();
  }
}
int findChar(String StringIN, char ChartoFind, byte StartPos) {
  char myChar;

  for (int i = StartPos; i < StringIN.length(); i++) {
    myChar = StringIN.charAt(i);      
    if (myChar == ChartoFind) {
      return i;
    }

  }
  return -1;
}

Hi,

(because there is a bug in the DRS110M meter, I had to change the time / date of the meter (between 0:00 and 1:00, the meter is reading out WATT values between 0:00 and 1:00, but doesn’t change / count to the meter total value)

I’ve changed the code, now you can read and write (time and date) to the meter… other changes are easy to add, because the CRC function is included.

// test program rs485 for Arduino
// DRS110M
// Translated from Python; thanks to Marmangra ( Stromzähler mit RS485 - Seite 2)
// Thanks to Frank van de Pol: Arduino/drs110m_test at master · fvdpol/Arduino · GitHub
#define SERIAL_BAUD 57600

int  tx_sel = 2;  // pin to enable MAX485 output

String SerialID = "000000000000";
String Password  = "00000000";

char c_init[] =         {'/', '?', '!', '\r', '
', '\0'}; //Get serial nr

char c_startread[] =    {'/', '?', 'S', 'E', 'R', 'I', 'A', 'L', '!', '\r', '
', '\0'};                            //RETURN: YTL: meterID (12 cijfers)
char c_ack[] =          {0x06, 0x30, ':', 0x31, 0x0D, 0x0A, '\r', '
', '\0'}; //Programming mode                   //RETURN: PO: xxxxxxxx
char c_login[] =        {0x01, 'P', '1', 0x02, '(', 'P', 'A', 'S', 'S', ')', 0x03, 0x61, '\r', '
', '\0'};         //RETURN: nothing
char c_logout[] =       {0x01, 'B', '0', 0x03, 0x71, '/', '?', '!', '\r', '
', '\0'};

char c_voltage[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '0', '(', ')', 0x03, 0x63, '\0'};
char c_amps[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '1', '(', ')', 0x03, 0x62, '\0'};
char c_freq[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '2', '(', ')', 0x03, 0x61, '\0'};     
char c_Pwerkelijk[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '3', '(', ')', 0x03, 0x60, '\0'};     
char c_Pblind[] =       {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '4', '(', ')', 0x03, 0x67, '\0'};     
char c_Pschijn[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '5', '(', ')', 0x03, 0x66, '\0'};     
char c_cosphi[] =       {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '0', '6', '(', ')', 0x03, 0x65, '\0'};     
char c_standused1a[] =  {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '1', '0', '(', ')', 0x03, 0x62, '\0'};     
char c_standused1b[] =  {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '1', '1', '(', ')', 0x03, 0x63, '\0'};     
char c_standsenda[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '2', '0', '(', ')', 0x03, 0x61, '\0'};     
char c_standsendb[] =   {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '2', '1', '(', ')', 0x03, 0x60, '\0'};    

char c_tijddatum[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '1', '(', ')', 0x03, 0x61, '\0'}; 
char c_temp[] =         {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '2', '(', ')', 0x03, 0x62, '\0'};     

char c_serialnr[] =     {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '4', '(', ')', 0x03, 0x64, '\0'}; 
char c_baudrate[] =     {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '5', '(', ')', 0x03, 0x65, '\0'};
char c_meterid[] =      {0x01, 'R', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '6', '(', ')', 0x03, 0x66, '\0'};

char w_tijddatum[] =      {0x01, 'W', '1', 0x02, '0', '0', '0', '0', '0', '0', '3', '1', '(', 'D', 'A', 'T', 'E', '0', '0', '0', '2', 'T', 'I', 'M', 'E','0' ,'0', ')', 0x03, 111, '\0'};

String tmpval;

struct DRSDATA {
  String Serialnr;
  String MeterID;
  
  String Unknown;
  
  float Voltage;
  float Amps;
  float Freq;
  float Cosphi;
  
  int P_Werkelijk;
  int P_Blind;
  int P_Schijn;
  
  float KWH_Verbruik;
  float KWH_Verbruik2;
  float KWH_Geleverd;
  float KWH_Geleverd2;

  float Temp;
  String TimeDate;
  float Baudrate;
};

DRSDATA DRSdata;
void setup() {
  Serial.begin(SERIAL_BAUD);

  pinMode(tx_sel, OUTPUT);
  digitalWrite(tx_sel, LOW);
  Serial3.begin(9600,SERIAL_7E1);

  Serial.println("Press 1 <ENTER> to readout the DRS meter");
  Serial.println("Press 2 <ENTER> to write a new date / time into the meter");
}

void WriteTimeDate(String newTime, String newDate) {
  Serial.println("Writing Date: " + newTime + " / Writing Time: " + newDate);

  byte ret = CreateSendString(c_startread);
  ret += CreateSendString(c_ack);
  ret += CreateSendString(c_login); 
 
  clearbuffer();
  digitalWrite(tx_sel, HIGH);
  delay(1);
  String toSend = w_tijddatum;
  toSend.replace("TIME00", newTime);
  toSend.replace("DATE00", newDate);

  toSend.setCharAt(29, CreateCRC(toSend)); //29 is the CRC Char POS!

  Serial3.print(toSend);
  Serial3.flush();
  delay(2);

  digitalWrite(tx_sel, LOW);
  delay(300);

  CreateSendString(c_tijddatum);
 
  Serial.println("New Date/Time Written!: " + DRSdata.TimeDate);
  CreateSendString(c_logout); 
 
}

byte CreateSendString(char value[]){
  clearbuffer();
  digitalWrite(tx_sel, HIGH);
  delay(1);
  
  String retString = value;
  retString.replace("PASS", Password);
  retString.replace("SERIAL", SerialID);

  Serial3.print(retString);
  Serial3.flush();
  delay(1);
  digitalWrite(tx_sel, LOW);
  delay(150);
  return ReadSerial();
}
 
byte ReadSerial() {
  String ReadedLine = "";
  char MyChar[2]{0, '\0'};
  while (Serial3.available()) {
    MyChar[0] = Serial3.read();
    ReadedLine += MyChar;
  }
  if (ReadedLine.startsWith("/YTL:")) { //Meter Serialnr
    DRSdata.Serialnr = ReadedLine.substring(5,17);
    Serial.println("Serialnr: " + DRSdata.Serialnr);
    return 1;
  }
  else if (ReadedLine.startsWith("P0") && ReadedLine.endsWith("`")) { //UNKNOWN
    DRSdata.Unknown = ReadedLine.substring(4,11);
    Serial.println("UnKnown: " + DRSdata.Unknown);
    return 1;
  }
  
  else if (extractIt(ReadedLine, "00000000(")) { //VOLTAGE
      DRSdata.Voltage = tmpval.toFloat() / 10;
      Serial.println("Voltage: " + String(DRSdata.Voltage));
      return 1;
  }
  else if (extractIt(ReadedLine, "00000001(")) { //AMPS
    DRSdata.Amps = tmpval.toFloat() / 10;
    Serial.println("Amps: " + String(DRSdata.Amps));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000002(")) { //FREQ
    DRSdata.Freq = tmpval.toFloat() / 10;
    Serial.println("Freq: " + String(DRSdata.Freq));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000003(")) { //Werkelijk vermogen
    DRSdata.P_Werkelijk = tmpval.toFloat() * 10;
    Serial.println("Werkelijk vermogen: " + String(DRSdata.P_Werkelijk));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000004(")) { //Werkelijk vermogen
    DRSdata.P_Blind = tmpval.toFloat() * 10;
    Serial.println("Blind vermogen: " + String(DRSdata.P_Blind));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000005(")) { //Schijn vermogen
    DRSdata.P_Schijn = tmpval.toFloat() * 10;
    Serial.println("Schijn vermogen: " + String(DRSdata.P_Schijn));
    return 1;
  } 
  else if (extractIt(ReadedLine, "00000006(")) { //CosPhi
    DRSdata.Cosphi = tmpval.toFloat() / 1000 ;
    Serial.println("CosPhi: " + String(DRSdata.Cosphi));
    return 1;
  }   
  else if (extractIt(ReadedLine, "00000010(")) { //Tellerstand 1 (Verbruik)
    DRSdata.KWH_Verbruik = tmpval.toFloat() / 1000 ;
    Serial.println("Verbruikte KWH (1): " + String(DRSdata.KWH_Verbruik));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000011(")) { //Tellerstand 1 (Kopie)
    DRSdata.KWH_Verbruik2 = tmpval.toFloat() / 1000 ;
    Serial.println("Verbruikte KWH (2): " + String(DRSdata.KWH_Verbruik2));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000020(")) { //Tellerstand 2 (Teruggeleverd)
    DRSdata.KWH_Geleverd = tmpval.toFloat() / 1000 ;
    Serial.println("Geleverde KWH: " + String(DRSdata.KWH_Geleverd));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000021(")) { //Tellerstand 2 (Kopie)
    DRSdata.KWH_Geleverd2 = tmpval.toFloat() / 1000 ;
    Serial.println("Geleverde KWH2: " + String(DRSdata.KWH_Geleverd2));
    return 1;
  }  
  
  else if (extractIt(ReadedLine, "00000031(")) { //TijdDatum
    DRSdata.TimeDate = tmpval;
    Serial.println("TijdDatum: " + String(DRSdata.TimeDate));
    return 1;
  }    
  else if (extractIt(ReadedLine, "00000032(")) { //Temp
    DRSdata.Temp = tmpval.toFloat() ;
    Serial.println("Temperatuur: " + String(DRSdata.Temp));
    return 1;
  }  
  else if (extractIt(ReadedLine, "00000034(")) { //Serialnr
    DRSdata.Serialnr = tmpval ;
    Serial.println("Serialnr: " + String(DRSdata.Serialnr));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000035(")) { //Baudrate
    DRSdata.Baudrate = tmpval.toFloat() ;
    Serial.println("BaudRate: " + String(DRSdata.Baudrate));
    return 1;
  }
  else if (extractIt(ReadedLine, "00000036(")) { //MeterID
    DRSdata.MeterID = tmpval ;
    Serial.println("MeterID: " + String(DRSdata.MeterID));
    return 1;
  }  

  
  else {
    Serial.println(ReadedLine);
  }
  return 0;
}
bool extractIt(String StringIn, String SearchFor) {
  if (StringIn.substring(1,10) == SearchFor) { //AMPS
    int zoek = findChar(StringIn, ')', 10);
    if (zoek &gt; 0) {
      tmpval = StringIn.substring(10, zoek);
      return true;
    }

  }
  return false;
}

static void handleInput (char c) {
  
    
  switch (c) {
    case 'd':
      while (Serial3.available()) {
        char c = Serial3.read();
        Serial.print("RX: 0x");
        Serial.print(c, HEX);
        if (c&gt;=32) {
          Serial.print("	'");
          Serial.print(char(c));
          Serial.print("'");
        }
        Serial.println();
    }

    case '1':
      byte ret;
      Serial.println(F("Test Msg 1 - check Serial ID"));
      ret = CreateSendString(c_startread);
      
      ret += CreateSendString(c_ack);
      ret += CreateSendString(c_login); 
               
      ret += CreateSendString(c_voltage);
      ret += CreateSendString(c_amps);
      ret += CreateSendString(c_freq);
      ret += CreateSendString(c_cosphi);
                
      ret += CreateSendString(c_standused1a);
      ret += CreateSendString(c_standused1b);
      ret += CreateSendString(c_standsenda);
      ret += CreateSendString(c_standsendb);
      ret += CreateSendString(c_tijddatum);
      ret += CreateSendString(c_temp);
      
      ret += CreateSendString(c_baudrate);
      ret += CreateSendString(c_meterid);
      
      ret += CreateSendString(c_Pwerkelijk);
      ret += CreateSendString(c_Pblind);  
      ret += CreateSendString(c_Pschijn);  
      
      ret += CreateSendString(c_logout);      
      
      Serial.println(ret);
      break;
    case '2':
        Serial.println("Writing the time 13:25:00 and date 2015-02-12");
        WriteTimeDate("132500", "150212"); //HHMMSS , YYMMDD
        break;
    }
}



void loop() {
  while (Serial.available())
    handleInput(Serial.read());  
}

void clearbuffer() {
  char c;
  while (Serial3.available()) {
    c = Serial3.read();
  }
}
int findChar(String StringIN, char ChartoFind, byte StartPos) {
  char myChar;

  for (int i = StartPos; i &lt; StringIN.length(); i++) {
    myChar = StringIN.charAt(i);      
    if (myChar == ChartoFind) {
      return i;
    }

  }
  return -1;
}  

byte CreateCRC(String in) {
  int len = in.length();
  byte chr; 
  byte crc = 0;

  for (int i = 1; i &lt; len-1; i++) {
    chr = in.charAt(i);
    crc = crc xor chr;
  }
  return crc;
}