2012-07-19 112 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轉換爲一個字符串。之後,所有人似乎都能正常工作。 希望有所幫助。