Два порта на Uno с Ethernet-экраном

Я создаю устройство с мод-шиной Arduino, а также хочу создать веб-страницу, которая позволит мне удаленно сбросить настройки устройства в случае возникновения каких-либо проблем. Для этого мне понадобится, чтобы мод-шина работала через порт 502, а веб-страница работала через порт 80. Возможно ли, чтобы Arduino поддерживал два порта? Я использую Uno с экраном Ethernet и стандартный файл ehternet.h с библиотекой Modbus. Есть предложения или идеи?

 #include SPI.h
 #include VL53L0X.h
 #include Ethernet.h
 #include Modbus.h
 #include ModbusIP.h
 #include VL53L0X.h
 #include Wire.h

VL53L0X sensor;
EthernetServer server(80);

//Смещения регистров Modbus (0-9999)
const int SENSOR_Hreg0 = 100;

//Объект ModbusIP
ModbusIP mb;

short ts;

void setup() {
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  byte ip[] = { 192, 168, 1, 177 };

  Wire.begin();
  mb.config(mac, ip);

  // Добавляем регистр SENSOR_Ireg — используйте addIreg() для аналоговых входов
  mb.addHreg(SENSOR_Hreg0);


  ts = millis();

  //Настройка датчика
  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();

  //удаленный сброс
    pinMode(13, INPUT);
    digitalWrite(13, LOW);

   // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для собственного порта USB
  }
  Serial.println("Ethernet WebServer Example");

  // запускаем Ethernet-соединение и сервер:
  Ethernet.begin(mac, ip);

  // Проверка наличия оборудования Ethernet
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // запускаем сервер
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

}

void loop() {

  mb.task();

    //Веб-страница
    // прослушиваем входящих клиентов
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // http-запрос заканчивается пустой строкой
    bool currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // если вы дошли до конца строки (получили новую строку
        // символ) и строка пуста, http-запрос завершился,
        // чтобы вы могли отправить ответ
        if (c == '\n' && currentLineIsBlank) {
          // отправляем стандартный заголовок ответа http
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // соединение будет закрыто после завершения ответа
          client.println("Refresh: 5");  // обновляем страницу автоматически каждые 5 секунд
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // выводим значение каждого аналогового входа

            client.print("Distance Measures ");
            client.print(sensor.readRangeContinuousMillimeters());
            client.print("mm");
            client.println("<br />");
            client.print("Filter Count:");
            client.print(-2.2*sensor.readRangeContinuousMillimeters()+404);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }

      }

  //Модбус
  if (millis() > ts + 100) {
    ts = millis();

     mb.Hreg(SENSOR_Hreg0, sensor.readRangeContinuousMillimeters() );

     }
}}

Изменить: Примечание. Похоже, проблема связана где-то с датчиком, потому что, когда я запускаю его без кода датчика, проблем нет, но когда я добавляю его, проблема начинается снова.

, 👍0


1 ответ


Лучший ответ:

0
  • переместить обновление Modbus из условия if (client)

  • mb.begin() вызывает Ethernet.begin(). Не повторяйте это в setup()

  • переместить client.println("</html>"); Break; внутри блока if перед ним
  • скопируйте остальную часть обнаружения пустой строки из примера веб-сервера

  • stop() клиент после ответа

  • измените тип ts на unsigned long

,