2016-05-29 3 views
0

Попытка ставить мой вопрос как можно больше здесь. Возможно, я просто думаю вслух.UDP-пакеты Пропуски пропуска

Моя программа должна посылать один большой пакет размером около 24 байт, но вместо этого кажется, что он запускает 6 пакетов длиной: 2,2,4,4,4,8 соответственно.

Передано от моего Adafruit WICED пера:

Arduino/Adafruit Serial Monitor

Так пакет послан моим ПК 24bytes в этом случае. Рукопожатие должно вернуть пакет примерно того же размера. Однако вот что становится подобрал на другом конце:

rtpMidi Error Log

Как вы можете видеть, входящие пакеты размеров 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 на работе

+2

Не размещайте текст как изображения. Текст в виде текста. –

+0

Извините, что я на работе. У меня нет выходных данных всего на несколько экранов для работы с: / – Nuds

ответ

0

Казалось бы, что на вашей конкретной встраиваемой системы, вызов udp.write() соответствует передаваемого пакета, с beginPacket/endPacket только создание и уничтожение контекста необходимо для передачи одного, а не фактического разграничения границ.

Простейшим решением может быть сбор всего пакета в буфере, а затем запись этого в одном вызове.

Возможно, вы также захотите принять это на форумах поддержки Adafruit.

Смежные вопросы