2016-05-29 46 views
0

できるだけ一般的に質問を投稿しようとしています。多分私は大声で考えているのかもしれません。UDPパケットが正しく送信されない

私のプログラムは1つの大きなパケットを送信する必要があります(約24バイト)が、代わりに6パケット(2,2,4,4,4,8)が送信されているように見えます。私Adafruit WICEDフェザーから送信

は次のとおりです。

Arduino/Adafruit Serial Monitor

だから私のPCによって送信されたばかりのパケットは、このケースで24bytesです。ハンドシェイクは、おおよそ同じサイズのパケットを返さなければなりません。あなたが見ることができるように

rtpMidi Error Log

は、着信パケットは、その後8+ビットのバッファサイズ2、2、4、4、4である、と。しかし、ここでもう一方の端に拾わなっているものです。

template<class UdpClass> 
inline void AppleMidi_Class<UdpClass>::write(UdpClass& udp, AppleMIDI_InvitationAccepted& ia, IPAddress ip, uint16_t port) 
{ 
    Serial.println("+++++ Writing Packet"); 
    udp.beginPacket(ip, port); 

     udp.write(ia.signature, sizeof(ia.signature)); 
     udp.write(ia.command, sizeof(ia.command)); 

     // To appropriate endian conversion 
     uint32_t _version = AppleMIDI_Util::toEndian(ia.version); 
     uint32_t _initiatorToken = AppleMIDI_Util::toEndian(ia.initiatorToken); 
     uint32_t _ssrc = AppleMIDI_Util::toEndian(ia.ssrc); 

     // write then out 
     udp.write((uint8_t*) ((void*) (&_version)), sizeof(_version)); 
     udp.write((uint8_t*) ((void*) (&_initiatorToken)), sizeof(_initiatorToken)); 
     udp.write((uint8_t*) ((void*) (&_ssrc)), sizeof(_ssrc)); 

     udp.write((uint8_t*) ia.name, strlen(ia.name) + 1); 

    udp.endPacket(); 
    udp.flush(); 
} 

このテンプレートは、実際には、次の書き込み機能を呼び出している(実際には6回):

私が最初に考えたのは、何かがテンプレートであるメイン書き込み機能、でそこに起こっているということです

size_t AdafruitUDP::write(const uint8_t* buffer, size_t size) 
{ 
    if (_udp_handle == 0 || _sndIP == 0 || _sndPort == 0) { 
    Serial.println("Handle, IP, port == 0 returning"); 
    return 0; 
    } 
    //Serial.printf("+++++ Handle: %s IP: %s Send Port: %s\n", _udp_handle, _sndIP, _sndPort); 

    sdep_cmd_para_t para_arr[] = 
    { 
     { .len = 4 , .p_value = &_udp_handle }, 
     { .len = 4 , .p_value = &_sndIP  }, 
     { .len = 2 , .p_value = &_sndPort }, 
     { .len = size, .p_value = buffer  } 
    }; 
    uint8_t para_count = sizeof(para_arr)/sizeof(sdep_cmd_para_t); 

    VERIFY_RETURN(sdep_n(SDEP_CMD_UDP_WRITE, para_count, para_arr, NULL, NULL), 0); 
    return size; 
} 

これは、その後呼び出します。だから、

bool AdafruitSDEP::sdep_n(uint16_t cmd_id  , 
      uint8_t para_count , sdep_cmd_para_t const* para_arr, 
      uint16_t* p_result_len , void* p_result) 
{ 
    _errno = FEATHERLIB->sdep_execute_n(cmd_id, para_count, para_arr, p_result_len, p_result); 
    handle_error(cmd_id); 
    return (ERROR_NONE == _errno); 
} 

、私は次の明白なQUを考えますestionはbeginPacketとendPacketの間に何が起こるかです。あまり - 私はどちらか任意のコールバックを見ていない:

int AdafruitUDP::beginPacket(IPAddress ip, uint16_t port) 
{ 
    _sndIP = (uint32_t) ip; 
    _sndPort = port; 

    return 1; 
} 

/******************************************************************************/ 
/*! 
    @brief Called after writing UDP data to the remote connection. 
*/ 
/******************************************************************************/ 
int AdafruitUDP::endPacket() 
{ 
    _sndIP = 0; 
    _sndPort = 0; 

    return 1; 
} 

だから私の本当の問題は、私は周りの誰かの素晴らしいライブラリを変更するに到達する前に、これは次のとおりです。ヘッダーは、各appleMidi.write()で書かなっているかのようにそれが見えません関数? appleMidiクラスから6つの書き込み呼び出しを連結する方法はありますか?

私はここに正しいトラックにいると思うが、入力は常に高く評価されています。

敬具、仕事

+2

テキストを画像として送信しないでください。テキストをテキストとして投稿します。 –

+0

申し訳ありません私は仕事をしていますサンプル出力はわずかなスクリーンキャップでしか使えません: – Nuds

答えて

0

で-Daydreaming

udp.write()への呼び出しがbeginPacket/endPacket単に必要なコンテキストを確立し、無効化すると、送信したパケットに対応して、あなたの特定の組み込みシステム上でそれを表示されます実際に境界線を描写するのではなく、1つを伝送する。

最も単純な解決策は、パケット全体をバッファに集め、それを1回の呼び出しで書き込むことです。

また、これをAdafruitのサポートフォーラムに持ち込むこともできます。

関連する問題