1

目前我有一个带有以太网屏蔽的 Arduino 板连接到路由器。我的电脑通过 Wi-Fi 连接到这个路由器。我的开发板和我的计算机来回发送UDP消息。我的电脑是客户端,板子是服务器。但是我注意到,当我从我的计算机发送一个较长的 UDP 消息,然后是一个较短的 UDP 消息时,Arduino 接受较短的消息,然后是较长消息中的剩余位。

例如:如果我从我的计算机发送“Hello World”,然后是“Test”;Arduino 不会将第二条消息读为“Test”,而是:“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();
}

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

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

4

2 回答 2

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
}

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

于 2012-07-24T13:31:36.283 回答
0

我相信您的问题是正确清除缓冲区。我找到了一行代码,它通过并清除每个字符,因为它是一个字符数组。理论上,一旦读取就没有要清除的缓冲区。采用:

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

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

于 2015-02-07T18:08:21.307 回答