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

Битые записи в массиве.

Я принимаю пакеты данных из очереди

check_queue = FRTOS1_xQueueReceive(Global_Queue_Handle, &lt_rec_buff, 0);
if(check_queue)
{
    memcpy(queue_buff, lt_rec_buff, 13);
}

И на основе принятых данных строю запись.

qRxBuffer[0] = 0x55;
qRxBuffer[1] = queue_buff[0];
qRxBuffer[2] = queue_buff[1]; 

qRxBuffer[3] = time.Day;
qRxBuffer[4] = time.Month;
qRxBuffer[5] = time.Year;
qRxBuffer[6] = time.Hour;
qRxBuffer[7] = time.Minute;
qRxBuffer[8] = time.Second;

temp.all = globalSysTimer & 0xFFFFFFFF;
qRxBuffer[9]  = temp.nByte[0];
qRxBuffer[10] = temp.nByte[1];
qRxBuffer[11] = temp.nByte[2];
qRxBuffer[12] = temp.nByte[3];

qRxBuffer[13] = queue_buff[4];  //DLC
qRxBuffer[14] = queue_buff[5];  //BYTE 0
qRxBuffer[15] = queue_buff[6];  //BYTE 1
qRxBuffer[16] = queue_buff[7];  //BYTE 2
qRxBuffer[17] = queue_buff[8];  //BYTE 3
qRxBuffer[18] = queue_buff[9];  //BYTE 4
qRxBuffer[19] = queue_buff[10]; //BYTE 5
qRxBuffer[20] = queue_buff[11]; //BYTE 6
qRxBuffer[21] = queue_buff[12]; //BYTE 7

calcRes.all = UTL_CRC_srvCalculate_CRC16_CCITT(qRxBuffer, 22); 
qRxBuffer[22] = calcRes.nByte[0];
qRxBuffer[23] = calcRes.nByte[1];

Для проверки записи я вывожу ее на терминал

for (g_idx = 0; g_idx < 24; g_idx++)
{
    send_hex_num16_uart0(qRxBuffer[g_idx]);
    send_msg_uart0(" ", 1);
}
send_msg_uart0("\r", 1);

Вижу правильные записи. Послал 20 получил 20 - все красиво.

Каждую запись я добавляю в массив размером 4096 байт. И когда массив полный - вывожу его на терминал

//check if there is enough space for the message
if ( (4096 - data_index) >= sizeof(qRxBuffer) )
{
    memcpy(&log_data[data_index], qRxBuffer, sizeof(qRxBuffer));
    data_index += sizeof(qRxBuffer);
}
else //the page is full
{
    data_index  = 0;

    for (g_idx = 0; g_idx < 4096; g_idx++)
    {
        if (&log_data[g_idx] == 0x55)
        send_msg_uart0("\r", 1);

        send_hex_num16_uart0(&log_data[g_idx]);
        send_msg_uart0(" ", 1);
    }
}

И что я вижу? Битые записи! Вот например

55 5 0 0 0 0 0 0 0 19 7B 9 0 7 1 9F 80 2E 80 0 0 0 A6 19 
55 4 0 0 0 0 0 0 0 2C 7B 9 0 3 1 B B8 0 0 1 B B8 1A 83 
55 5 0 0 0 0 0 0 0 2D 7B 9 0 7 1 9F 80 2E 80 0 0 0 D7 27 
55 4 0 0 0 0 0 0 0 40 7B 9 0 3 1 B B8 0 0 1 B B8 
55 FA 
55 5 0 0 0 0 0 0 0 41 7B 9 0 7 1 9F 80 2E 80 0 0 0 98 5E 
55 4 0 0 0 0 0 0 0 
55 7B 9 0 3 1 B B8 0 0 1 B B8 2F AC 
55 5 0 0 0 0 0 0 0 56 7B 9 0 7 1 9F 80 2E 80 0 0 0 24 82 
55 4 0 0 0 0 0 0 0 69 7B 9 0 3 1 B B8 0 0 1 B B8 4 99 
55 5 0 0 0 0 0 0 0 6A 7B 9 0 7 1 9F 80 2E 80 0 0 0 F B7 
55 4 0 0 0 0 0 0 0 7D 7B 9 0 3 1 B B8 0 0 1 B B8 1D 8A

Причем битые записи могут быть в разных местах при одной и той же посылке данных.

Как? Как записи могли не прописаться в массив в РАМ?

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

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


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

А если так рассмотреть - не битые?

55 5 0 0 0 0 0 0 0 19 7B 9 0 7 1 9F 80 2E 80 0 0 0  A6 19
55 4 0 0 0 0 0 0 0 2C 7B 9 0 3 1 B  B8 0  0  1 B B8 1A 83
55 5 0 0 0 0 0 0 0 2D 7B 9 0 7 1 9F 80 2E 80 0 0 0  D7 27
55 4 0 0 0 0 0 0 0 40 7B 9 0 3 1 B  B8 0  0  1 B B8 55 FA
55 5 0 0 0 0 0 0 0 41 7B 9 0 7 1 9F 80 2E 80 0 0 0  98 5E
55 4 0 0 0 0 0 0 0 55 7B 9 0 3 1 B  B8 0  0  1 B B8 2F AC
55 5 0 0 0 0 0 0 0 56 7B 9 0 7 1 9F 80 2E 80 0 0 0  24 82
55 4 0 0 0 0 0 0 0 69 7B 9 0 3 1 B  B8 0  0  1 B B8 4  99
55 5 0 0 0 0 0 0 0 6A 7B 9 0 7 1 9F 80 2E 80 0 0 0  F  B7
55 4 0 0 0 0 0 0 0 7D 7B 9 0 3 1 B  B8 0  0  1 B B8 1D 8A

:biggrin:

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


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

А если так рассмотреть - не битые?

55 5 0 0 0 0 0 0 0 19 7B 9 0 7 1 9F 80 2E 80 0 0 0  A6 19
55 4 0 0 0 0 0 0 0 2C 7B 9 0 3 1 B  B8 0  0  1 B B8 1A 83
55 5 0 0 0 0 0 0 0 2D 7B 9 0 7 1 9F 80 2E 80 0 0 0  D7 27
55 4 0 0 0 0 0 0 0 40 7B 9 0 3 1 B  B8 0  0  1 B B8 55 FA
55 5 0 0 0 0 0 0 0 41 7B 9 0 7 1 9F 80 2E 80 0 0 0  98 5E
55 4 0 0 0 0 0 0 0 55 7B 9 0 3 1 B  B8 0  0  1 B B8 2F AC
55 5 0 0 0 0 0 0 0 56 7B 9 0 7 1 9F 80 2E 80 0 0 0  24 82
55 4 0 0 0 0 0 0 0 69 7B 9 0 3 1 B  B8 0  0  1 B B8 4  99
55 5 0 0 0 0 0 0 0 6A 7B 9 0 7 1 9F 80 2E 80 0 0 0  F  B7
55 4 0 0 0 0 0 0 0 7D 7B 9 0 3 1 B  B8 0  0  1 B B8 1D 8A

:biggrin:

не понял что вы хотите сказать. с не битыми все хорошо.
Изменено пользователем Jenya7

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


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

не понял что вы хотите сказать. с не битыми все хорошо.

Что является признаком "битости"?

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


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

Что является признаком "битости"?

не битый 24 байта

по моему сравнив две строчки

55 5 0 0 0 0 0 0 0 2D 7B 9 0 7 1 9F 80 2E 80 0 0 0 D7 27

55 FA

или

55 5 0 0 0 0 0 0 0 41 7B 9 0 7 1 9F 80 2E 80 0 0 0 98 5E

55 4 0 0 0 0 0 0 0

все ясно

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

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


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

не понял что вы хотите сказать. с не битыми все хорошо.

aaarrr хотел сказать, что у Вас 55 в данных не отличается от 55 в начале строки. И когда Вы находите 55, то всегда считаете это началом строки, хотя это и не так.

Смотрите термин байт-стаффинг и esc-последовательности.

 

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


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

aaarrr хотел сказать, что у Вас 55 в данных не отличается от 55 в начале строки. И когда Вы находите 55, то всегда считаете это началом строки, хотя это и не так.

Смотрите термин байт-стаффинг и esc-последовательности.

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

 

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


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

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

"Стартовать" разбор пакета по маркерному байту допустимо только для протокола вроде MODBUS-ASCI.

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

можно использовать "вынос" старшего бита всех полей и служебной инф. пакета в отдельное, дополнительное поле (и CRC поле тоже).

"Освободившиеся" 128 байт можно использовать как управляющие, адресные итп.

Для такого решения можно передавать не пакет, а поток байтов.

 

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


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

Если протокол бинарный-байтовый, то единственная возможность выделить пакет...

Не единственное, выше уже написали - байт-стаффинг. И не придется раскидываться старшими битами.

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


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

Не единственное, выше уже написали - байт-стаффинг. И не придется раскидываться старшими битами.

Да. Для больших пакетов и переменной длины. Но усложняется алгоритм.

"Городить" байт-стаффинг для пакета из 5-10 байт как-то сомнительно.

 

 

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


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

спародически ловить грабли.

Опечатка по Фрейду.... Спорадически. А "спародически" - это видимо от "пародия"?

Тогда полностью согласен с Вами - сообщения определённых местных товарищей (не будем показывать пальцем, но все догадались о ком речь) иначе и назвать нельзя :biggrin:

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


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

Опечатка по Фрейду....

Да, хотя с "граблями", Вы правы, смотрится вполне гармонично :)

 

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


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

Да. Для больших пакетов и переменной длины. Но усложняется алгоритм.

"Городить" байт-стаффинг для пакета из 5-10 байт как-то сомнительно.

Как только возникает необходимость пробросить обмен не через железный UART, а через что-то виртуальное, с непредсказуемыми задержками в непредсказуемых местах, так вся эта кажущаяся простота выходит боком.

Лучше всё-таки использовать канальное кодирование. Не обязательно байт-стаффингом. Есть например COBS. У него "переменность" длины пакета намного ниже чем при байт-стаффинге.

Да и кодер/декодер сравнительно простые: у меня сейчас в текущем проекте поверх TCP-сокета работает COBS, через который идёт обмен с устройством с потоком до ~0.5МБ/с (дуплексный, но бОльший поток - от устройства в комп). Так загрузка CPU этим потоком составляет менее 10% при 144МГц тактовой. И никаких проблем с передачей границ кадров через виртуальный канал. :laughing:

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


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

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

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

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

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

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

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

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

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

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