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.