WebServer перестает отвечать ?

zebox
Offline
Зарегистрирован: 08.02.2015

Всем доброго времени суток!

Возникла необходимость сделать web-реле, которое могло бы передавать сухой контакт через TCP\IP.

Под рукой есть следующие "железки": Dccduino Uno и Ethernet Shield W5100

Изначально решил потренироваться на светодиоде.

Написал (скопировал) следующий код:

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

byte ledPin=2;
boolean incoming = 0;
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192,168,10,15);
EthernetServer server(80);

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

void loop()
{
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
       boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
   
   Serial.println(c);
       if (incoming && c==' ')
       {
         incoming=0;
         //client.println("<h1>hello</h1>");
       }
       if (c=='$')
       {
         incoming=1;
       }
       
       if (incoming==1) {
       Serial.println(c);
       if (c=='1'){
       Serial.println("ON");
      
       digitalWrite(ledPin,HIGH);
 client.println("<h1>on</h1>");
       }
       if (c=='2') {
       Serial.println("OFF");
       digitalWrite(ledPin,LOW);
       client.println("<h1>off</h1>");

       }
       }
       if(c=='\n'){
        currentLineIsBlank = true;
       }
         else if (c != '\r') {
         currentLineIsBlank = false;
       }
   
  }
}

delay(1);
     client.stop();
     Serial.println("client stop");
}
}

В итоге после первого запроса светодиод загорается, страница возвращает "on", но иногда страница продолжает грузиться. После первого ни один запрос более не проходит. На ping хост Отвечает, но в ответ ничего не выдает, светодиод не реагирует, в serial также ничего не пишет :(.

Что я дела не так? Или китайский аналог именно так себя и ведет?

zebox
Offline
Зарегистрирован: 08.02.2015

Также было замечено, что если убрать из когда основные строки типа digitalWrite и выводить только client.println("some text"), то вроде как все работает без проблем. Такое ощущениечто проблема возникает при работе с пинами.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

incoming нигде не сбрасывается. Во всяком случае если пробела в запросе нет. Это может стать проблемой.
Я бы для пробы выбросил вывод в Serial.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если делать сервер так делать его нормально, а не обрывать приём заголовка и начинать давать ему ответ. Это как минимум не хорошо.

Сделайте хотя бы как в стандартном примере WebServer вот такой loop у Вас получится, попробовал у себя, работает.

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank)
        {        
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          switch(incoming)
          {
            case 1:
              digitalWrite(ledPin, HIGH);
              client.println("<h1>on</h1>");
            break;
            case 2:
              digitalWrite(ledPin, LOW);
              client.println("<h1>off</h1>");
            break;            
            default:
              client.println("<h1>WTF?!?!?</h1>");
          }          
          client.println("</html>");
          break;
        }
        if (c == '\n')
        {
          currentLineIsBlank = true;
        }
        else
        if (c != '\r')
        {        
          currentLineIsBlank = false;
        }
        if(c=='$')
          incoming = client.peek()-48;
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

 

zebox
Offline
Зарегистрирован: 08.02.2015

Понял. Спасибо за ответы. Чуть позже проверю и отпишусь.

zebox
Offline
Зарегистрирован: 08.02.2015

Заработало!!!! Спасибо!

zebox
Offline
Зарегистрирован: 08.02.2015

Все работает, но хочется уточнить момент. Такое впечательние складывается, что каждый case обрабатывается 3 раза подряд.

Т.е. написал 3-й кейс:

 case 3:
              client.println("<h1>blink</h1>");
            digitalWrite(ledPin, HIGH);
            delay(100);
            digitalWrite(ledPin, LOW);
            delay (100);
            digitalWrite(ledPin, HIGH);
            delay(100);
            digitalWrite(ledPin, LOW);
            delay (100);
            break;            

так вот при вводе запроса на 3 case, он повторяется 3-раза. С чем это может быть связанно? С задержкой разрыва сессии клиента или с тем что пока идет запрос микроконтроллер несколько раз успевает его отловить? 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

попробуйте как писал kisoft incoming надо сбрасывать в 0 после выполнения case

zebox
Offline
Зарегистрирован: 08.02.2015

OK! Все заработало! Спасибо!