Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Работа с Сom-портом


Автор: Kirill_Arbuzov 11.11.2005, 12:34
Нужно получить несколько пакетов информации с компорта и загнать их (пакеты) в массив для дальнейшей обработки. Данные поступают каждую секунду. Можно ли разбить полученную информацию на пакеты без ввода идентификаторов начала и конца пакета. Длинна пакета фиксирована. Помогите плиз!

Автор: _hunter 11.11.2005, 12:46
порт понятия не имеет о твоих пакетах. он передает информацию -- ты ее парсиш. все.
как работать с портом:
http://forum.vingrad.ru/index.php?showtopic=68604

Автор: Kirill_Arbuzov 11.11.2005, 13:32
да дело в том, что нужно отсеять данные полученные ранее, и работать только с теми, что пришли в это время

Автор: _hunter 11.11.2005, 14:38
как я поинмаю, полученные данные ты куда-то сохраняеш. что мешает при получении новых удалить старые?

Автор: Kirill_Arbuzov 11.11.2005, 14:58
_hunter
вот это правильно, а как это сделать? Просто очистить буфер порта? PurgeComm после обработки полученных?

Автор: Guest 11.11.2005, 15:00
_hunter
кстати, почему-то ссылка твоя не работает... Осел вылетает smile

Автор: Rennigth 11.11.2005, 15:45
Цитата(Guest @ 11.11.2005, 15:00)
кстати, почему-то ссылка твоя не работает... Осел вылетает 

Осел болеет значит, ссылка рабочая.

Автор: _hunter 11.11.2005, 15:46
при чем тут буффер порта? он старые данные не хранит...
по поводу ссылки: хз

Автор: Cashey 11.11.2005, 15:51
Есть механизм переброски данных их COM-порта в буфер клавиатуры, может это то, что надо?

Автор: Kirill_Arbuzov 11.11.2005, 16:16
дело в том что мне нужно следить за состоянием датчиков, установленных на конвеерах. сигналы поступают на компорт. Мне нужно отслеживать состояние устройств, и в случае поломки сообщить об этом пользователю. Но бывает (очень часто на практике) что данные об устройстве приходят искаженными, а сам конвеер работает. Поэтому необходимо вводить таймер, который сравнивает полученное ранее значение с тем, которое пришло. Если они содержат одинаковую ошибку, то только в этом случае пользователь получит уведомление. Проблема в том, что полученными данными нужно забить в массив, а вот с этим-то и проблема - данные полученные в разное время (100 мсек разницы) распознаются как одно целое

Автор: ~FoX~ 11.11.2005, 16:31
Kirill_Arbuzov ну если
Цитата(Kirill_Arbuzov @ 11.11.2005, 13:34)
Длинна пакета фиксирована
, то и обрабатывай поток кусками размером именно этой длинны....

А так нельзя?
Идет поток "нормальных" данных......И вдруг "бах", пришол "кривой" пакет....Запомнили время и взвели таймер, скажем на 300 мсек....
Идет еще "кривой пакет" - проверили естаймер <300 и кривизна второго пакета ~ кривезне первого, то кричим что все плохо....
Если же дальше пакеты ровные идут, то таймер дойдя до конца останавливается и ждет следующего пакета.
Если кривизна пакетов разная, то надо взводить еще один таймер и проверять уже их состояние
И ни каких массивов. smile
Или может я не все понял?

Автор: _hunter 11.11.2005, 16:35
распознаются кем? и по какому принципу?

Автор: Kirill_Arbuzov 11.11.2005, 16:52
_hunter
~FoX~


Приходит ко мне пакет от конвеера №1, например он равен "111" (правильный), затем приходит пакет "222" от второго конвеера....


я юзаю компоненту com32. Там есть событие прихода в порт данных - смотрю данные - "111222 ...." то есть событие возникает не по приходу первого пакета "111". Компонента говорит типа эти данные пришли одновременно. В этом и вся беда.

Автор: YurikGL 11.11.2005, 17:08
Цитата
я юзаю компоненту com32.

Ну я ее тоже юзаю...

Цитата
Там есть событие прихода в порт данных - смотрю данные - "111222 ...." то есть событие возникает не по приходу первого пакета "111". Компонента говорит типа эти данные пришли одновременно.


Вопрос первый, у тебя там rs-232 или rs-422 (или 485-й) который шинный? Если у тебя интерфейс один и он RS-232, значит, реально у тебя приходит с одного устройства.
Идем далее...
Пакеты ж предполагалось как-то различать? Либо у них фиксированная длина, либо есть признак начала/конца. Хотя фиксированная длина - частный случай, когда есть признак конца пакета (длина пакета превысила N значит это уже следующий пакет).

Я делал так:
Создаю буферную строку.
Принимаю символ. Добавляю его к буферной строке.
Если этот символ - не является конечным символом пакета, то считываем следующий символ-добавляем к буферной строке и т.д.
Если символ является концом пакета, то вызываем процедуру обработки пакета в целом и в качестве ее параметра используем нашу буферную строку. Эта процедура (лучше ее выделить в отдельный поток), когда заканчивает работу, буферную строку сама уничтожает. А основная процедура создает новую буферную строку и все заново...

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

Автор: Kirill_Arbuzov 11.11.2005, 17:21
YurikGL
у меня rs-232 датчики подключены к преобразователю, он отцифровывает сигнал и передает в ком порт. А как ты приход одного символа как получаешь?

[quote] Я делал так:
Создаю буферную строку.
Принимаю символ. Добавляю его к буферной строке.


----

Компонента ж возвращает целый полученый кусок!



Автор: YurikGL 12.11.2005, 22:04
Цитата
А как ты приход одного символа как получаешь?


Цитата
Там есть событие прихода в порт данных - смотрю данные - "111222 ...."

Посимвольно разбираю...
Кончилась строка ну и фиг с ней....
Когда придет следующая, начало текущего пакета останется в буферной строке...
Буферная строка - глобальная переменная...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)