2012-07-19 6 views
1

현재 라우터에 이더넷 실드가 연결된 Arduino 보드가 있습니다. 내 컴퓨터가 Wi-Fi를 통해이 라우터에 연결됩니다. 내 보드와 컴퓨터는 UDP 메시지를 서로주고받습니다. 내 컴퓨터는 클라이언트이고 보드는 서버입니다. 그러나 나는 컴퓨터에서 더 긴 UDP 메시지를 보낸 다음 더 짧은 UDP 메시지를 보낼 때 Arduino가 더 짧은 메시지를 수락 한 다음 더 긴 메시지의 나머지 비트를 받았다는 것을 알아 차렸다.Arduino : UDP 전송시 추가 문자가 발생합니다.

예를 들면 : 내 컴퓨터에서 "Hello World"를 보내면 "Test"; Arduino는 두 번째 메시지를 "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(); 
} 

어떻게하면 올바른 메시지를 보내도록 스케치를 얻을 수 있습니까?

물론 더 많은 정보를 기꺼이 제공 할 의향이 있습니다.

+2

Wireshark를 사용하여 메시지가 잘못 전송되고 있는지 확인합니다. 전송이 OK이면 수신 측에 있어야합니다. –

+0

좋은 제안; 놀랍게도 저에게 wireshark는 메시지가 컴퓨터에서 전송되는 것이 잘못되지 않았 음을 보여줍니다. 아마도 내 문제는 Arduino입니다. 고마워! –

+0

UDP 클래스의 코드를 표시 할 수 있습니까? –

답변

1

이 문제에 대한 직접적인 해결책은 없었습니다. 그래서 나는 주변의 일에 의지하면서 끝내었다. 해결 방법은 Arduino에 전송 된 모든 문자열에 0을 동적으로 추가하여 항상 10자를 전송하는 것입니다. 예 :

"Hello Bot"을 보내려면 보낼 실제 문자열은 "Hello Bot0"입니다. 그 후에 "Test"와 같은 추가 메시지를 보내면 Arduino로 보낸 문자열은 "Test000000"이됩니다. 추가 0은 겹쳐진 문자를 덮어 버립니다. 이 문제를 해결하기위한 한 가지 문제는 Arduino가 0도 받아 들일 수 있도록 준비해야한다는 것입니다. 이 문제를 해결하기 위해 코드도 복잡합니다. 그래도 작동합니다.

다음은 컴퓨터 (클라이언트) 측 코드 스 니펫입니다. Arduino 코드는 분명히 0을 설명하기 위해 조정되어야했습니다.

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를 문자열로 변환해야한다고 알았습니다. 그 후, 모두 제대로 작동하는 것처럼 보였습니다. 도움이 되길 바랍니다.