|
Обработка массивов с неполными пакетами |
|
|
|
Oct 19 2015, 15:36
|

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

|
Цитата(esaulenka @ Oct 19 2015, 16:15)  Буфер из пакетов, само собой, закольцованный. А зачем закольцованый ?  На самом деле, слишком общий вопрос и и мало данных.. На общий вопрос соответствующий ответ: - опишите свои пакеты структурой данных (классом) с состоянием (длина, сколько данных в него надо принять до состояния "заполненности" итп) - организуйте FIFO - очередь пакетов, например, с помощью списка указателей на эти структуры (std::list, например), тогда недопринятый пакет всегда будет в конце списка. Принятые пакеты удаляем с головы. Кроме этого, возможно реализовать примерно еще 764 других варианта решеня поставленной задачи
Сообщение отредактировал CrimsonPig - Oct 19 2015, 15:38
|
|
|
|
|
Oct 19 2015, 17:30
|

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

|
Цитата(Atlantis- @ Oct 19 2015, 18:02)  обрабатывать несколько полных пакетов, но как это все вычислить, может кто подскажет? дык банально считать ОДИН БАЙТ "длина пакета" если УСПЕШНО, то считать N-БАЙТ ( где N это длина пакета ) если УСПЕШНО, то передать в обработку, иначе снова считывать ( пока не будет собран весь пакет )
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Oct 19 2015, 20:15
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(megajohn @ Oct 19 2015, 20:30)  дык банально Банально, если протоколом предусмотрено обнаружение начала пакета. Наличие только длины это не обеспечивает. Так что автор наступил на грабли. Или временное разделение пакетов, или там STX/ETX и проч. Надежда, что пакеты засинхронизируются намертво, не работает.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 20 2015, 07:05
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 20 2015, 07:50
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 20 2015, 09:41
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Atlantis- @ Oct 20 2015, 10:50)  [0] счетчик ... Сами то как предполагаете достичь пакетной синхронизации? Вот включился контроллер, или компьютер, и начал принимать с десятого байта в пакете, и дальше что? Вот немцы правы - у них принципы передачи данных стандартизованы, время тратится на суть проекта, а не на познание банальных протоколов передачи данных.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 20 2015, 10:31
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(Dog Pawlowa @ Oct 20 2015, 12:41)  Сами то как предполагаете достичь пакетной синхронизации? Вот включился контроллер, или компьютер, и начал принимать с десятого байта в пакете, и дальше что?
Вот немцы правы - у них принципы передачи данных стандартизованы, время тратится на суть проекта, а не на познание банальных протоколов передачи данных. У меня никогда такого не было, чтобы не с первого принимал... А каким образом можно засинхронизироваться? И о каких принципах речь?
|
|
|
|
|
Oct 20 2015, 10:47
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Atlantis- @ Oct 20 2015, 13:31)  А каким образом можно засинхронизироваться? И о каких принципах речь? Ну самый примитивный стандартный протокол STX текст ETX checksum тайм-аут Переводите свои данные в текст, обрамляете служебными символами STX/ETX и добавляете контрольную сумму. Приемник знает, как однозначно найти начало и конец пакета. Даже если начал принимать с середины, сможет отбросить мусор.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 20 2015, 10:48
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

|
Цитата(Atlantis- @ Oct 20 2015, 13:31)  У меня никогда такого не было, чтобы не с первого принимал... А каким образом можно засинхронизироваться? И о каких принципах речь? http://electronix.ru/forum/index.php?showtopic=130550Форум надо читать, а не только писать
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|