Arduino发送不一致的UDP消息

时间:2018-06-30 13:54:19

标签: arduino udp

我正在尝试使用UDP与PC的Arduino UNO +以太网板进行通信,但是无法正确完成。

事实:

  • Arduino代码有2个块:第一个块每5秒向PC发送一条恒定消息。第二个程序段已实现为ECHO(返回接收到的内容)
  • UDP已正确初始化
  • 开始时,Arduino开始发送消息“ Hello PC!”。每5秒一次,但是UDP.beginPacket不会返回1(这应该在正常工作时返回)。
  • 在PC端,我有wirehark和PacketSender来检查tx / rx UDP通信。
  • 在重置后,Wireshart不会检测到来自Arduino的任何传入软件包。
  • UDP程序包“ Hello arduino!”通过PacketSender从PC发送到Arduino。这个打包好的东西可以在Arduino中正确接收并发送回PC。 Wireshark识别来自PC的tx UDP数据包和来自Arduino的相同rx UDP数据包。这可以正常工作。
  • Buuuuuuuuututtttttt ......……然后,在从PC发送UDP消息并接收到ECHO之后,每5秒钟来自Arduino的消息就会开始到达PC。
  • 在ECHO之后在PC上收到的第一条消息有21个字节(尽管发送的消息应该有11个字节)。收到的消息是“ C!hello hellhello PC! ”,因此“ hello PC!”存在某种缓冲区垃圾。最后。
  • 奇怪的是,在此之后,每5秒钟PC就会收到UDP数据包,每延长9字节(Hello PC!是9字节消息),就像从Arduino收到的第一条消息一样,消息中您可以找到“ hello PC!”。这是收到的第9条消息的示例:“ PC!hello PC!lhello PC!45hello!llo!helhello PC!hellhello!ohello PC!hello Phello PC! ” (长度为95个字节)。
  • 我使用标准的Arduino以太网库,所以我不知道发生了什么,为什么在第一条消息到达Arduino之前它什么都不发送(也不知道每次发送时它为什么会增加)。 / li>
  • 我用Raspbian在Raspberry上测试了Arduino,以确保问题不在PC端,并且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();
  }
}

在将第一条消息发送给Arduino并收到ECHO之后,您可以在此处找到PacketSender和Wireshark捕获:

wireshark capture

packet sender capture

我非常感谢您的帮助。预先感谢

1 个答案:

答案 0 :(得分:0)

已解决。问题出在IP的char数组格式中,用于传递数据包。我将其定义为4个字符数组,但应将其定义为文本字符数组:

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

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