реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Обработка массивов с неполными пакетами
Atlantis-
сообщение Oct 19 2015, 15:02
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
Никак не соображу, как лучше обрабатывать массивы данных с неполным пакетом в конце. Конкретный пример: на ПК приходит массив данных:
пакет1(16 байт), пакет2(32 байта), неполный пакет (от 1 до 15 байт). Каждый пакет содержит байт, указывающий кол-во данных в пакете
Вроде как надо неполный пакет сохранить и потом склеить во время следующей посылки, а обрабатывать несколько полных пакетов, но как это все вычислить, может кто подскажет?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 19 2015, 15:15
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Если это ПК, то никто не мешает сделать буфер не из байтов, а из пакетов (длина каждого - максимально возможная по протоколу).
А дальше выгребать из массива побайтно и перекладывать в этот буфер. По окончании буфера запомнить состояние "работаем с пакетом №3, в нём 5 байт из N", при появлении следующего "массива" продолжить разбор.
Буфер из пакетов, само собой, закольцованный.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 19 2015, 15:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(esaulenka @ Oct 19 2015, 16:15) *
Буфер из пакетов, само собой, закольцованный.


А зачем закольцованый ? sm.gif
На самом деле, слишком общий вопрос и и мало данных.. На общий вопрос соответствующий ответ:
- опишите свои пакеты структурой данных (классом) с состоянием (длина, сколько данных в него надо принять до состояния "заполненности" итп)
- организуйте FIFO - очередь пакетов, например, с помощью списка указателей на эти структуры (std::list, например), тогда недопринятый пакет всегда будет в конце списка. Принятые пакеты удаляем с головы.

Кроме этого, возможно реализовать примерно еще 764 других варианта решеня поставленной задачи sm.gif

Сообщение отредактировал CrimsonPig - Oct 19 2015, 15:38
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2015, 15:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Atlantis- @ Oct 19 2015, 18:02) *
...может кто подскажет?

Может для начала подскажете, а в чем "проблема" ?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
megajohn
сообщение Oct 19 2015, 17:30
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Atlantis- @ Oct 19 2015, 18:02) *
обрабатывать несколько полных пакетов, но как это все вычислить, может кто подскажет?


дык банально

считать ОДИН БАЙТ "длина пакета"
если УСПЕШНО, то считать N-БАЙТ ( где N это длина пакета )
если УСПЕШНО, то передать в обработку, иначе снова считывать ( пока не будет собран весь пакет )


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 19 2015, 20:15
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(megajohn @ Oct 19 2015, 20:30) *
дык банально


Банально, если протоколом предусмотрено обнаружение начала пакета. Наличие только длины это не обеспечивает.
Так что автор наступил на грабли.
Или временное разделение пакетов, или там STX/ETX и проч.
Надежда, что пакеты засинхронизируются намертво, не работает.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
smalcom
сообщение Oct 19 2015, 20:19
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



вообще контрольная сумма у пакета должна быть. если протоколом не предусмотрено, то это хижина глистов.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Oct 20 2015, 07:05
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(megajohn @ Oct 19 2015, 20:30) *
дык банально

считать ОДИН БАЙТ "длина пакета"
если УСПЕШНО, то считать N-БАЙТ ( где N это длина пакета )
если УСПЕШНО, то передать в обработку, иначе снова считывать ( пока не будет собран весь пакет )

так то оно так, но байт "длина пакета" в пакете не первый, поэтому бывает, что в неполном пакете этого байта нет

Цитата(esaulenka @ Oct 19 2015, 18:15) *
Если это ПК, то никто не мешает сделать буфер не из байтов, а из пакетов (длина каждого - максимально возможная по протоколу).
А дальше выгребать из массива побайтно и перекладывать в этот буфер. По окончании буфера запомнить состояние "работаем с пакетом №3, в нём 5 байт из N", при появлении следующего "массива" продолжить разбор.
Буфер из пакетов, само собой, закольцованный.

В принципе, количество недостающих байт не важно. Из пришедшего буфера надо только выделить целые пакеты и запомнить нецелый, который после обработки переписать в начало. Вот в этом месте у меня и получился затык, как это реализовать на практике.

Цитата(zltigo @ Oct 19 2015, 18:44) *
Может для начала подскажете, а в чем "проблема" ?

В точном определении неполного пакета.

Сообщение отредактировал Atlantis- - Oct 20 2015, 07:27
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 20 2015, 07:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Вы бы хоть формат пакета привели, а то тут сейчас "разведем тучки ручками"
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Oct 20 2015, 07:50
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(toweroff @ Oct 20 2015, 10:44) *
Вы бы хоть формат пакета привели, а то тут сейчас "разведем тучки ручками"

[0] счетчик
[1] кол-во данных (16, 32, 48, 64...128)
[2] номера датчиков
[3] данные
...

Если данных нет - приходит три нуля.

Сообщение отредактировал Atlantis- - Oct 20 2015, 07:51
Go to the top of the page
 
+Quote Post
smalcom
сообщение Oct 20 2015, 08:42
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



добавьте контрольную сумму и проблема отпадёт
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 20 2015, 09:41
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Atlantis- @ Oct 20 2015, 10:50) *
[0] счетчик
...

Сами то как предполагаете достичь пакетной синхронизации?
Вот включился контроллер, или компьютер, и начал принимать с десятого байта в пакете, и дальше что?

Вот немцы правы - у них принципы передачи данных стандартизованы, время тратится на суть проекта, а не на познание банальных протоколов передачи данных.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Oct 20 2015, 10:31
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(Dog Pawlowa @ Oct 20 2015, 12:41) *
Сами то как предполагаете достичь пакетной синхронизации?
Вот включился контроллер, или компьютер, и начал принимать с десятого байта в пакете, и дальше что?

Вот немцы правы - у них принципы передачи данных стандартизованы, время тратится на суть проекта, а не на познание банальных протоколов передачи данных.

У меня никогда такого не было, чтобы не с первого принимал... А каким образом можно засинхронизироваться? И о каких принципах речь?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 20 2015, 10:47
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Atlantis- @ Oct 20 2015, 13:31) *
А каким образом можно засинхронизироваться? И о каких принципах речь?

Ну самый примитивный стандартный протокол STX текст ETX checksum тайм-аут
Переводите свои данные в текст, обрамляете служебными символами STX/ETX и добавляете контрольную сумму.
Приемник знает, как однозначно найти начало и конец пакета.
Даже если начал принимать с середины, сможет отбросить мусор.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
mcheb
сообщение Oct 20 2015, 10:48
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(Atlantis- @ Oct 20 2015, 13:31) *
У меня никогда такого не было, чтобы не с первого принимал... А каким образом можно засинхронизироваться? И о каких принципах речь?

http://electronix.ru/forum/index.php?showtopic=130550
Форум надо читать, а не только писать
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 23:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016