SBM
27.Февраль.2026 13:10:27
1
Здравствуйте.
Есть 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
}
BOOM
27.Февраль.2026 13:15:15
2
Приведите весь код. По обрывку не понятно.
SBM
27.Февраль.2026 13:29:29
3
#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 должна быть.
Да. Не для всех плат он нужен.
SBM
27.Февраль.2026 13:38:55
7
и вместо двух client.println();
пишу
client.println("\n\r");
Попробуй пока без этого и смотри на сервере - нюхает ли его ардуинка через плату. Или tcpdump поможет.
SBM
27.Февраль.2026 13:42:30
9
я еще видел ожидание ответа по-другому писали
while (client.connected()) // Получение ответа вебсервера
{
if ((client.available())
{
char c = client.read(); // Считываем по-байтно ответ вебсервера
answ=String(answ+c); // Объединяем ответ отду строку d1
Serial.print(c);
}
}
Я бы вписал пошаговую диагностику, чтобы ошибку найти. Пропиши после каждого сетевого действия - что делаешь и в ошибки добавь вывод. Выводи все в консоль, чтобы было понятно.
BABOS
27.Февраль.2026 13:47:45
11
SBM:
по-другому писали
это точно определенно нужно тоже!
SBM
27.Февраль.2026 14:02:41
12
Спрашивал тех.поддержку, почему нет ответа. Они мои запросы видят, но говорят, что сам клиент обрывает соединение и сервер просто не успевает ответить
BABOS
27.Февраль.2026 14:06:11
13
естественно, и это хорошо видно по вашему коду, лично я это вижу
SBM
27.Февраль.2026 14:10:12
15
В поддержке предложили увеличить задержку в строке 47, у меня раньше delay(50) стояло, они сказали сделайте 150-200, но это не помогло
BABOS
27.Февраль.2026 14:13:45
16
давайте я переформулирую вопрос, вам нужен готовый код, или обучение ?
ведь если вы получите код, вы нечему не научитесь…
лично я могу дать только код, а не подсказывать что вы делаете не так, особенно если вы не исправляете… согласно советам)))
SBM
27.Февраль.2026 14:17:20
17
доступ к ардиуне будет только вечером, поэтому пока я не могу ничего исправить, но верному коду был бы весьма благодарен)
BABOS
27.Февраль.2026 14:18:50
18
#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 … я то думал… а вы… эээээх
BABOS
28.Февраль.2026 05:42:57
20
ну и что работает или нет ?)))
если не работает не стоит замыкаться в себе,
надо кричать ааааабманули, подсунули не рабочий код, желательно описав что не так…