できるだけ一般的に質問を投稿しようとしています。多分私は大声で考えているのかもしれません。UDPパケットが正しく送信されない
私のプログラムは1つの大きなパケットを送信する必要があります(約24バイト)が、代わりに6パケット(2,2,4,4,4,8)が送信されているように見えます。私Adafruit WICEDフェザーから送信
は次のとおりです。
だから私のPCによって送信されたばかりのパケットは、このケースで24bytesです。ハンドシェイクは、おおよそ同じサイズのパケットを返さなければなりません。あなたが見ることができるように
は、着信パケットは、その後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つの書き込み呼び出しを連結する方法はありますか?
私はここに正しいトラックにいると思うが、入力は常に高く評価されています。
敬具、仕事
テキストを画像として送信しないでください。テキストをテキストとして投稿します。 –
申し訳ありません私は仕事をしていますサンプル出力はわずかなスクリーンキャップでしか使えません: – Nuds