Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с COM портами, Работа с COM портами 
:(
    Опции темы
PRO
  Дата 3.2.2003, 23:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Программа (DOS/WIN) отсылает по COM-порту данные. Как в Delphi прочитать отсылаемые данные?
  Вверх
Dayana
Дата 4.2.2003, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



Есть среди компонетов APRO компонент TApdComPort, который работает с COM портом...

Это сообщение отредактировал(а) Dayana - 4.2.2003, 02:22
PM MAIL ICQ   Вверх
AntonSaburov
Дата 4.2.2003, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



MSDN - он вообще помогает smile.gif

The "CreateFile" function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O. For more information about communications, see Communications.


PM MAIL WWW ICQ   Вверх
Vit
Дата 4.2.2003, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



А почему бы не попробовать в наш FAQ заглянуть:
http://www.forum.vingrad.ru/index.php?act=...=ST&f=32&t=1950


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Dapo
Дата 5.2.2003, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Топик в FAQ . Не понятно, зачем автор использует структуру OVERLAPPED при чтении данных (ReadFile). Ведь порт он открывает как FILE_ATTRIBUTE_NORMAL. Кроме того эта структура используется, как я понял из ее описания, используется при параллельной работе с файловым вводом/выводом и указатель на нее должен присутствовать в ReadFile, WriteFile и WaitCommEvent. Последняя функция, ждет события ком-порта и если нет указателя на OVERLAPPED, то она просто не возвращает значения пока событие не произойдет. Если указатель присутствует, то функция возвращает какое-то значение и далее уже нужно манипулировать с указателем на событие.
PM MAIL   Вверх
Chingachguk
Дата 5.2.2003, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Недавно возился с одной прогой ("PROWIN"). Это 16-ти битное приложение для win, которое послылает/принимает данные через модемы и т.д. Мне хотелось посмотреть, что и как она отсылает/получает в COM-порт: струтуру протокола и т.п.

Исследование показало, что такие (16-ти битные) приложения юзают различные апи системной библиотеки user.exe (OpenComm, ReadComm .. etc). user.exe в свою очередь является затычкой и транслирует такие вызовы в драйвер VCOMM.vxd (речь идет о win9x).

Таким образом, чтобы исследовать работу этой программы с com-портом (подразумевается, что нет исходного текста), существуют как минимум 2 способа:

- Перехват и мониторирование апи user.exe;
- Перехват и мониторирование апи VCOMM;

В отладчике, разумеется, можно ставить бряки куда угодно но в реальной работе такие паузы недопустимы: нужно было написать именно логгер этих апи.
Как мне показалось, лучшим решением является именно перехват апи VCOMM, поскольку по мощности (уровню детализации) апи драйвера чуть ли не один в один повторяют апи user.exe и, самое главное, есть стандартный виндовый механизм перехвата апи любого драйвера из другого драйвера.
Реализация заключалась в написании довольно простого vxd, перехватывающего апи VCOMM и по запросу win32 приложения (DeviceIOControl из kernel32.dll) отдающего результат мониторинга (вызов с такими-то параметрами, результат такой-то).

Если кому-то будет интересно, могу поделиться исходниками и комментраиями.








--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Dapo
Дата 6.2.2003, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Очень интересно. ) Поделись. Может в FAQ закинешь? На всякий случай: [email protected]
PM MAIL   Вверх
Chingachguk
Дата 6.2.2003, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Что значит - в FAQ ?
Могу положить прямо сюда код драйвера, скомпиленный драйвер и пример кода, его юзающего. Могу положить в свой каталог и дать ссылку.

На всякий случай:

http://chingachguk.newmail.ru/Hookvcom.arj

Там несколько файлов.

hook.ASM - текст драйвера vxd;
hook_vxd.asm - пример загрузки драйвера и запросов к нему;
HOOK.VXD - сам драйвер;
hook_vxd.exe - код загрузчика;
hook_VCOMM01.log - Пример лог-файла программы слежения.

Как это работает ?
- Сначала hook_vxd загружает через DeviceIOControl драйвер;
- Далее она вызывает его функцию HookProc - перхватить функции драйвера VCOMM: перехватываются вызовы OpenComm, ReadComm, WriteComm и CloseComm;
- После этого я открываю тред, в котором опять через DeviceIOControl опрашиваю драйвер функцией GetFirstDebugInfo - получить отладочную информацию от драйвера. Поскольку работа асинхронная, драйвер копит отладку в своем кольцевом буфере и выдает из него пакет за пакетом вызвающему его win32-приложению. Не лучшее решение ж)
- Если MessageBox опрашивающей программы закрывается, то она выгружает драйвер, отдав ему команду UnHookProc - осовбодить перехваченные функции.

Пример работы:

Date:06.02.03 Time:12:54:47:OpenComm:COM1 Result:EAX:c17fc574
Date:06.02.03 Time:12:54:55:CloseComm:port:c17fc574 Result:EAX:c17fc575 Result:EAX:00000002

В первой строке видно, что был вызов OpenComm'а. Переданный аргумент (имя порта) был COM1, VCOMM порт открыл и вернул его хэндл (EAX:c17fc574).
Вторая строка: Был вызов CloseComm'а. Передался хэндл ранее открытого порта (port:c17fc574), результат работы функции был:EAX:00000002.

Примерно так ;)



Это сообщение отредактировал(а) Chingachguk - 6.2.2003, 21:13


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Chingachguk
Дата 6.2.2003, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Да, и еще.

Не все приложения, работающие с COM-портами, можно мониторить под win9x таким драйвером, но многие (те, которые в конце концов используют драйвер VCOMM). Вот еще посмотрел одно приложение (написано на Дельфи, загрузчик терминала, подключенного к com-порту):

Цитата

Date:06.02.03 Time:13:15:59:OpenComm:COM1 Result:EAX:c17fc574

Date:06.02.03 Time:13:15:59:WriteComm:port:c17fc574 cchRequested:00000001 Result:EAX:00000001 cchWritten:00000001 Sended buffer:05h,

Date:06.02.03 Time:13:16:04:WriteComm:port:c17fc574 cchRequested:00000001 Result:EAX:00000001 cchWritten:00000001 Sended buffer:05h,

Date:06.02.03 Time:13:16:05:CloseComm:port:c17fc574 Result:EAX:c17fc575 Result:EAX:00000004


Терминал не был готов принять данные, поэтому видно, как приложение каким-то образом пытается установить соединение, отправляя байт 05h в порт с интервалом в 5 сек.

У драйвера VCOMM существуют и другие фунции, например:

Цитата

0007h "_VCOMM_SetupComm"
0008h "_VCOMM_TransmitCommChar"
0009h "_VCOMM_CloseComm"
000Ah "_VCOMM_GetCommQueueStatus"
000Bh "_VCOMM_ClearCommError"
000Ch "_VCOMM_GetModemStatus"
000Dh "_VCOMM_GetCommProperties"
...


Но я пока мониторю только 4. Остальные, видимо, предназначены для настройки порта и т.п (см. MSDN).


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
PRO
Дата 7.2.2003, 17:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо всем за ответы! Да хорошие дали ответы (особенно Chingachguk и Dapo) спасибо! Но я еще хотел бы уточнить ситуацию: итак на компе стоит прога (читать - много разных прог), отсылающая по COM порту данные;требуется: с этого же компа вести мониторинг COM портов и что самое главное: чтение данных, которые отправляет прога (например прога отправляет по COM1 данные, моя прога на том же компе считывает данные с COM1, которые отсылает прога другому компу...). Фух! Прошу прощения за мутную трактовку, но я думаю всем все понятно. С нетерпением жду Вашего ответа...
  Вверх
Chingachguk
Дата 7.2.2003, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



to PRO: вроде моя прога (точнее, драйвер+прога как раз это и делает), причем не для одной конкретной проги, а для всех, кто общается с COM-портами через VCOMM. Если будешь пользовать, то единственное, что буфер записи у меня маловат и для больших пакетов не подходит. Если что, могу переделать.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
PRO
Дата 9.2.2003, 17:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











to Chingachguk: Спасибо за помощь! Я скачал твой архив. Правда почему - то в процесе работы прога намертво вешает комп, но главное - я понял что и как. Спасибо! Но теперь меня еще больше волнует вопрос: как быть с такой прогой, если она под ДОС и работает в Окнах confused.gif
  Вверх
Chingachguk
Дата 11.2.2003, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

...Правда почему - то в процесе работы прога намертво вешает комп...


Исправлено:

http://chingachguk.newmail.ru/Hook_vxd.arj

(Там было переполнение кадра кольцевого буфера). Сделал 50 кадров в буфере, размер кадра отладки сделал 2000h и добавил контроль на границы. Теперь виснуть не должно.

Если про дос, то можно перехватить int 21h функцию "open file" (3dh), запомнить дескриптор открытого "файла" и смотреть уже функции чтения-записи (3fh/40h) аналогично. Правда, если она это делает напрямую (через порты ввода-вывода), то этот способ не пройдет ...





--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
PRO
Дата 13.2.2003, 17:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











to:Chingachguk Скачал твой новый архив... но увы извени... хороших новостей нет - он тоже веси всю систему намертво (на том же месте). Да, а с ДОС ом я вижу ничего не выйдет, даconfused.gif
  Вверх
Chingachguk
Дата 14.2.2003, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Млин... А как вешает ? У тебя же 98-95 ? Запускать надо просто exe,vxd должно быть под ногами. Мессадж боксы успевает показать ? А если не запускать проги, работающей с ком-портом (те мониторить вхолостую), то он нормально (монитор) завершается ?


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.