I'm doing a program that receives data from a web page every so often, but only receives the data once and then receives everything blank. I need help to receive the data every time indefinitely. I am using arduino uno with arduino etherner shield
My code:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 177);
EthernetClient client;
int REDLed= 2;
int GREENLed= 3;
int BLUELed= 4;
void setup()
{
pinMode(REDLed, OUTPUT);
pinMode(GREENLed, OUTPUT);
pinMode(GREENLed, OUTPUT);
Ethernet.begin(mac, ip);
Serial.begin(9600);
Serial.println("power up" );
delay(3000);
}
void loop()
{
Serial.println("SubmitHttpRequest - started" );
SubmitHttpRequest();
Serial.println("SubmitHttpRequest - finished" );
delay(10000);
}
void SubmitHttpRequest()
{
if (client.connect(server, 80))
{
Serial.println("connected");
client.println("GET /arduino/getstate.php?color=All HTTP/1.1");
client.println("Host: cybertodo.mx");
client.println("Connection: close");
client.println();
}
else
{
Serial.println("connection failed");
}
delay(100);
changeLed();
}
void changeLed()
{
String content = "";
Serial.println(client.available());
while(client.available()!=0)
{
content = content + String(char (client.read()));
}
Serial.println(content);
if(content.substring(30,31)== "1")
{
digitalWrite(REDLed, HIGH);
}
else if (content.substring(30,31)== "0")
{
digitalWrite(REDLed, LOW);
}
if(content.substring(31,32)== "1")
{
digitalWrite(GREENLed, HIGH);
}
else if (content.substring(31,32)== "0")
{
digitalWrite(GREENLed, LOW);
}
if(content.substring(32,33)== "1")
{
digitalWrite(BLUELed, HIGH);
}
else if (content.substring(32,33)== "0")
{
digitalWrite(BLUELed, LOW);
}
content = "";
}
-
Looks like you might be looping faster than the client.avaiable() is receiving data. Consider what happens if you only get half the response at a time -- the ifs drop though, you delete the content, then exit the changeLed() and de-allocate content. Consider making content global, and acting and clearing only when you get a full message.Dave X– Dave X2018年01月12日 02:22:22 +00:00Commented Jan 12, 2018 at 2:22
1 Answer 1
Immediately after making the request when reading client.available() will be 0 since no data was received yet so:
while(client.available()!=0)
{
content = content + String(char (client.read()));
}
Will never actually run. Try something like:
unsigned long last = millis();
String content = "";
while(client.connected()) {
int len = client.available();
if(len > 0) {
last = millis();
char buff[len];
for(int i = 0; i < len; i++) {
buff[i] = client.read();
}
content += String(buff);
} else {
if(millis() - last > 2000) {
client.stop();
return;
}
delay(1);
}
}
Also note if you use Connection: close on the client then you must close the connection. This example doesn't do that until 2 seconds have passed. To do this properly you'd need to also add header parsing to your client and close the connection once the amount specified in Content-Length is received.