Ethernet shield ответ от внешнего сервера

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

Есть arduino mega+Ethernet shield. Отправляю данные о датчиках на внешний сервер, а ответ получить не выходит.

Подскажите, что делаю не так:

void WebServer()                                 // Функция отправки и приема данных на вебсервер
{
  if (client.connect(server, 80))                // Проверяем связь с сервером
  {
    addr="GET /add_data.php?a=1&t=10.5";         // Формируем запрос на сервер с меткой активности a=1 и данными датчиков

    Serial.println(addr);
    client.print(addr);                          // Отправляем запрос на вебсервер
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
    client.println();

    delay(200);

    while (client.available())                   // Получение ответа вебсервера
    {
      char c = client.read();                    // Считываем по-байтно ответ вебсервера
      answ=String(answ+c);                       // Объединяем ответ отду строку d1
      Serial.print(c);                           // тут ничего не отображается
    }
    client.stop();
    client.flush();
    delay(200);
  }
  else                                           // если связи с сервером нет, выводим сообщение, пауза и заново
  {
    client.stop();
    Serial.println("no connect");
  }
// конец блока работы Ethernet Shield  
}

Приведите весь код. По обрывку не понятно.

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

byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server[] = "server.ru";           // имя вашего сервера
String addr,answ,d1,d2,ttt;             // addr - команды серверу, d1 - ответ сервера по состоянию светодиода 1 - вкл, 0 - выкл
uint32_t Timer[8], interval=30000;      // массив таймеров функций: 0-RFid, 1-W5100, 2-gercons, 3-реле кондея, 4-температура, 5-электричество, 6-септик, 7-сирена сигнализации

void setup()
{
  Ethernet.begin(mac);
  Serial.begin(57600);                  // Запускаем вывод данных на серийный порт
  while (!Serial);                      // Ждем пока не инициализируется монитор серийного порта
  SPI.begin();                          // Инициализируем интерфейс SPI
}

void loop()
{

// блок работы Ethernet Shield  
  if (millis() - Timer[1] >= 10000)      // ищем разницу (5 сек)
  {
    Timer[1] = millis();                // сброс таймера отправки данных на вебсервер
    WebServer();                        // вызов функции отправки данных на вебсервер
  }

}


void WebServer()                                 // Функция отправки и приема данных на вебсервер
{
  if (client.connect(server, 80))                // Проверяем связь с сервером
  {
    addr="GET /add_data.php?a=1&t=10";                // Формируем запрос на сервер с меткой активности a=1 и данными датчиков температуры

    Serial.println(addr);
    client.print(addr);                          // Отправляем запрос на вебсервер
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
    client.println();

    delay(200);

    while (client.available())                   // Получение ответа вебсервера
    {
      char c = client.read();                    // Считываем по-байтно ответ вебсервера
      answ=String(answ+c);                       // Объединяем ответ отду строку d1
      Serial.print(c);
      //Serial.println("+");
    }
    client.stop();
    client.flush();
    delay(50);

    //Serial.print("answ_ser=");
    //Serial.println(answ); 
  }
  else                                           // если связи с сервером нет, выводим сообщение, пауза и заново
  {
    client.stop();
    Serial.println("no connect");
  }
// конец блока работы Ethernet Shield  
}
 

Уже было. Убери mac из begin. И в стандарте строка запроса \n\r должна быть.

просто оставить

 Ethernet.begin();

?

Да. Не для всех плат он нужен.

и вместо двух client.println();

пишу

client.println("\n\r");

Попробуй пока без этого и смотри на сервере - нюхает ли его ардуинка через плату. Или tcpdump поможет.

я еще видел ожидание ответа по-другому писали

    while (client.connected())                   // Получение ответа вебсервера
    {
      if ((client.available())
      {
        char c = client.read();                    // Считываем по-байтно ответ вебсервера
        answ=String(answ+c);                       // Объединяем ответ отду строку d1
        Serial.print(c);
      }
    }

Я бы вписал пошаговую диагностику, чтобы ошибку найти. Пропиши после каждого сетевого действия - что делаешь и в ошибки добавь вывод. Выводи все в консоль, чтобы было понятно.

это точно определенно нужно тоже!

Спрашивал тех.поддержку, почему нет ответа. Они мои запросы видят, но говорят, что сам клиент обрывает соединение и сервер просто не успевает ответить

естественно, и это хорошо видно по вашему коду, лично я это вижу

и где это?

В поддержке предложили увеличить задержку в строке 47, у меня раньше delay(50) стояло, они сказали сделайте 150-200, но это не помогло

давайте я переформулирую вопрос, вам нужен готовый код, или обучение ?
ведь если вы получите код, вы нечему не научитесь…

лично я могу дать только код, а не подсказывать что вы делаете не так, особенно если вы не исправляете… согласно советам)))

доступ к ардиуне будет только вечером, поэтому пока я не могу ничего исправить, но верному коду был бы весьма благодарен)

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

byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server[] = "server.ru";           // имя вашего сервера
String addr, answ, d1, d2, ttt;        
uint32_t Timer[8], interval = 30000;   

void setup()
{
Ethernet.begin(mac);
Serial.begin(57600);                  
while (!Serial);                      
SPI.begin();                          

// Небольшая задержка для инициализации Ethernet
delay(1000);

// Получаем и выводим IP-адрес
Serial.print("Ethernet initialized. IP address: ");
Serial.println(Ethernet.localIP());

// Дополнительная информация о сети
Serial.print("Subnet mask: ");
Serial.println(Ethernet.subnetMask());
Serial.print("Gateway IP: ");
Serial.println(Ethernet.gatewayIP());
Serial.print("DNS server: ");
Serial.println(Ethernet.dnsServerIP());
}

void loop()
{
// блок работы Ethernet Shield  
if (millis() - Timer[1] >= 10000)      // каждые 10 секунд
{
Timer[1] = millis();                
WebServer();                        
}
}

void WebServer()
{
answ = "";  // Очищаем строку ответа перед новым запросом

if (client.connect(server, 80))
{
addr = "GET /add_data.php?a=1&t=10";  // Формируем запрос

Serial.print("Sending: ");
Serial.println(addr);

// Отправляем HTTP запрос (важно: всё одной командой println)
client.println(addr + " HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();  // Пустая строка обязательна!

// Ждем ответ от сервера с таймаутом
unsigned long timeout = millis() + 5000;  // Таймаут 5 секунд

while (!client.available()) 
{
if (millis() > timeout)
{
Serial.println("Server response timeout!");
client.stop();
return;
}
delay(10);  // Небольшая задержка чтобы не грузить процессор
}

// Читаем ответ сервера
Serial.println("Server response:");
while (client.available()) 
{
char c = client.read();
Serial.print(c);          // Выводим в монитор порта
answ += c;                 // Сохраняем в строку
}

// Проверяем, есть ли ещё данные (сервер может отправлять частями)
delay(100);
while (client.available()) 
{
char c = client.read();
Serial.print(c);
answ += c;
}

Serial.println("End of response");

client.stop();
client.flush();

// Здесь можно обработать ответ
// Например, если сервер возвращает "1" или "0" для управления
if (answ.length() > 0)
{
// Поиск данных в ответе (например, значение для светодиода)
if (answ.indexOf("LED_ON") > 0)
{
Serial.println("Command: Turn LED ON");
d1 = "1";
}
else if (answ.indexOf("LED_OFF") > 0)
{
Serial.println("Command: Turn LED OFF");
d1 = "0";
}
}
}
else
{
Serial.println("Connection failed - no connect");
client.stop();
}
}

не факт что рабочий!!!
эх Diskless Diskless… я то думал… а вы… эээээх

буду пробовать, спасибо

ну и что работает или нет ?)))
если не работает не стоит замыкаться в себе,
надо кричать ааааабманули, подсунули не рабочий код, желательно описав что не так…