2012-07-19 110 views
1

目前我有一个以太网盾连接到路由器的Arduino板。我的电脑通过Wi-Fi连接到这台路由器。我的主板和我的电脑互相发送UDP消息。我的电脑是客户端,而主板是服务器。但是我注意到,当我从计算机发送更长的UDP消息,然后发送更短的UDP消息时,Arduino接受较短的消息,然后接着来自较长消息的剩余位。例如:如果我从我的电脑发送“Hello World”,然后是“测试”; Arduino将不会将第二条消息读为“Test”,而是将其称为“Testo World”。Arduino:UDP发送产生额外的字符

我以为也许是来自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

我会开始使用Wireshark来查看消息是否被传输错误。如果传输正常,它必须在接收端。 – 2012-07-19 09:13:55

+0

好的建议;令人惊讶的是,wireshark显示从电脑发送的信息没有错误。也许我的问题在于Arduino。感谢那! – 2012-07-20 01:14:33

+0

你可以显示你的UDP类的代码吗? – 2012-07-20 10:09:23

回答

1

这个问题没有直接的解决方案;所以我最终采取了解决方法。解决方法包括动态地将零发送给发送给Arduino的所有字符串,以便始终发送10个字符。 例如:

如果我要发送“Hello Bot”,实际发送的字符串是“Hello Bot0”。如果之后我发送了一个额外的消息,如“测试”,发送给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 
} 

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

0

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

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

一旦你读取数据,这将清除阵列。我还发现,当试图对接收到的数据进行逻辑处理时,为了控制某些输出,我需要首先将packetBuffer转换为一个字符串。之后,所有人似乎都能正常工作。 希望有所帮助。