| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 кстати, почему-то ссылка твоя не работает... Осел вылетает |
| Автор: Rennigth 11.11.2005, 15:45 | ||
Осел болеет значит, ссылка рабочая. |
| Автор: _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 ну если
А так нельзя? Идет поток "нормальных" данных......И вдруг "бах", пришол "кривой" пакет....Запомнили время и взвели таймер, скажем на 300 мсек.... Идет еще "кривой пакет" - проверили естаймер <300 и кривизна второго пакета ~ кривезне первого, то кричим что все плохо.... Если же дальше пакеты ровные идут, то таймер дойдя до конца останавливается и ждет следующего пакета. Если кривизна пакетов разная, то надо взводить еще один таймер и проверять уже их состояние И ни каких массивов. Или может я не все понял? |
| Автор: _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 | ||||
Ну я ее тоже юзаю...
Вопрос первый, у тебя там 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 | ||||
Посимвольно разбираю... Кончилась строка ну и фиг с ней.... Когда придет следующая, начало текущего пакета останется в буферной строке... Буферная строка - глобальная переменная... |