WebServer перестает отвечать ?
- Войдите на сайт для отправки комментариев
Вс, 08/02/2015 - 11:44
Всем доброго времени суток!
Возникла необходимость сделать 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 также ничего не пишет :(.
Что я дела не так? Или китайский аналог именно так себя и ведет?
Также было замечено, что если убрать из когда основные строки типа digitalWrite и выводить только client.println("some text"), то вроде как все работает без проблем. Такое ощущениечто проблема возникает при работе с пинами.
incoming нигде не сбрасывается. Во всяком случае если пробела в запросе нет. Это может стать проблемой.
Я бы для пробы выбросил вывод в Serial.
Если делать сервер так делать его нормально, а не обрывать приём заголовка и начинать давать ему ответ. Это как минимум не хорошо.
Сделайте хотя бы как в стандартном примере 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"); } }Понял. Спасибо за ответы. Чуть позже проверю и отпишусь.
Заработало!!!! Спасибо!
Все работает, но хочется уточнить момент. Такое впечательние складывается, что каждый 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-раза. С чем это может быть связанно? С задержкой разрыва сессии клиента или с тем что пока идет запрос микроконтроллер несколько раз успевает его отловить?
попробуйте как писал kisoft incoming надо сбрасывать в 0 после выполнения case
OK! Все заработало! Спасибо!