![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Kirill_Arbuzov |
|
|||
|
Unregistered |
Нужно получить несколько пакетов информации с компорта и загнать их (пакеты) в массив для дальнейшей обработки. Данные поступают каждую секунду. Можно ли разбить полученную информацию на пакеты без ввода идентификаторов начала и конца пакета. Длинна пакета фиксирована. Помогите плиз!
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
порт понятия не имеет о твоих пакетах. он передает информацию -- ты ее парсиш. все.
как работать с портом: http://forum.vingrad.ru/index.php?showtopic=68604 -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kirill_Arbuzov |
|
|||
|
Unregistered |
да дело в том, что нужно отсеять данные полученные ранее, и работать только с теми, что пришли в это время
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
как я поинмаю, полученные данные ты куда-то сохраняеш. что мешает при получении новых удалить старые?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kirill_Arbuzov |
|
|||
|
Unregistered |
_hunter
вот это правильно, а как это сделать? Просто очистить буфер порта? PurgeComm после обработки полученных? |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
_hunter
кстати, почему-то ссылка твоя не работает... Осел вылетает |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Осел болеет значит, ссылка рабочая. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
при чем тут буффер порта? он старые данные не хранит...
по поводу ссылки: хз -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Есть механизм переброски данных их COM-порта в буфер клавиатуры, может это то, что надо?
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Kirill_Arbuzov |
|
|||
|
Unregistered |
дело в том что мне нужно следить за состоянием датчиков, установленных на конвеерах. сигналы поступают на компорт. Мне нужно отслеживать состояние устройств, и в случае поломки сообщить об этом пользователю. Но бывает (очень часто на практике) что данные об устройстве приходят искаженными, а сам конвеер работает. Поэтому необходимо вводить таймер, который сравнивает полученное ранее значение с тем, которое пришло. Если они содержат одинаковую ошибку, то только в этом случае пользователь получит уведомление. Проблема в том, что полученными данными нужно забить в массив, а вот с этим-то и проблема - данные полученные в разное время (100 мсек разницы) распознаются как одно целое
|
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 0 Всего: 68 |
Kirill_Arbuzov ну если
А так нельзя? Идет поток "нормальных" данных......И вдруг "бах", пришол "кривой" пакет....Запомнили время и взвели таймер, скажем на 300 мсек.... Идет еще "кривой пакет" - проверили естаймер <300 и кривизна второго пакета ~ кривезне первого, то кричим что все плохо.... Если же дальше пакеты ровные идут, то таймер дойдя до конца останавливается и ждет следующего пакета. Если кривизна пакетов разная, то надо взводить еще один таймер и проверять уже их состояние И ни каких массивов. Или может я не все понял? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
распознаются кем? и по какому принципу?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kirill_Arbuzov |
|
|||
|
Unregistered |
_hunter
~FoX~ Приходит ко мне пакет от конвеера №1, например он равен "111" (правильный), затем приходит пакет "222" от второго конвеера.... я юзаю компоненту com32. Там есть событие прихода в порт данных - смотрю данные - "111222 ...." то есть событие возникает не по приходу первого пакета "111". Компонента говорит типа эти данные пришли одновременно. В этом и вся беда. |
|||
|
||||
| YurikGL |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Ну я ее тоже юзаю...
Вопрос первый, у тебя там rs-232 или rs-422 (или 485-й) который шинный? Если у тебя интерфейс один и он RS-232, значит, реально у тебя приходит с одного устройства. Идем далее... Пакеты ж предполагалось как-то различать? Либо у них фиксированная длина, либо есть признак начала/конца. Хотя фиксированная длина - частный случай, когда есть признак конца пакета (длина пакета превысила N значит это уже следующий пакет). Я делал так: Создаю буферную строку. Принимаю символ. Добавляю его к буферной строке. Если этот символ - не является конечным символом пакета, то считываем следующий символ-добавляем к буферной строке и т.д. Если символ является концом пакета, то вызываем процедуру обработки пакета в целом и в качестве ее параметра используем нашу буферную строку. Эта процедура (лучше ее выделить в отдельный поток), когда заканчивает работу, буферную строку сама уничтожает. А основная процедура создает новую буферную строку и все заново... Если скорости порта низкие, а обработка простая, то можно обходится одной буферной строкой не уничтожая и не создавая ее вновь. Но нужно быть уверенным, что процедура обработки пакета завершится до того, как переполнится буфер порта. --------------------
|
||||
|
|||||
| Kirill_Arbuzov |
|
|||
|
Unregistered |
YurikGL
у меня rs-232 датчики подключены к преобразователю, он отцифровывает сигнал и передает в ком порт. А как ты приход одного символа как получаешь? [quote] Я делал так: Создаю буферную строку. Принимаю символ. Добавляю его к буферной строке. ---- Компонента ж возвращает целый полученый кусок! |
|||
|
||||
| YurikGL |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Посимвольно разбираю... Кончилась строка ну и фиг с ней.... Когда придет следующая, начало текущего пакета останется в буферной строке... Буферная строка - глобальная переменная... --------------------
|
||||
|
|||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |