Search code examples
udpbufferarduinoprocessingextra

Arduino: UDP sending yields extra characters


At the moment I have an Arduino board with an Ethernet Shield connected to a router. My computer connects to this router via Wi-Fi. My board and my computer send UDP messages back and forth to each other. My computer is a client, and the board is a server. However I noticed, that when I send a longer UDP message from my computer, and then a shorter UDP message, the Arduino accepts the shorter message, then followed by remaining bits from the longer message.

For instance: if I send "Hello World" from my computer, followed with "Test"; the Arduino will not read the second message as "Test", but rather: "Testo World".

I thought perhaps in was a problem from the Arduino end first. The Arduino stores the messages temporarily in an array called packetBuffer. I tried clearing this buffer before I receive a new message each time. The buffer would clear, but then I would receive the faulty message again.

So I assume the culprit is the computer, the client. On the computer end I have a processing sketch that sends the UDP messages. The example below is not the sketch itself; however it is by far a simpler example that still provides the exact symptoms as I described with my original sketch.

import hypermedia.net.*;

UDP udp;  // define the UDP object


void setup() {
    udp = new UDP( this, 6000 );  // Create a new datagram connection on port 6000
    //udp.log( true );            // <-- printout the connection activity
    udp.listen( true );           // and wait for incoming message
}


void keyPressed() {
    String IPaddress  = "192.168.1.177"; // The remote IP address
    int port          = 8888;  // The destination port
    if (keyCode == UP)
    {
        udp.send("Test", IPaddress, port );
    }
    else
        if (keyCode == DOWN)
        {
            udp.send("Hello World", IPaddress, port );
        }
}

void receive( byte[] data ) {    // <-- default handler
    //void receive( byte[] data, String IPaddress, int port ) { // <-- extended handler
    for(int i=0; i < data.length; i++)
        print(char(data[i]));
    println();
}

How could I get the sketch to send the right messages?

Of course I am more than willing to provide more information.


Solution

  • There wasn't a direct solution to this problem; so I ended up resorting to a work around. The work around involves dynamically adding zeros to all strings sent to the Arduino so there is always 10 characters sent. For instance:

    If I am to send "Hello Bot", the actual string sent is "Hello Bot0". If I sent an additional message like "Test" after that, the string sent to the Arduino would be "Test000000". The additional zeros would cover up the overlapping characters. One problem with this work around is that I had to prepare the Arduino to accept the zeros also. This work around is also kind of messy for the code. It does work though.

    Here's a snippet of code from the computer (client) side. The Arduino code obviously just had to be adjusted to account for the zeros.

    public void Send() {      //bang button named "Send" activates function           
      String txtSend = comField.getText();   //Grab text from a textbox to be sent
      int txtSendLength = txtSend.length();   
      for(int i = 0; i < 10-txtSendLength; i++){  //Add zeros until it has 10 char
        txtSend = txtSend + "0";                
      }
      udp.send(txtSend, ip, port);
      comField.clear();             //Clear the textbox
    }
    

    Behold, the very simple and crude solution!