目前我有一个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();
}
我怎样才能让草图发送正确的信息?
当然,我非常愿意提供更多信息。
答案 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转换为字符串。之后,一切似乎都正常。 希望有所帮助。