Попытка ставить мой вопрос как можно больше здесь. Возможно, я просто думаю вслух.UDP-пакеты Пропуски пропуска
Моя программа должна посылать один большой пакет размером около 24 байт, но вместо этого кажется, что он запускает 6 пакетов длиной: 2,2,4,4,4,8 соответственно.
Передано от моего Adafruit WICED пера:
Так пакет послан моим ПК 24bytes в этом случае. Рукопожатие должно вернуть пакет примерно того же размера. Однако вот что становится подобрал на другом конце:
Как вы можете видеть, входящие пакеты размеров 2, 2, 4, 4, 4, а затем буфер 8+ битов ,
Моя первая мысль, что там что-то происходит в главной функции записи, которая является шаблоном:
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()
функционировать? Есть ли способ объединить эти 6 вызовов записи из класса appleMidi?
Я думаю, что я на правильном пути здесь, но вход всегда очень ценится.
С уважением,
-Daydreaming на работе
Не размещайте текст как изображения. Текст в виде текста. –
Извините, что я на работе. У меня нет выходных данных всего на несколько экранов для работы с: / – Nuds