Пример UDPSendReceiveString с использованием Arduino Due с Ethernet-модулем ENC28J60

Я пытался научиться использовать протокол UDP для использования в моем проекте автоматизации для отправки команд на Arduino Due по сети Ethernet с коммутационной платой ENC28J60, которую я подключил к выводам Due от SPI. Мне пришлось использовать другую библиотеку под названием EthernetENC.h, чтобы использовать этот модуль с Due.
Код Arduino:

#include <EthernetENC.h>
#include <EthernetUdp.h>

#define UDP_TX_PACKET_MAX_SIZE 256

// Введите ниже MAC-адрес и IP-адрес вашего контроллера.
// IP-адрес будет зависеть от вашей локальной сети:
byte mac[] = {
  0xA0, 0x36, 0xBC, 0x30, 0xC1, 0x16
};
IPAddress ip(192, 168, 137, 205);

unsigned int localPort = 8888;      // локальный порт для прослушивания

// буферы для приема и отправки данных
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // буфер для хранения входящего пакета,
char ReplyBuffer[] = "acknowledged";        // строка для отправки обратно

// Экземпляр EthernetUDP, позволяющий нам отправлять и получать пакеты по UDP
EthernetUDP Udp;

void setup() {
  // Вы можете использовать Ethernet.init(pin) для настройки вывода CS
Ethernet.init(10);  // Большинство шилдов Arduino
  //Ethernet.init(5); // Щит MKR ETH
  //Ethernet.init(0); // Тинси 2.0
  //Ethernet.init(20); // Тинси++ 2.0
  //Ethernet.init(15); // ESP8266 с Adafruit FeatherWing Ethernet
  //Ethernet.init(33); // ESP32 с Adafruit FeatherWing Ethernet

  // запускаем Ethernet
  Ethernet.begin(mac, ip);

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

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

  // запускаем UDP
  Udp.begin(localPort);
}

void loop() {
  // если есть данные, прочитать пакет
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i=0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // считываем пакет в packageBuffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // отправляем ответ на IP-адрес и порт, который отправил нам полученный пакет
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}

Обработка 3 кода:

 import hypermedia.net.*;

 UDP udp;  // определяем объект UDP


 void setup() {
 udp = new UDP( this, 6000 );  // создаем новое соединение с дейтаграммой на порту 6000
 //udp.log(истина); // <-- распечатка активности подключения
 udp.listen( true );           // и ждем входящего сообщения
 }

 void draw()
 {
 }

 void keyPressed() {
 String ip       = "192, 168, 137, 205";  // удаленный IP-адрес
 int port        = 8888;    // порт назначения

 udp.send("Hello World", ip, port );   // сообщение для отправки

 }

 void receive( byte[] data ) {       // <-- обработчик по умолчанию
 //пусто получить( byte[] data, String ip, int port ) { // <-- расширенный обработчик

 for(int i=0; i < data.length; i++)
 print(char(data[i]));
 println();
 }

А это моя тестовая установка:

После того, как я загружаю код в Due, сразу же запускается команда LinkOFF, и Serial.print() печатает сообщение «Кабель Ethernet не подключен». но это действительно неверно, так как эта настройка работала в других примерах Ethernet. Но кроме этого сообщения на последовательном мониторе ничего нет. На стороне обработки история еще более удручающая, потому что просто ничего не происходит. Есть только небольшое окно, и независимо от того, где щелкнуть или нажать любую клавишу на моей клавиатуре, ни одна строка не отправляется и не принимается. Я серьезно не знаю, что делать. У меня мало опыта работы с UDP, и я пытаюсь учиться, но единственный отзывчивый пример в библиотеке Arduino не работает.

Изменить: Я подключил ENC28J60 напрямую к порту Ethernet моего ноутбука и выбрал оттуда IP-адрес, который был адресом IPv4 = 192.168.137.1. Я также удалил linkOFF() из исходного примера, так как он просто бесполезно использовал последовательный монитор.

, 👍1

Обсуждение

Вы используете перекрестный кабель Ethernet? попробуйте подключиться к маршрутизатору и попробуйте основные примеры библиотеки Ethernet (с #include <EthernetENC.h>). лучше всего попробовать сначала пример WebClient, @Juraj


1 ответ


1

из https://github.com/JAndrassy/EthernetENC/wiki/Examples

Если Ethernet.linkStatus() вызывается слишком рано, он может вернуть LinkOFF. Вы можете сделать проверку в setup() следующим образом:

  if (Ethernet.linkStatus() == LinkOFF) {
    delay(500);
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
  }
,