jenya7 0 16 июля, 2018 Опубликовано 16 июля, 2018 (изменено) · Жалоба Я принимаю пакеты данных из очереди check_queue = FRTOS1_xQueueReceive(Global_Queue_Handle, <_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 Причем битые записи могут быть в разных местах при одной и той же посылке данных. Как? Как записи могли не прописаться в массив в РАМ? Изменено 16 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба А если так рассмотреть - не битые? 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 0 16 июля, 2018 Опубликовано 16 июля, 2018 (изменено) · Жалоба А если так рассмотреть - не битые? 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: не понял что вы хотите сказать. с не битыми все хорошо. Изменено 16 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба не понял что вы хотите сказать. с не битыми все хорошо. Что является признаком "битости"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 июля, 2018 Опубликовано 16 июля, 2018 (изменено) · Жалоба Что является признаком "битости"? не битый 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 все ясно Изменено 16 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба не понял что вы хотите сказать. с не битыми все хорошо. aaarrr хотел сказать, что у Вас 55 в данных не отличается от 55 в начале строки. И когда Вы находите 55, то всегда считаете это началом строки, хотя это и не так. Смотрите термин байт-стаффинг и esc-последовательности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба aaarrr хотел сказать, что у Вас 55 в данных не отличается от 55 в начале строки. И когда Вы находите 55, то всегда считаете это началом строки, хотя это и не так. Смотрите термин байт-стаффинг и esc-последовательности. ааааа......понял. мда... я не учел что последние байты чексам и он может совпасть с заголовочным байтом. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба "чексам"... Етить-колотить! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Если протокол бинарный-байтовый, то единственная возможность выделить пакет - межпакетная пауза. Иначе рискуете постояннно или спародически ловить грабли. "Стартовать" разбор пакета по маркерному байту допустимо только для протокола вроде MODBUS-ASCI. Если же от маркерного байта уходить не желательно, и в то же время требуется передавать бинарные данные, для пакетов небольшого размера можно использовать "вынос" старшего бита всех полей и служебной инф. пакета в отдельное, дополнительное поле (и CRC поле тоже). "Освободившиеся" 128 байт можно использовать как управляющие, адресные итп. Для такого решения можно передавать не пакет, а поток байтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Если протокол бинарный-байтовый, то единственная возможность выделить пакет... Не единственное, выше уже написали - байт-стаффинг. И не придется раскидываться старшими битами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Не единственное, выше уже написали - байт-стаффинг. И не придется раскидываться старшими битами. Да. Для больших пакетов и переменной длины. Но усложняется алгоритм. "Городить" байт-стаффинг для пакета из 5-10 байт как-то сомнительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба спародически ловить грабли. Опечатка по Фрейду.... Спорадически. А "спародически" - это видимо от "пародия"? Тогда полностью согласен с Вами - сообщения определённых местных товарищей (не будем показывать пальцем, но все догадались о ком речь) иначе и назвать нельзя :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Опечатка по Фрейду.... Да, хотя с "граблями", Вы правы, смотрится вполне гармонично :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Попутно стоит рассказать про "%02X" вместо просто "%X". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Да. Для больших пакетов и переменной длины. Но усложняется алгоритм. "Городить" байт-стаффинг для пакета из 5-10 байт как-то сомнительно. Как только возникает необходимость пробросить обмен не через железный UART, а через что-то виртуальное, с непредсказуемыми задержками в непредсказуемых местах, так вся эта кажущаяся простота выходит боком. Лучше всё-таки использовать канальное кодирование. Не обязательно байт-стаффингом. Есть например COBS. У него "переменность" длины пакета намного ниже чем при байт-стаффинге. Да и кодер/декодер сравнительно простые: у меня сейчас в текущем проекте поверх TCP-сокета работает COBS, через который идёт обмен с устройством с потоком до ~0.5МБ/с (дуплексный, но бОльший поток - от устройства в комп). Так загрузка CPU этим потоком составляет менее 10% при 144МГц тактовой. И никаких проблем с передачей границ кадров через виртуальный канал. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться