Arduino:UDP发送会产生额外的字符

时间:2012-07-19 03:41:04

标签: udp buffer arduino processing extra

目前我有一个Arduino板,以太网盾连接到路由器。我的电脑通过Wi-Fi连接到此路由器。我的主板和我的计算机相互发送UDP条消息。我的电脑是客户端,电路板是服务器。但是我注意到,当我从计算机发送较长的UDP消息,然后发送较短的UDP消息时,Arduino接受较短的消息,然后接收较长消息中的剩余位。

例如:如果我从我的电脑发送“Hello World”,然后是“Test”; Arduino不会将第二条消息视为“测试”,而是“Testo World”。

我想也许首先是Arduino端的问题。 Arduino将消息临时存储在名为packetBuffer的数组中。我在每次收到新消息之前尝试清除此缓冲区。缓冲区会清除,但之后我会再次收到错误信息。

所以我认为罪魁祸首是计算机,客户端。在计算机端,我有一个处理草图,发送UDP消息。下面的例子不是草图本身;然而,到目前为止,它仍然是一个更简单的例子,它仍然提供了我用原始草图描述的确切症状。

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

我怎样才能让草图发送正确的信息?

当然,我非常愿意提供更多信息。

2 个答案:

答案 0 :(得分:1)

没有直接解决这个问题的方法;所以我最终选择了解决方案。解决方法涉及动态地向发送到Arduino的所有字符串添加零,因此总是发送10个字符。 例如:

如果我要发送“Hello Bot”,发送的实际字符串是“Hello Bot0”。如果我之后发送了一个额外的消息,如“Test”,发送给Arduino的字符串将是“Test000000”。额外的零将覆盖重叠的字符。这项工作的一个问题是我必须准备Arduino也接受零。这种解决方法对代码来说也很麻烦。它确实有用。

这是计算机(客户端)方面的一段代码。显然,Arduino代码必须进行调整才能解释为零。

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
}

看,非常简单粗暴的解决方案!

答案 1 :(得分:0)

我相信您的问题是正确清除缓冲区。我发现了一行代码并清除了每个字符,因为它是一个字符数组。理论上,一旦读取就没有缓冲区可以清除。 使用:

for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;

读取数据后,将清除数组。我还发现,当尝试对收到的数据做逻辑时,为了控制某些输出,我需要先将packetBuffer转换为字符串。之后,一切似乎都正常。 希望有所帮助。