Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Microsoft Windows NT/2000 _ Windows 2000 и DOS COM-порт

Автор: gsant Вторник, 31 Июля 2007, 11:03

Хочу вернуться к старому вопросу, полноценного ответа на который до сих пор нет.
Есть DOS-программа работающыя с COM-портом, ее нужно заставить работать под Windows 2000.

Использование виртуальной машины не приемлемо - программа получает исходные данные и отправляет результат в Windows.
После множества экспериментов могу утверждать следуещее:
1. В статье http://support.microsoft.com/kb/314106 утверждается что такие программы работать не будут - или утверждение не верно, или обращение к COM-порту не является "неограниченным доступом".
2. Программа практически без проблем работает под Windows NT (на уровне: один отказ на сто запусков).
3. Программа с огромными проблемами, но работает под Windows 2000 на стационарной машине (один удачный запуск из 10).
4. Программа чуть лучше работает на ноутбуке с PCMCIA-COM-портом (один удачный запуск из 3-5).
5. Из под Norton Commander (то есть если DOS окно не закрывать между запусками программы), после удачного запуска все последующие тоже удачные.
6. На ноутбуке есть еще одна DOS-программа, она тоже работает через COM-порт, работает стабильно.
7. Все попытки сравнения настроек NT и 2000 ни к чему не привели, все одинаково, по крайней мере в
autoexec.nt, config.nt, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\VirtualDeviceDrivers.
8. Проблема не в железе: NT и 2000 - два разных винта, включаемых поочередно, на одной машине.

Складывается впечатление, что истина где-то рядом, но где?

Автор: gsant Среда, 08 Августа 2007, 4:36

С помощью PORTMON отследил активность COM-порта во время работы программы:
При удачном запуске:
...
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: EVEN WordLength: 8
IOCTL_SERIAL_SET_BAUD_RATE Rate: 9600
IOCTL_SERIAL_CLR_RTS
IOCTL_SERIAL_SET_WAIT_MASK Mask: RXCHAR CTS DSR RLSD ERR RING
IOCTL_SERIAL_WAIT_ON_MASK
IOCTL_SERIAL_GET_MODEMSTATUS
IRP_MJ_WRITE Length 1: .
IRP_MJ_READ Length 10: .."..1..!.
...

При неудачном:
...
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: EVEN WordLength: 8
IOCTL_SERIAL_SET_BAUD_RATE Rate: 9600
IOCTL_SERIAL_CLR_RTS
IOCTL_SERIAL_GET_MODEMSTATUS
IRP_MJ_WRITE Length 1: .
IOCTL_SERIAL_GET_LINE_CONTROL
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: EVEN WordLength: 5
IOCTL_SERIAL_GET_LINE_CONTROL
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: NONE WordLength: 5
IOCTL_SERIAL_GET_LINE_CONTROL
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_GET_LINE_CONTROL
IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1 Parity: EVEN WordLength: 8
IOCTL_SERIAL_SET_BAUD_RATE Rate: 9600
IRP_MJ_WRITE Length 1: .
IOCTL_SERIAL_SET_WAIT_MASK Mask: RXCHAR CTS DSR RLSD ERR RING
IOCTL_SERIAL_WAIT_ON_MASK
IOCTL_SERIAL_GET_LINE_CONTROL
...

Получается что NTVDM.EXE, или еще кто, меняет порядок команд полученных от DOS-программы.
Возможно ли такое и как с этим бороться? Помогите, очень надо!!!

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