SOLVED Exchanging serial data between 2 arduinos

I have a system where one arduino configured as a webserver requests data from a second board and displays it on a simple webpage. I thought all was well until I noticed the data wasn't being refreshed properly. Here is the relevant code from the sending board:

void loop() 
{  
if (Serial3.available() > 0) ReceiveData();
}
//////////////////////////////////////////////////////////////////////////////
void ReceiveData() //GREEN = inverter, YELLOW = standby mode, RED = high wind mode
{ 
    recValue = Serial3.read();
    if (recValue == '1') SendStatus();     
    else if(recValue == '2')
    {
      inverterOnFlag = true;
      digitalWrite(GREEN, HIGH);      
    }
    else if(recValue == '3')
    {
      inverterOnFlag = false;
      digitalWrite(GREEN, LOW);
    }
    else if(recValue == '4')
    {
      standbyModeFlag = true;
      digitalWrite(YELLOW, HIGH);
    }
    else if(recValue == '5') 
    {
      standbyModeFlag = false;
      digitalWrite(YELLOW, LOW);
    }
    else if(recValue == '6') 
    {
      highWindModeFlag = true;
      digitalWrite(RED, HIGH);
    }
    else if(recValue == '7')
    {
      highWindModeFlag = false;
      digitalWrite(RED, LOW);
    }
    Serial.print("Received value: ");
    Serial.println(recValue);
    recValue = 0;    
}
//////////////////////////////////////////////////////////////////////////////
void SendStatus() 
{
  const char startOfNumberDelimiter = '<';
  const char endOfNumberDelimiter   = '>';
  code = 0;
  if(inverterOnFlag == true) code = 1; //all on = 111, all off = 222
  else code = 2;
  if(standbyModeFlag == true) code += 10;
  else code += 20;
  if(highWindModeFlag == true) code += 100;
  else code += 200;
 
  Serial3.print (startOfNumberDelimiter);  
  Serial3.print(GetBatteryTemperature());
  Serial3.print(',');
  Serial3.print(GetVolts());
  Serial3.print(',');
  Serial3.print(GetAmps());
  Serial3.print(',');
  Serial3.print(code);  
  Serial3.print (endOfNumberDelimiter);
  
  Serial.print(GetBatteryTemperature());
  Serial.print("  ");
  Serial.print(GetVolts());
  Serial.print("  ");
  Serial.print(GetAmps());
  Serial.print("  ");
  Serial.println(code);   
  Serial3.flush();
  delay(100);
  
}

and here is the relevant code from the receiving (webserver) board:

void loop()
{
  Serial3.print('1'); 
  if(Serial3.available() > 0) ReceiveData();
    if (newData == true) 
    {
        strcpy(tempChars, receivedChars); // this temporary copy is necessary to protect the original data because strtok() used in parseData() replaces the commas with \0
        parseData();
        switch(code)
        { 
          case 111:          
          highWindModeFlag = true;
          standbyModeFlag = true;
          inverterOnFlag = true;          
          break;

          case 112:
          highWindModeFlag = true;
          standbyModeFlag = true;
          inverterOnFlag = false;    
          break;
          case 122:
          highWindModeFlag = true;
          standbyModeFlag = false;
          inverterOnFlag = false;    
          break;
          
          case 222:
          highWindModeFlag = false;
          standbyModeFlag = false;
          inverterOnFlag = false;    
          break;

          case 221:
          highWindModeFlag = false;
          standbyModeFlag = false;
          inverterOnFlag = true;    
          break;

          case 211:
          highWindModeFlag = false;
          standbyModeFlag = true;
          inverterOnFlag = true;    
          break;       
        }
        newData = false;
      }
  Serial.print("Battery Temp: ");
  Serial.print(battTemp);
  Serial.print("  ");
  Serial.print("Voltage: ");
  Serial.print(volts);
  Serial.print("  ");
  Serial.print("Amperage: ");
  Serial.print(amps);
  Serial.print("  ");
  Serial.print("Code: ");
  Serial.println(code);
  delay(500);
 }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ReceiveData() 
{
  if (Serial3.available() > 0 && newData == false) {
        rc = Serial3.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
                Serial.println(receivedChars);
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
void parseData()       // split the data into its parts
{
    char *strtokIndx; // this is used by strtok() as an index

    strtokIndx = strtok(tempChars,",");      // get the first part - the battery temperature, convert from ASCII to integer
    battTemp = atoi(strtokIndx);                  // and copy it to the battTemp variable for the switch/case statement 
    
    strtokIndx = strtok(NULL, ",");     // this continues where the previous call left off
    volts = atof(strtokIndx);      // convert this part to the first (volts) float variable

    strtokIndx = strtok(NULL, ",");     // this continues where the previous call left off
    amps = atof(strtokIndx);     // convert this part to the second (amps) float variable

    strtokIndx = strtok(NULL, ",");     // this continues where the previous call left off
    code = atoi(strtokIndx);  //flag code
}
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void GetData()
{
  
  Serial3.print('1');  
  if(Serial3.available() > 0) ReceiveData();
    if (newData == true) 
    {
        strcpy(tempChars, receivedChars); // this temporary copy is necessary to protect the original data because strtok() used in parseData() replaces the commas with \0
        parseData();
        switch(code)
        { 
          case 111:          
          highWindModeFlag = true;
          standbyModeFlag = true;
          inverterOnFlag = true;          
          break;

          case 112:
          highWindModeFlag = true;
          standbyModeFlag = true;
          inverterOnFlag = false;    
          break;

          case 122:
          highWindModeFlag = true;
          standbyModeFlag = false;
          inverterOnFlag = false;    
          break;
          
          case 222:
          highWindModeFlag = false;
          standbyModeFlag = false;
          inverterOnFlag = false;    
          break;

          case 221:
          highWindModeFlag = false;
          standbyModeFlag = false;
          inverterOnFlag = true;    
          break;

          case 211:
          highWindModeFlag = false;
          standbyModeFlag = true;
          inverterOnFlag = true;    
          break;       
        }
        newData = false;
      }
 
  Serial.print("Battery Temp: ");
  Serial.print(battTemp);
  Serial.print("  ");
  Serial.print("Voltage: ");
  Serial.print(volts);
  Serial.print("  ");
  Serial.print("Amperage: ");
  Serial.print(amps);
  Serial.print("  ");
  Serial.print("Code: ");
  Serial.println(code);
  delay(500);
  Serial3.flush();  
}

The sending board receives the character '1', and returns the data properly as shown in this clip from the serial monitor:


39  23.00  43.00  222
Received value: 1
41  24.00  22.00  222
Received value: 1
22  22.00  12.00  222
Received value: 1
43  20.00  65.00  222
Received value: 1
77  21.00  85.00  222
Received value: 1
90  21.00  89.00  222
Received value: 1
45  26.00  13.00  222
Received value: 1
89  22.00  45.00  222
Received value: 1
76  20.00  8.00  222
Received value: 1
69  23.00  22.00  222
Received value: 1
24  20.00  97.00  222

The problem is on the receiving end; below is the serial monitor output:

Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
71,23.00,98.00,222
Battery Temp: 71  Voltage: 23.00  Amperage: 98.00  Code: 222
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
70,25.00,56.00,222
Battery Temp: 70  Voltage: 25.00  Amperage: 56.00  Code: 222
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0
23,20.00,81.00,222
Battery Temp: 23  Voltage: 20.00  Amperage: 81.00  Code: 222
Battery Temp: 0  Voltage: 0.00  Amperage: 0.00  Code: 0

It gets the right data precisely 3 times, then all zeros after. Can anyone give me at least a hint of why this happening? I've tried different baud rates with no effect whatsoever.

Have you tried using serial,Print() to trace down the problem in your program?

I did, and placed the respective outputs in the post, unless you meant something else?

Definitely something else. Use serial.Print() to show if you actually read the proper variable when it is received. Continue the logic of the code and show the value begin used each step and then you can see at which line of code the error makes it self visible. It's called debugging.

Yeah, I am familiar with the term, lol.
Seriously, what's so puzzling is that I get the expected result precisely 3 times, then all gibberish. This is the misbehaving function, as near as I can tell:

void ReceiveData() 
{
  if (Serial3.available() > 0 && newData == false) {
        rc = Serial3.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
                Serial.println(receivedChars);
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

And the result of Serial.println(receivedChars):


36,29.00,73.00,111
34,25.00,48.00,111
94,25.00,64.00,111
44,25.<4<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<1,.,.,<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<1,.08,<<<<<<<<<<<<<<<<<<<<<<<<<<<<1108028<<<<<<<<<<<<<<<<<<<<<<<<<<<<104
<<<<<<<<<<<<<<<<<<<<<<<<<<<110,.22<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<1,09027<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<106,.,<<<<<<<<<<<<<<<<<<<<<<<<<<<<

I think I found the problem....double-checking now.

I simply changed if(Serial3.available() > 0) ReceiveData(); to while(Serial3.available() > 0) ReceiveData(); Duh.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.