1

現時点では、ルーターに接続されたイーサネット シールドを備えた Arduino ボードがあります。私のコンピュータは Wi-Fi 経由でこのルーターに接続します。私のボードと私のコンピューターは相互にUDPメッセージを送受信します。私のコンピューターはクライアントで、ボードはサーバーです。ただし、コンピューターから長い UDP メッセージを送信してから短い UDP メッセージを送信すると、Arduino は短いメッセージを受け入れ、その後に長いメッセージの残りのビットが続くことに気付きました。

たとえば、コンピューターから「Hello World」を送信し、その後に「Test」を送信するとします。Arduino は 2 番目のメッセージを「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」になります。追加のゼロは、重複する文字を覆い隠します。この回避策の 1 つの問題は、ゼロも受け入れるように 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 に答える