Arduino отправляет несогласованные UDP-сообщения - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь установить связь по протоколу UDP с платой Arduino UNO + Ethernet с ПК, но не могу сделать это правильно.

Факты:

  • Код Arduino состоит из 2 блоков: первый блок отправляет постоянное сообщение каждые 5 секунд на ПК. Второй блок был реализован как ECHO (возвращает то, что получает)
  • UDP правильно инициализирован
  • В начале Arduino начинает отправку сообщения "Hello PC!" каждые 5 секунд, но UDP.beginPacket не возвращает 1 (как это должно быть при правильной работе).
  • на стороне ПК у меня есть wireshark и PacketSender для проверки связи tx / rx UDP.
  • Wireshart не обнаруживает никаких входящих пакетов от Arduino после сброса.
  • Пакет UDP "Hello arduino!" отправляется с ПК в Arduino через PacketSender. Эта упаковка правильно получена в Arduino и отправлена ​​обратно на компьютер. Wireshark идентифицирует UDP-пакет TX от ПК и тот же UDP-пакет RX от Arduino. Это работает правильно.
  • Buuuuuuuuuttttttt ...... затем, после отправки UDP-сообщения с ПК и получения ECHO, сообщения от Arduino каждые 5 секунд начинают доходить до ПК.
  • Первое сообщение, полученное на ПК после ECHO, имеет 21 байт (хотя отправленное сообщение должно иметь 11 байтов). Получено сообщение: « C! Hello hellhello PC! », поэтому существует некоторая буферная корзина с «hello PC!» в конце.
  • Странно то, что после этого каждые 5 секунд ПК получает пакет UDP, каждый раз на 9 байт длиннее (привет ПК! Составляет 9 байт) и, как и в первом сообщении, полученном от Arduino, в конце сообщение вы можете найти «привет ПК!». Вот пример 9-го полученного сообщения: « ПК! Привет! ПК! длина байта).
  • Я использую стандартные библиотеки Arduino Ethernet, поэтому я не знаю, что происходит и почему он ничего не отправляет, пока в Arduino не поступит первое сообщение (и не знаю, почему оно увеличивается при каждой отправке).
  • Я протестировал Arduino с Raspberry с Raspbian, чтобы убедиться, что проблема не на стороне ПК, и Raspberry получил такое же ошибочное поведение UDP.

Arduino код:

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

byte mac\[\] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x3D};
IPAddress ip(192, 168, 1, 6); //IP of the arduino ethernet board
char link_IP\[\] = {192, 168, 1, 3}; //IP of the PC
unsigned int localPort = 51115;      // local port to listen on


char message\[\] = "hello PC!"; //message intended to sended from the arduino
char packetBuffer\[UDP_TX_PACKET_MAX_SIZE\]; // UDP_TX_PACKET_MAX_SIZE = 24
unsigned long millis_before = millis(); //variable for delaying 5 seconds the message
EthernetUDP Udp;

void setup() 
{
  Serial.begin(9600); //serial com for debugging
  Ethernet.begin(mac, ip); //starting Ethernet
  if (Udp.begin(localPort)==1) Serial.println("port UDP is open"); //starting UDP on 51115
  else while(1); //if UDP not open, infinte bucle
}

void loop() 
{
  if (millis_before + 5000 < millis()) //loop for waiting 5 seconds between messages
  {
    if (Udp.beginPacket(link_IP, 51115)==1) Serial.print("TX ready - "); // UDP packet to PC port 51115, if beginPacket returns 1 is OK
    Serial.print("Lenght:");
    Serial.print(Udp.write(message, 9)); //returns the length of the message
    if (Udp.endPacket()==1) Serial.println(" - Sent!"); //if endPacket returns 1, is OK
    millis_before = millis(); //reset timer
  }
  delay(10);
  int packetSize = Udp.parsePacket(); //check size of UDP packet 
  if (packetSize) 
  {
    IPAddress remote = Udp.remoteIP(); //save remote IP
    for (int i = 0; i < 4; i++)  //bucle for printing the remote IP
    { 
      Serial.print(remote\[i\], DEC);
      if (i < 3) Serial.print(".");
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort()); //printing the remote port
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); // read the packet into packetBufffer

    // send a echo to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(packetBuffer, packetSize);
    Udp.endPacket();
  }
}

Здесь вы можете найти захваты PacketSender и Wireshark после отправки первого сообщения в Arduino и получения ECHO:

захват проволочной акулы

захват отправителя пакета

Я ценю любую помощь. Заранее спасибо

1 Ответ

0 голосов
/ 01 июля 2018

решаемая. Проблема была в формате массива символов IP для доставки пакета. Я определил его как массив из 4 символов, но он должен быть определен как текстовый массив:

char link_IP[] = "192.168.1.3"; //correct !!

char link_IP[] = {192, 168, 1, 3}; // Wrong
...