Считайте после “зависания” ip адрес или другую конфигурацию. Скорее всего она будет дефолтной. А это значит, что чип ресетится. Может по питанию проваливается, может на аппаратный ресет чего прилетает.
Я как-то по дурости SPI наружу вывел, чтобы шиться… Так настройки слетали после прилета “разряда статики” от руки зимой.
Бывает не регулярно такая фигня, но самое интересное, что в момент якобы зависания, мало того что контроллер работает (моргает индикатор, программно заложил принцип моргания), но также публикуется mqtt на сервере, т.е. контроллер работает, w5500 получается тоже работает, но в этот момент не пингуется и webсервер который поднят на контроллере, тоже не отвечает
Ещё сейчас прикручу контроллеру пинговалку самого себя и если пинга не будет, то вставлю Ваш код для ресета w5500
Как прикрутите, поделитесь пожалуйста, что за пинговалка, я может тоже потестирую.
Так icmpping.h, но ещё не тестил
Больше похоже на то, что все сокеты заняты, чем на зависание. Проверяйте - где-то stop не отрабатывает, может быть.
а как проверить отработал stop или нет? или тут просто, если он есть то он гарантировано отработает? или всё-таки может не отработать не смотряна то что в коде он есть?
Штатно (не модифицируя библиотеку) - никак не проверить состояния сокетов. Только аккуратно код писать, чтобы на каждый коннект гарантированно был стоп. И чтобы закрывались они клииентом, не висели по 12 часов в alive state.
У 5500 всего 8 сокетов. На мкутт часть уйдёт, неаккуратный клиент подвесить остатки и все, приехали.
А нет ли команды чтобы принудительно закрыть все сокеты? И чтобы таймер через 3 секунды после попытки соединения дёргал эту команду
Есть. Например - stop(). Дергайте через 3 секунды.
Или прямо в чип команду шлите, если сумеете.
а stop() закрывает именно все сокеты? или только тот, который я только что открыл при установке соединения?
Я уж и не помню. Вроде какую-то “приборку” библиотека делает по ходу дела, но стоп конкретно связанный сокет клозит. Даже принудительно, если тот не хочет.
Читать исходники нужно, библиотеки разнообразно написаны.
Парни, помогите, второй день парюсь и нифига не выходит.
вообщем поднял сервер, на SD htm файлы, страницы на пк все нормально отображаются, но на одной странице есть два текстовых поля, и в них надо обновлять как-то данные при загрузке страницы. вот код этой страницы:
<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>wifi settings</title>
<script>
function GetSSID(){
nocache = "&nocache=" + Math.random() * 1000000;
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if (this.readyState == 4) {
if (this.status == 200) {
if (this.responseText != null) {
document.getElementById("ssid_val").innerHTML = this.responseText;
}
}
}
}
request.open("GET","ssid_val" + nocache, true);
request.send(null);
setTimeout('GetSSID()', 1000);
}
</script>
<style>BODY{background: blue;}</style>
<style>p{color: white;}A{color: white;}A:hover{color: red;}A:active{color: rgb(255,165,0);}</style>
<style>.previous,.next{float:left;width: 50%;}.next {text-align: right;}</style>
</head><body>
<hr style="width: 100%; height: 2px;">
<center style="font-weight: bold;">
<p><big><big>Attention! It is not recommended to change these settings
(possible loss of connection between WI-FI devices and the router)!</big></big></p>
<hr style="width: 100%; height: 2px;">
<p><strong style="font-weight: normal;"><span style="font-weight: bold;">SSID:</span></strong> <br>
</p>
<p> <input name="SSID" value="GetSSID()"></p>
<p><strong style="font-weight: normal;"><span style="font-weight: bold;"></span></strong></p>
<hr style="width: 100%; height: 2px;">
<p><strong style="font-weight: normal;"><span style="font-weight: bold;">PASSWORD:</span></strong><br>
</p>
<p><input name="PASS" value="pass_val"></p>
<hr style="width: 100%; height: 2px;"></center>
<a href="index.htm" class="previous"><big><big>«</big></big>BACK</a><a href="#" class="next">SAVE <big><big>»</big></big></a>
</body></html>
по идее должен быть get запрос ssid_val, но на ардуинку ничего не приходит.
вот код на ардуине:
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
byte MACAddress[] = {0x4C, 0xD3, 0xAF, 0x1B, 0xF8, 0x99};
byte IPAddress [] = {192, 168, 0, 17}; // IP адрес зависит от ваших сетевых настроек
byte subnetMask[] = {255, 255, 255, 255}; //subnet mask (маска подсети)
EthernetServer server(80); // Можно выбрать и другой порт
#define REQ_BUF_SZ 20 // Размер буфера для HTTP запроса
char HTTP_req[REQ_BUF_SZ] = {0}; // HTTP запрос, сохраняемый как null terminated строка
char req_index = 0; // индех HTTP_req буфера
// Обнуляем массив
void StrClear(char *str, char length) {
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}
// Ищем совпадение в запросе
char StrContains(char *str, char *sfind) {
char found = 0;
char index = 0;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;
}
index++;
}
return 0;
}
//*******************************************************************
bool sd_ok;
void setup() {
//инициализация SerialPort
Serial.begin(9600);
if (!SD.begin(4) ) return;
sd_ok=true;
//настройка сервера
Ethernet.init(10);
Ethernet.begin(MACAddress, IPAddress);
Ethernet.setSubnetMask(subnetMask);
// Подключились к Ethernet
// Запустили сервер
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
Serial.print("dnsServerIP: ");
Serial.println(Ethernet.dnsServerIP());
Serial.print("subnetMask: ");
Serial.println(Ethernet.subnetMask());
Serial.print("gatewayIP: ");
Serial.println(Ethernet.gatewayIP());
}
void loop() {
EthernetClient client = server.available(); // try to get client
if (client) {
boolean currentLineIsBlank = true;
File webFile;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// оставить последний элемент массива 0 (null terminate строка)
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // сохраняем символ HTTP запроса
req_index++;
}
Serial.print(c); // печатаем HTTP запрос в Serial
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
// Открываем запрошенный файл
if (StrContains(HTTP_req, "GET / ") || StrContains(HTTP_req, "GET /index.htm")) {
webFile = SD.open("htm/index.htm");
} else if (StrContains(HTTP_req, "GET / ") || StrContains(HTTP_req, "GET /secure.htm")) {
webFile = SD.open("htm/secure.htm");
}
// Посылаем веб-страницу клиенту
if (webFile) {
while (webFile.available()) {
client.write(webFile.read());
}
webFile.close();
}
// Обнуляем буфер
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(1);
client.stop();
} // end if (client)
}
в Serial по идее должен был отобразится GET запрос ssid_val, но не тут то было.
вот что в сериале:
GET /secure.htm HTTP/1.1
Host: 192.168.0.17
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.0.17/
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
GET /favicon.ico HTTP/1.1
Host: 192.168.0.17
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.0.17/secure.htm
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Что не так с html кодом, я на него грешу?
console.log(‘privet’) в JS и F12 в бровзере.
Вы оказались абсолютно правы. Словил наконец-то “зависание” и проверил ip-шник, и он оказался дефолтный. Дождался выполнения Ethernet.begin(mac, ip); по таймеру и всё снова заработало. Блин, я уже не знал что делать, а тут вон оно что оказывается. Большое вам спасибо!
Но тогда следующий вопрос, что можно сделать с пином ресет, может как-то его к земле притянуть или к плюсу? Конденсатор может какой поставить попробовать? Чтобы на него меньше прилетало, потому что прилетает нередко.
Вспомнил, sadman41 рекомендовал кинуть резистор 10k на плюс 3,3 и конденсатор 0,1 mf на землю, попробуем.
Чем больше величины данной цепочки, тем дольше время старта процессора. Эта цепочка по сбросу нужна обязательно, чтобы все переходные процессы в схеме после включения приняли свои расчетные параметры. Иногда и 1 мкФ мало.
Ну и, к слову, в ответственных конструкциях все равно стоит периодически проверять - соответствует ли считанный с чипа ip (к примеру) заданному. Если не соответствует, то это означает сборную ситуацию и конфигурирование сетевого чипа следует повторить. Или замигать лампочкой.
В w5500 есть прерывания на разные события, если его повесить на прерывания МК - точно никакая проблема мимо не пролетит.