Arduino:UDP发送产生额外字符

Arduino:UDP发送产生额外字符,udp,buffer,arduino,processing,extra,Udp,Buffer,Arduino,Processing,Extra,目前,我有一个Arduino板,带有一个连接到路由器的以太网屏蔽。我的电脑通过Wi-Fi连接到此路由器。我的电路板和我的计算机互相发送信息。我的电脑是客户机,主板是服务器。但是我注意到,当我从我的计算机发送一条较长的UDP消息,然后发送一条较短的UDP消息时,Arduino会接受较短的消息,然后再接收较长消息的剩余位 例如:如果我从我的计算机发送“Hello World”,后跟“Test”;Arduino不会将第二条消息解读为“测试”,而是“测试世界” 我想也许从Arduino开始就有问题了。A

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

例如:如果我从我的计算机发送“Hello World”,后跟“Test”;Arduino不会将第二条消息解读为“测试”,而是“测试世界”

我想也许从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();
}
导入超媒体.net。*;
UDP;//定义UDP对象
无效设置(){
udp=newUDP(这个,6000);//在端口6000上创建一个新的数据报连接

//udp.log(true);//这个问题没有一个直接的解决方案;因此我最终求助于一种变通方法。变通方法包括向发送到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
}
public void Send(){//bang名为“Send”的按钮激活函数
字符串txtSend=comField.getText();//从要发送的文本框中获取文本
int txtSendLength=txtSend.length();
对于(int i=0;i<10 txtSendLength;i++){//添加零,直到它有10个字符
txtSend=txtSend+“0”;
}
发送(txtSend,ip,端口);
comField.clear();//清除文本框
}

瞧,这是一个非常简单而粗糙的解决方案!

这个问题没有直接的解决方案;因此我最终求助于变通办法。变通办法包括向发送到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
}
public void Send(){//bang名为“Send”的按钮激活函数
字符串txtSend=comField.getText();//从要发送的文本框中获取文本
int txtSendLength=txtSend.length();
对于(int i=0;i<10 txtSendLength;i++){//添加零,直到它有10个字符
txtSend=txtSend+“0”;
}
发送(txtSend,ip,端口);
comField.clear();//清除文本框
}

瞧,非常简单和粗糙的解决方案!

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


for(int i=0;i我相信您的问题在于正确地清除缓冲区。我发现了一行代码,可以遍历并清除每个字符,因为它是一个字符数组。理论上,读取后没有缓冲区可清除。
使用:


用于(int i=0;iI将使用Wireshark开始查看消息是否传输错误。如果传输正常,则一定是在接收端。建议不错;令我惊讶的是,Wireshark显示从计算机发送的消息没有错误。也许我的问题是Arduino。谢谢!你能显示代码f吗或者您的UDP类?这是否意味着WireShark显示发送了两条不同的消息?WireShark将在每次发送时显示一条消息。如果我第一次发送“Hello World”,WireShark将显示它已发送。如果我在此之后发送“Test”,WireShark将只显示“Test”,而不是“Testo World”。对于UDP类,您是指接收端的代码:Arduino还是导入的UDP库?我会首先使用Wireshark查看消息是否传输错误。如果传输正常,则必须在接收端。建议不错;让我惊讶的是,Wireshark显示消息在传输时没有错误从计算机发送。可能我的问题是Arduino。谢谢!你能显示UDP类的代码吗?这是否意味着WireShark显示发送了两条不同的消息?WireShark将显示每次发送一条消息。如果我第一次发送“Hello World”,WireShark将显示它已发送。如果我发送“Test”之后,wireshark将只显示“Test”,而不是“Testo World”。对于UDP类,您指的是接收端的代码:Arduino还是导入的UDP库?