Подскажите пожалуйста как сделать такую схемку:
По ком-порту приходят пакеты размером 10-20 байт, такого вида <02><n><data_byte_0><...><data_byte_n><crc><03>. Мне надо их как-то выдергивать из буфера и переводить каждый пакет в отдельную строку, чтобы легче было потом обрабатывать. Я так понимаю, надо взять массив, тип элементов которого беззнаковый int8 (0-255), скидывать туда все, потом перебирать и ловить начало пакета (02), потом отсчитывать n байт и ловить конец пакета (03). После этого перевести его в строку и удалить из массива. На си это выглядело бы примерно так:
code_25627.txt
а как сделать это на элементах в хай-асме пока не могу понять. Киньте плиз пару идеек.
Этот топик читают: Гость
Ответов: 36
Рейтинг: 7
|
|||
карма: 0 |
| ||
файлы: 1 | code_25627.txt [633B] [88] |
Ответов: 704
Рейтинг: 7
|
|||
wasp, пакеты идут хаотично-резанно или: <02><n><data_byte_0><...><data_byte_n><crc>, <03><n><data_byte_0><...><data_byte_n><crc>...?
------------ Дoбавленo в 19.06: В примере не понятно идут ли они строками по 10-20 байт, или строго отдельными пакетами? ------------ Дoбавленo в 19.14: Каждый пакет начинается с <0#* и заканчивается <crc>? |
|||
карма: 0 |
|
Ответов: 8928
Рейтинг: 823
|
|||
wasp, СОМ порт уже выдаёт строку, нет необходимости переводить её в байты, а потом в строку начало и окончание блока <02> и <03> -- это символы или два байта цифр? Есть компонент в Строках BlockFind
|
|||
карма: 19 |
|
Ответов: 704
Рейтинг: 7
|
|||
Если все так - на выходе из порта ставите эдакую заморочку:
code_25628.txt Загонять полученные результаты можно в обычный список строк StrList и сохранять в файл (если нужно). В примере первая кнопка - начало передачи пакетов, а вторая - продолжение передачи (если пакеты рваные). |
|||
карма: 0 |
| ||
файлы: 1 | code_25628.txt [1KB] [152] |
Ответов: 36
Рейтинг: 7
|
|||
Neo, пакеты могут идти как угодно, с большими или маленькими паузами, или вообще без пауз - сразу друг за другом. Но каждый пакет всегда начинается байтом 02 и заканчивается 03 (Т.е. это не аски, а хекс). Эти 02 и 03 могут также встретиться и внутри пакета.
Neo писал(а): В примере не понятно идут ли они строками по 10-20 байт, или строго отдельными пакетами?Не, не строками, а просто набором байт и длина может варьироваться от 10 скажем до 20 байт, не суть важно. Леонид, тогда придется все строки склеивать в одну, а потом все-таки искать начало пакета, отсчитывать н байт и т.д. Может так и лучше, но тут я тоже затрудняюсь. Леонид писал(а): начало и окончание блока <02> и <03> -- это символы или два байта цифр? Есть компонент в Строках BlockFindдва байта цифр, все что в скобках <...> - по одному байту |
|||
карма: 0 |
|
Ответов: 704
Рейтинг: 7
|
|||
[offtop]Леонид, а как этим BlockFind тут развернуться? Эти же <02> и <03> будут меняться. [/offtop] Подумал, что 02-03-04-05 считает счетчик. Если бы BlockFind поддерживал маску...
------------ Дoбавленo в 19.34: Так ловите сразу <crc><03> как конец пакета. Считать байты - как-то муторно. ------------ Дoбавленo в 19.36: Хотя, возможно, считать здесь надежнее всего, но и затратнее всего. |
|||
карма: 0 |
|
Ответов: 36
Рейтинг: 7
|
|||
Neo, crc - это проверочная сумма, как ее поймаешь, ее считать надо. Надо по-любому ловить 02, потом отсчитывать н байт, и тогда уже ясно где конец пакета.
|
|||
карма: 0 |
|
Ответов: 8928
Рейтинг: 823
|
|||
wasp, если и внутри пакета есть <0><2> и <0><3>, то как ловить начало/окончание
wasp писал(а): <02><n> |
|||
карма: 19 |
|
Ответов: 3889
Рейтинг: 362
|
|||
wasp писал(а): Надо по-любому ловить 02, потом отсчитывать н байт, и тогда уже ясно где конец пакета.Снимать целый дамп в поток, преобразовывать в HEX. Начиная со второго пакета можно "ловить" 03,02,n , отсчитав n убедиться, что дальше, (отступая на размер суммы), идёт 03 (а если за ним идёт ещё и 02...) , делать вывод о нахождении пакета и т.д. по циклу. Затратно, но можно считать и сумму для (n) байт сразу после 02,n и сравнивать с тем, что нашли перед 03. В общем, из-за слабой ориентированности базовых компонентов на бинарные данные, работать, видимо, придётся с дампом. |
|||
карма: 1 |
|
Ответов: 36
Рейтинг: 7
|
|||
Леонид писал(а): неужели так трудно представить незнающего Ваших проблем и обрисовать задачу для него, чтобы было "необходимо и достаточно"попробую еще раз. В угловых скобках стоит один байт информации. Первым байтом в пакете всегда идет STX (Start of Text). Последним - ETX (End of Text): Dec Oct Hex Binary Value --- --- --- -------- -------------------------- 002 002 002 00000010 STX (Start of Text) 003 003 003 00000011 ETX (End of Text) Вторым байтом всегда идет позиция, где стоит чексумма, но она всегда на предпоследнем месте (перед ETX), поэтому из нее легко узнается длина пакета, или количество полезных байт. Все что между вторым и предпоследним байтом - полезная информация. Ее длина может варьироваться. Никаких строк, ASCII, все в цифре. Короче все вышесказанное выглядит так: <02><n><data_byte_0><...><data_byte_n><crc><03> Проблема в том, что при считывании с ком-порта строки могут обрываться (тогда часть пакета переносится в следующую строку), или два пакета следующие друг за другом могут склеиваться в один. Поэтому желательно все сначала свалить в одну кучу, а потом уже разделять по принципу - каждый пакет в отдельную строку. Как это сделать, пока не соображу, поэтому прошу помощи. Надеюсь щас стало немного понятней ------------ Дoбавленo в 20.13: 1nd1g0, все правильно, так я себе в уме и представляю, но в дескретных элементах - напряг. В сях бы без проблем... |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
wasp писал(а): Как это сделать, пока не соображу, поэтому прошу помощи.Я же сказал, у нас есть
------------ Дoбавленo в 20.24: Если ну очень хочется именно с бинарными работать (и героически изображать на дискретных элементах с циклами простейшие операции вроде поиска сигнатуры), то, вероятно,
|
|||
карма: 1 |
|
Ответов: 3851
Рейтинг: 159
|
|
я тоже сначала переводил в HEX, но остановился на поиске символов " |