Непреднамеренные странные символы, добавленные к пакетам во время связи udp в Arduino - PullRequest
0 голосов
/ 17 января 2019

Stackoverflow!

Необычные странные символы добавляются к пакетам во время связи udp в Arduino.

Привет. Переполнение стека. Я столкнулся с проблемами, которые не мог решить при использовании Udp с Arduino. Я посмотрел много информации, чтобы решить эту проблему. Я также проверил различные случаи. Но я не могу решить это.

Проблема возникает с 24-го байта пакета. Символы, длина которых превышает 23, преобразуются в странные символы, а последующие предложения не выводятся. Ограничена ли пакетная передача UDP-связи 24 байтами? Если это так, я рад, но я хочу знать, как это решить. Пожалуйста, помогите мне.

Тестовая среда выглядит следующим образом. Два Arduino подключены через кабель локальной сети. Кроме того, следующий исходный код был загружен в Arduino. Последовательный монитор выглядит следующим образом.

TX последовательный монитор

. , 17: 46: 31.521 -> Отправка UDP-сообщения

17: 46: 32.516 -> Отправка UDP-сообщения

17: 46: 33.514 -> Отправка UDP-сообщения

17: 46: 34.519 -> Отправка UDP-сообщения

17: 46: 35.515 -> Отправка UDP-сообщения

17: 46: 36.510 -> Отправка UDP-сообщения

RX последовательный монитор

17: 38: 51.664 -> 010010010101001010101001K; ⸮ <---------- проблема </p>

17: 38: 52.662 -> Полученный пакет размером 31

17: 38: 52.662 -> от 192.168.1.251, порт 5678

17: 38: 52.662 -> Содержание:

17: 38: 52.662 -> 01001001010100101010100j⸮ <------- проблема </p>

17: 38: 53.663 -> Полученный пакет размером 31

17: 38: 53.663 -> от 192.168.1.251, порт 5678

17: 38: 53.663 -> Содержание:

17: 38: 53.663 -> 010010010101001010101001; ے <------------ проблема </p>

17: 38: 56.770 -> Полученный пакет размером 31

--------- Исходный код -------------

///////////TX
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

#define MSG_INTERVAL 1000

// network parameters
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0E, 0x05, 0x04};  // ethernet interface MAC address
IPAddress localIp(192, 168, 1, 251);    // local ip address
IPAddress destIp(192, 168, 1, 15);      // destination ip address
unsigned int port = 5678;               // destination port

// EthernetUDP to send and receive messages.
EthernetUDP Udp;

// message string
char message[] = "0100100101010010101010010101010";

// timing
//unsigned long previousLedMillis;
//unsigned long ledInterval;
unsigned long previousSendMillis;
unsigned long sendInterval;

// setup the arduino and shields
void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  // start ethernet and udp
  Ethernet.begin(mac,localIp);    // static ip version

  // open UDP port
  Udp.begin(port);

  // show the local ip address (useful for dhcp)
  Serial.print("Local IP: ");
  Serial.println(Ethernet.localIP());

  // initialize send interval
  sendInterval = MSG_INTERVAL;

}

// do tasks
void loop() {  
  // check if udp string has to be sent
  if(millis() - previousSendMillis >= sendInterval) {
    sendMessage();
  }
}

// send udp string
void sendMessage() {
  Serial.println("Sending UDP message");

  // store current millis
  previousSendMillis = millis();

  // send udp message
  Udp.beginPacket(destIp, port);
  Udp.write(message);
  Udp.endPacket();

}

/////RX
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 15);
IPAddress remIp(92, 168, 1, 176);

unsigned int localPort = 5678;      // local port to listen on

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

void setup() 
{
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  pinMode(5, OUTPUT);
  Serial.begin(115200);
  Serial.print("Local IP: ");
 Serial.println(Ethernet.localIP());
}

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());

    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    //Udp.read(packetBuffer,1024);

    Serial.println("Contents:");
    Serial.println(packetBuffer);
    //for (int i=0;i<packetSize;i++){
    //  Serial.print(packetBuffer[i]);
    //}
    //Serial.print('\n');
}

}

1 Ответ

0 голосов
/ 17 января 2019

да, вы имеете право, некоторые проблемы с длиной 24 !!

если вы прочитаете файл EthernetUDP.h, вы увидите:

 #define UDP_TX_PACKET_MAX_SIZE 24

, поэтому, если вы хотите использовать больше символов, не используйте это const, выберите ваш персональный размер.

изменение

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

до

char packetBuffer[50];

или используйте другое определение:

#define UDP_MAX_BUFFER  50 //for example

char packetBuffer[UDP_MAX_BUFFER];
...