Перейти к содержанию
    

MicroBlaze - проблема со строками

По мере работы с процессором появляются новые вопросы. Следующая "неадекватность" в работе программы проявилась в передаче указателя строки и последующего вывода её через ETHERNET.

 

Код такой:

TCPStringSend("SETUP rtsp://192.168.1.57:554/video.mp4/trackID=1 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nTransport: RTP/AVP;unicast;client_port=54884-54885\r\nSession: 327b23c6643c9869\r\n\r\n");
TCPStringSend("QETUP rtsp://192.168.1.57:554/video.mp4/trackID=1 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nTransport: RTP/AVP;unicast;client_port=54884-54885\r\nSession: 327b23c6643c9869\r\n\r\n");
TCPStringSend("PLAY rtsp://192.168.1.57:554/video.mp4/ RTSP/1.0\r\nCSeq: 3\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nSession: 327b23c6643c9869\r\nRange: npt=0.000-\r\n\r\n");

 

В ходе решения проблемы я временно ограничил вывод строк 100 символами. В итоге, такие пакеты были получены компом (выделена область, содержащая строку):

Пакет номер РАЗ:

post-63290-1314346882_thumb.jpg

Пакет номер ДВА:

post-63290-1314346900_thumb.jpg

Пакет номер ТРИ:

post-63290-1314346894_thumb.jpg

 

Видно, что строка №1 дошла коряво. При этом были попытки заранее определить строки, сделать их переменными, но именно 3 строки отправлялись с глюками (две и одна - нормально). Я проверил содержание elf файла, но там все три строки хранятся правильно:

post-63290-1314347348_thumb.png

 

Подскажите пожалуйста где я мог ошибиться. Спасибо

 

PS Приведу на всякий случай коды своих процедур:

 

int TCPStringSend(const char *DataBuffer)
{
    u16 DataSize = 0;

    //while(/*DataBuffer[DataSize]*/*(DataBuffer + DataSize) != 0) DataSize++;
    TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, /*DataSize*/100);
    TCPClSequenceNum = TCPClSequenceNum + DataSize;
    return 0;
}

int TCPDataSend(const char *DataBuffer, u16 DataSize)
{
    TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, DataSize);
    TCPClSequenceNum = TCPClSequenceNum + DataSize;
    return 0;
}

void TCPPackageSend(u8 *SourceIPAddr, u8 *DestinationIPAddr, u16 SourcePort, u16 DestinationPort, u8 Flags, u8 AddOptions, const char *DataBuffer, u16 DataSize)
{
    u8 BufferToSend[1500];
    u8 HeaderLength = 20;
    u16 BytesCounter = 0;
    u16 PacketLength = 0;
    u16 HeaderCheckSum = 0x0000;

    if(AddOptions == 1)
    {
        PacketLength = DataSize + 32;
        BufferToSend[20] = 0x02;
        BufferToSend[21] = 0x04;
        BufferToSend[22] = 0x05;
        BufferToSend[23] = 0xB4;
        BufferToSend[24] = 0x01;
        BufferToSend[25] = 0x03;
        BufferToSend[26] = 0x03;
        BufferToSend[27] = 0x08;
        BufferToSend[28] = 0x01;
        BufferToSend[29] = 0x01;
        BufferToSend[30] = 0x04;
        BufferToSend[31] = 0x02;
        HeaderLength = 32;
        PacketLength = DataSize + HeaderLength;
        for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
    }
    else
    {
        HeaderLength = 20;
        PacketLength = DataSize + HeaderLength;
        for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
    }

    BufferToSend[0] = (u8)((SourcePort & 0xFF00) >> 8);                //Порт отправителя
    BufferToSend[1] = (u8)(SourcePort & 0x00FF);
    BufferToSend[2] = (u8)((DestinationPort & 0xFF00) >> 8);        //Порт получателя
    BufferToSend[3] = (u8)(DestinationPort & 0x00FF);
    BufferToSend[4] = (u8)((TCPClSequenceNum & 0xFF000000) >> 24);
    BufferToSend[5] = (u8)((TCPClSequenceNum & 0x00FF0000) >> 16);
    BufferToSend[6] = (u8)((TCPClSequenceNum & 0x0000FF00) >> 8);
    BufferToSend[7] = (u8)(TCPClSequenceNum & 0x000000FF);
    BufferToSend[8] = (u8)((TCPSrvSequenceNum & 0xFF000000) >> 24);
    BufferToSend[9] = (u8)((TCPSrvSequenceNum & 0x00FF0000) >> 16);
    BufferToSend[10] = (u8)((TCPSrvSequenceNum & 0x0000FF00) >> 8);
    BufferToSend[11] = (u8)(TCPSrvSequenceNum & 0x000000FF);
    BufferToSend[12] = HeaderLength * 4;
    BufferToSend[13] = Flags;
    BufferToSend[14] = (u8)((TCP_WINDOW_SIZE & 0xFF00) >> 8);
    BufferToSend[15] = (u8)(TCP_WINDOW_SIZE & 0x00FF);
    BufferToSend[16] = 0;
    BufferToSend[17] = 0;
    BufferToSend[18] = 0;
    BufferToSend[19] = 0;

    HeaderCheckSum = tcp_sum_calc(PacketLength, SourceIPAddr, DestinationIPAddr, 0, &BufferToSend[0]);
    BufferToSend[16] = (u8)((HeaderCheckSum & 0xFF00) >> 8);                //Контрольная сумма
    BufferToSend[17] = (u8)(HeaderCheckSum & 0x00FF);

    IPPackageSend(SourceIPAddr, DestinationIPAddr, TCP_PROTOCOL_TYPE, &BufferToSend[0], PacketLength);
}

Изменено пользователем Tanichev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...