C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
COM Device, виснет при обращении
xim
Отправлено: 29.04.2005, 11:35


Станционный диспетчер

Группа: Участник
Сообщений: 143



Есть некоторое устройство, работающее по COM порту. Сторонней фирмой разработан драйвер этого устройства и библиотека взаимодействия с этим драйвером.

Ситуация:
1. устройство не подключено к порту физически
2. драйвер установлен и пытается работать в этих условиях
3. библиотека обращается к устройству, управление переходит к драйверу и обратно не возвращается.
4. Результат очевиден.

Лучшее решение, которое я нашел, — создать Thread, занимающийся работой с данной библиотекой. По таймауту он пытается грохнуться. Естессно это ему не удается. Результат — рожденный мной thread остается висеть в памяти, хотя визуальных неудобств пользователь не испытывает. Отключение COM порта ничего не дает. У кого-нибудь есть какие-нибудь мысли?
Георгий
Отправлено: 29.04.2005, 20:40


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



я б попробовал с разработчиками драйвера поговорить — наверняка они согласятся исправить свою ошибку
klen
Отправлено: 17.05.2005, 07:31


Машинист паровоза

Группа: Участник
Сообщений: 239



Все это интересно, но не понятно зачем этот драйвер нужен? Эти разработчики дикие извращенцы или чтото еще. Потомучто драйвер по теории лежит в устройстве и правляет его контроллером. А на стороне PC это просто двухстронний поток байтов. И Ваш "драйвер" скорее всего фильтр потока.

Посмотреть что происходит на RS232 можно сканером СOM портов PortMon от Марка Русиновича. Это может чтото прояснит.

У меня был кося недавнр — принесли девайсину (ридер полетных данных с бортового накопителя) и говорят — разработчик сбежал ( послал нах всех потомучто зарплату не платили) исходники остались — типа собери пот 6-ым билдером. Так вот там такая же система как у вас — драйвер (*.dll ) . Помучавшись я всетаки собрал проект но он виснет! Оказалось этот плохой "квазидрайвер" просто реализует доступ к СОМ через порты вводв вывода (передача данных через регистр DX) — мораль — принципиально не рааботает под NT подобные системы.

Попробуте запустить Ваш код на Win98.
Удачи.
xim
Отправлено: 19.05.2005, 11:00


Станционный диспетчер

Группа: Участник
Сообщений: 143



Да — это фильтр. Грузится в 0 кольцо — поэтому все-таки зовем его драйвером (есть "драйвера" вообще не работающие с устройствами smile.gif, и все же их так называют).
Под Win98 у нас в конторе не работают уже давно. Кроме того, драйвер (или фильтр — как угодно) адаптирован под NT систему. Исходниками даже и не пахнет — драйвер разработан сторонней фирмой уже давно — скорее всего связь с разработчиками уже утеряна.

Решения, кроме уже придуманного (деревянного) — нет.
Stan
Отправлено: 19.05.2005, 14:04


Не зарегистрирован







Что тут можно посоветовать:
смотри лог обмена PortMon'ом и путайся таким образом вычислить протокол обмена девайса с компом.
А затем работай с девайсом через COM-порт напрямую, в обход глючного драйвера.
Но задача расколоть командный интерфейс протокола по логам не всегда является тривиальной.
Если есть возможность — просите у фирмы-разработчика девайса спецификацию его командного интерфейса.
А как то пытаться заставить правильно работать глючный драйвер — это из области шаманизма, ИМНО smile.gif .
xim
Отправлено: 19.05.2005, 17:15


Станционный диспетчер

Группа: Участник
Сообщений: 143



PortMon говорит, что не может подключиться к девайсу (COMx, к которому подключено устройство). Похоже при загрузке драйвера порт открывается монопольном режиме (типа CreateFile c dwShareMode=0L). Обратиться к нему можно только по имени девайса "\\\\.\\mydevice" (сишная строка). А дальше начинается работа с тем самым драйвером biggrin.gif. Даже если открыть порт отладочным драйвером раньше (с любыми флагами) — mydevice должен отвалится smile.gif
klen
Отправлено: 20.05.2005, 00:23


Машинист паровоза

Группа: Участник
Сообщений: 239



Ты пробовал монтор запускать раньше чем прогу?
Вообщето на монопольное открытие ему начхать — он сам сделан как драйвер фильтр. Вклинивается в стек драйверов и все.
Stan
Отправлено: 20.05.2005, 09:58


Не зарегистрирован







QUOTE (xim @ 19/05/2005, 17:15)
PortMon говорит, что не может подключиться к девайсу (COMx, к которому подключено устройство).

Запусти PortMon и отметь в Capture/Ports галкой порт, который будешь мониторить раньше запуска драйвера. PortMon берет данные с уровня системного драйвера COM-порта.
Георгий
Отправлено: 21.05.2005, 21:39


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Народ, а что если на проблемку взглянуть с другой стороны?

вместо того, что бы писать аналог этого драйвера, попробовать вооружиться отладчиком и в той функции, что виснет найти тот цикл, из которого он не выходит. наверняка это какая — нибудь функция инициализации и ,если убрать цикл (заNOPить его), то никаких проблем, в дальнейшем не будет.
Asher
Отправлено: 23.05.2005, 08:05


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Не факт. Порт вполне может быть настроен на ожидание заданного количества байт и тайминги тайматутов при этом в infinity.
ИМХО проблема логического плана и полечить ее можно только своим кодом.
Как я понял устройство разрабатывали тоже не вы, в смысле не ваша контора, т.к. иначе протокол у вас был-бы.
Если это серийная продукция, то скажи что за устройство, если конечно не секретное и допуски не требуются. cool.gif
Может знакомое какое окажется или у производителя протокольчик узнать можно.

P.S. опа- это мое сообщение №404 biggrin.gif biggrin.gif biggrin.gif

Отредактировано Asher — 23/05/2005, 09:21
xim
Отправлено: 23.05.2005, 10:18


Станционный диспетчер

Группа: Участник
Сообщений: 143



2klen:
QUOTE
Ты пробовал монтор запускать раньше чем прогу?

Раньше какой проги? Ничего не запущено, кроме драйвера.

2Stan:
QUOTE
Запусти PortMon и отметь в Capture/Ports галкой порт, который будешь мониторить раньше запуска драйвера. PortMon берет данные с уровня системного драйвера COM-порта.

При установке галки COM1 (там, где устройство) ругается на занятость порта (could not attach to Serial0 — the device may be in use). Кстати, насчет источника данных для PortMon уверен? Может быть причина похожа на описанную мной в предыдущем посте?

2Asher:
QUOTE
Как я понял устройство разрабатывали тоже не вы, в смысле не ваша контора, т.к. иначе протокол у вас был-бы.
Если это серийная продукция, то скажи что за устройство, если конечно не секретное и допуски не требуются.
Может знакомое какое окажется или у производителя протокольчик узнать можно.

Верно, не мы — "ИНФОКРИПТ", плата Accord RS (для Touch Memory). Это, я искренне надеюсь biggrin.gif, не секрет .


Отредактировано xim — 23/05/2005, 10:21
Asher
Отправлено: 23.05.2005, 10:58


Мастер участка

Группа: Модератор
Сообщений: 550



а это качали Скачать последние драйвера контроллеров Аккорд для Windows NT и Windows 2000 ?
xim
Отправлено: 23.05.2005, 11:09


Станционный диспетчер

Группа: Участник
Сообщений: 143



А как же? Буквально, только что smile.gif
И полгода — год назад. Они очень даже лучше предыдущих работают, была исправлена проблема с корректностью работы под непривилегированными пользователями в системе. Но эта ошибка (возникающая, повторю, в достаточно нештатной ситуации) так и не была исправлена.

Отредактировано xim — 23/05/2005, 11:10
Stan
Отправлено: 23.05.2005, 11:19


Не зарегистрирован







QUOTE (xim @ 23/05/2005, 10:18)
Раньше какой проги? Ничего не запущено, кроме драйвера.

Вот раньше драйвера и надо запускать PortMon. Что из себя представляет это драйвер и как он активизируется?
xim
Отправлено: 23.05.2005, 11:33


Станционный диспетчер

Группа: Участник
Сообщений: 143



QUOTE
Что из себя представляет это драйвер и как он активизируется?

Драйвер находится в файле "%windir%\system32\drivers\tmdrv.sys" (это TMACCRS.SYS в дистрибутиве, ссылку на который дал Asher). Активируется при загрузке ОСи. Появляются устройства touchm0 и touchm1 (на 2 первых COM).
Guest
Отправлено: 24.05.2005, 10:14


Не зарегистрирован







QUOTE (xim @ 23/05/2005, 11:33)
Драйвер находится в файле "%windir%\system32\drivers\tmdrv.sys" (это TMACCRS.SYS в дистрибутиве, ссылку на который дал Asher). Активируется при загрузке ОСи. Появляются устройства touchm0 и touchm1 (на 2 первых COM).

Мда, разработчики сей басни блеснули интеллектом и оригинальностью...
А эти устройства touchm0 и touchm1 видны в PortMon?
Не получится ли PortMon прописать в реестр в секции автозагрузки, чтобы он стартонул раньше драйвера и сел на порт до него?
Нет ли у "драйвера" команды деактивации/активации порта или устройств touchm0 и touchm1?
Каким образом драйверу указывается конкретно — через какое "устройство" (touchm0 и touchm1) юзаем железку?
xim
Отправлено: 24.05.2005, 15:57


Станционный диспетчер

Группа: Участник
Сообщений: 143



2Guest:
На первые 2 вопроса — ответ "нет".
На 3 — не знаю — протокол обмена с драйвером разработан фирмой "ИНФОКРИПТ" и реализован в драйвере и библиотеке доступа одновременно, работать с которыми можно только при помощи дизассемблера и отладчика. Возможно лучшее решение — этот протокол все-таки расковырять, но это на данный момент неоправданно трудоемко.
4: Никак. Оба. Похоже по какому-то событию (скорее всего callback таймера {или WM_TIMER} — при отладке не интересовался — искал названия устройств {touchm0, touchm1}) начинается попытка чтения того и другого (отловлено в W32DASM — сомнению не подлежит).

2Георгий:
QUOTE

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

Не хотелось бы. Все-таки сторонний коммерческий продукт

Отредактировано xim — 24/05/2005, 16:01

Вернуться в Работа с внешними устройствами