нужна помощь

dimon077
Offline
Зарегистрирован: 22.10.2013

Здравствуйте!

У меня имеется arduino olimexino 328 и ethernet shield. Написал скетч для управления светодиодом через браузер:

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0, 103);
EthernetServer server(80);
int led = 2;
String readString = String (50);

void setup()
{
  Ethernet.begin(mac, ip);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() 
{  
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) 
      {
      if (client.available()) 
        {Serial.println("ON");
        char c = client.read();
        readString.concat (c);

        if (c == '\n') 
          {
            
            if(readString.indexOf ("PORT_ON")>0)  digitalWrite (led, HIGH);
            if (readString.indexOf ("PORT_OFF")>0) digitalWrite (led, LOW);  
          readString="";
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<head>");
          client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
          client.println("<title>\"ДИОД\"</title>");
          client.println("</head>");
          client.println("<body>");
          client.println("<FORM><INPUT TYPE=\"SUBMIT\" NAME=\"BN\" VALUE =\"PORT_ON\"></FORM>");
          client.println("<FORM><INPUT TYPE=\"SUBMIT\" NAME=\"BN\" VALUE =\"PORT_OFF\"></FORM>");
          client.println("</body></html>");
          delay(1);
          client.stop();
          }
        }       
      }
  }
}

Выглядит это так:

после продолжительных нажатий на кнопки PORN_ON/PORT_OFF происходит следующее:

и сервер перестает отвечать..работоспособность восстанавливается лишь отключением/включением питания. Подскажите в чем может быть проблема. Спасибо.

maksim
Offline
Зарегистрирован: 12.02.2012

Может при продолжительных и частых нажатиях? В результате чего readString переполняется и условие if (c == '\n') не выполняется и сервер не рвет соединение. 

Попробуйте увеличить задержку в 46 строке delay(200);

dimon077
Offline
Зарегистрирован: 22.10.2013

Увеличение задержки не помогает. А в 33 строке readString обнуляется.

 

maksim
Offline
Зарегистрирован: 12.02.2012

dimon077 пишет:

А в 33 строке readString обнуляется.

Обнуляется, да не обнуляется. А как она обнуляется если не будет в строке символа '\n' ? И как тогда сервер разорвет соединение и что у вас произойдет с программой если не разорвано соединение?

maksim
Offline
Зарегистрирован: 12.02.2012
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0, 103);
EthernetServer server(80);
int led = 2;
String readString = String (50);
#define TIMEOUT 1000UL

void setup()
{
  Ethernet.begin(mac, ip);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() 
{
  EthernetClient client = server.available();
  if (client) 
  {
    uint32_t time = millis();
    while (client.connected() && (millis()-TIMEOUT < time)) 
    {
      if (client.available()) 
      {
        Serial.println("ON");
        char c = client.read();
        readString.concat(c);

        if (c == '\n') 
        {
          if(readString.indexOf ("PORT_ON")>0)  digitalWrite (led, HIGH);
          if (readString.indexOf ("PORT_OFF")>0) digitalWrite (led, LOW);  
          readString="";
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<head>");
          client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
          client.println("<title>\"ДИОД\"</title>");
          client.println("</head>");
          client.println("<body>");
          client.println("<FORM><INPUT TYPE=\"SUBMIT\" NAME=\"BN\" VALUE =\"PORT_ON\"></FORM>");
          client.println("<FORM><INPUT TYPE=\"SUBMIT\" NAME=\"BN\" VALUE =\"PORT_OFF\"></FORM>");
          client.println("</body></html>");
          delay(1);
          client.stop();
          time = millis();
        }
      }       
    }
    client.stop();
  }
  
 
}

 

dimon077
Offline
Зарегистрирован: 22.10.2013

Все равно если часто нажимать происходит тоже самое.

maksim
Offline
Зарегистрирован: 12.02.2012

Хотите сказать что с кодом из #4 сообщения тоже виснет и не реагирует на нажатия?

dimon077
Offline
Зарегистрирован: 22.10.2013

Да. Если часто и быстро нажимать то происходит тоже самое о чем я писал в начале