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 кольцо — поэтому все-таки зовем его драйвером (есть "драйвера" вообще не работающие с устройствами , и все же их так называют).
Под Win98 у нас в конторе не работают уже давно. Кроме того, драйвер (или фильтр — как угодно) адаптирован под NT систему. Исходниками даже и не пахнет — драйвер разработан сторонней фирмой уже давно — скорее всего связь с разработчиками уже утеряна.
Решения, кроме уже придуманного (деревянного) — нет. |
|
Stan |
Отправлено: 19.05.2005, 14:04 |
|
Не зарегистрирован
|
Что тут можно посоветовать:
смотри лог обмена PortMon'ом и путайся таким образом вычислить протокол обмена девайса с компом.
А затем работай с девайсом через COM-порт напрямую, в обход глючного драйвера.
Но задача расколоть командный интерфейс протокола по логам не всегда является тривиальной.
Если есть возможность — просите у фирмы-разработчика девайса спецификацию его командного интерфейса.
А как то пытаться заставить правильно работать глючный драйвер — это из области шаманизма, ИМНО . |
|
xim |
Отправлено: 19.05.2005, 17:15 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
PortMon говорит, что не может подключиться к девайсу (COMx, к которому подключено устройство). Похоже при загрузке драйвера порт открывается монопольном режиме (типа CreateFile c dwShareMode=0L). Обратиться к нему можно только по имени девайса "\\\\.\\mydevice" (сишная строка). А дальше начинается работа с тем самым драйвером . Даже если открыть порт отладочным драйвером раньше (с любыми флагами) — mydevice должен отвалится |
|
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.
ИМХО проблема логического плана и полечить ее можно только своим кодом.
Как я понял устройство разрабатывали тоже не вы, в смысле не ваша контора, т.к. иначе протокол у вас был-бы.
Если это серийная продукция, то скажи что за устройство, если конечно не секретное и допуски не требуются.
Может знакомое какое окажется или у производителя протокольчик узнать можно.
P.S. опа- это мое сообщение №404
Отредактировано 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). Это, я искренне надеюсь , не секрет .
Отредактировано xim — 23/05/2005, 10:21 |
|
Asher |
Отправлено: 23.05.2005, 10:58 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
а это качали Скачать последние драйвера контроллеров Аккорд для Windows NT и Windows 2000 ?
|
|
xim |
Отправлено: 23.05.2005, 11:09 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
А как же? Буквально, только что
И полгода — год назад. Они очень даже лучше предыдущих работают, была исправлена проблема с корректностью работы под непривилегированными пользователями в системе. Но эта ошибка (возникающая, повторю, в достаточно нештатной ситуации) так и не была исправлена.
Отредактировано 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 |
|