Пример 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() из исходного примера, так как он просто бесполезно использовал последовательный монитор.
@Tunguska, 👍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.");
}
}
- ARDUINO MODBUS TCP СОЕДИНЕНИЕ
- Интерфейс ESP32 с ENC28J60
- Связь Arduino master/slave с использованием RS485
- Ручная установка Arduino Due
- Клиент MQTT на Arduino + SIM900
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Почему IDE не может найти плату, несмотря на то, что она четко видна и выбрана?
- Как настроить выводы ввода-вывода второго квадратурного декодера в Arduino IDE
Вы используете перекрестный кабель Ethernet? попробуйте подключиться к маршрутизатору и попробуйте основные примеры библиотеки Ethernet (с #include <EthernetENC.h>). лучше всего попробовать сначала пример WebClient, @Juraj