Вопрос по Ethernet модуль w5500

Считайте после “зависания” ip адрес или другую конфигурацию. Скорее всего она будет дефолтной. А это значит, что чип ресетится. Может по питанию проваливается, может на аппаратный ресет чего прилетает.
Я как-то по дурости SPI наружу вывел, чтобы шиться… Так настройки слетали после прилета “разряда статики” от руки зимой.

1 лайк

Бывает не регулярно такая фигня, но самое интересное, что в момент якобы зависания, мало того что контроллер работает (моргает индикатор, программно заложил принцип моргания), но также публикуется mqtt на сервере, т.е. контроллер работает, w5500 получается тоже работает, но в этот момент не пингуется и webсервер который поднят на контроллере, тоже не отвечает

Ещё сейчас прикручу контроллеру пинговалку самого себя и если пинга не будет, то вставлю Ваш код для ресета w5500

Как прикрутите, поделитесь пожалуйста, что за пинговалка, я может тоже потестирую.

Так icmpping.h, но ещё не тестил

Больше похоже на то, что все сокеты заняты, чем на зависание. Проверяйте - где-то stop не отрабатывает, может быть.

1 лайк

а как проверить отработал 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>&nbsp;<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 есть прерывания на разные события, если его повесить на прерывания МК - точно никакая проблема мимо не пролетит.