нужна помощь
- Войдите на сайт для отправки комментариев
Втр, 22/10/2013 - 13:50
Здравствуйте!
У меня имеется 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 происходит следующее:

и сервер перестает отвечать..работоспособность восстанавливается лишь отключением/включением питания. Подскажите в чем может быть проблема. Спасибо.
Может при продолжительных и частых нажатиях? В результате чего readString переполняется и условие
if(c =='\n')не выполняется и сервер не рвет соединение.Попробуйте увеличить задержку в 46 строке delay(200);
Увеличение задержки не помогает. А в 33 строке readString обнуляется.
А в 33 строке readString обнуляется.
#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(); } }Все равно если часто нажимать происходит тоже самое.
Хотите сказать что с кодом из #4 сообщения тоже виснет и не реагирует на нажатия?
Да. Если часто и быстро нажимать то происходит тоже самое о чем я писал в начале