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 у Вас получится, попробовал у себя, работает.
Понял. Спасибо за ответы. Чуть позже проверю и отпишусь.
Заработало!!!! Спасибо!
Все работает, но хочется уточнить момент. Такое впечательние складывается, что каждый case обрабатывается 3 раза подряд.
Т.е. написал 3-й кейс:
так вот при вводе запроса на 3 case, он повторяется 3-раза. С чем это может быть связанно? С задержкой разрыва сессии клиента или с тем что пока идет запрос микроконтроллер несколько раз успевает его отловить?
попробуйте как писал kisoft incoming надо сбрасывать в 0 после выполнения case
OK! Все заработало! Спасибо!