Други, у меня кое-что получилось, но не все
Итак...
Мониторю я программой
PortMon. Когда в QB выполняется такой оператор:
- Код: Выделить всё
OUT &H3F8+4,1
"монитор" логит следующее:
Процесс: ntvdm.exe
Запрос: IOCTL_SERIAL_SET_DTR
Порт: Serial0
Результат: SUCCESS
Если я выполняю уже в VB6
- Код: Выделить всё
Private Declare Function EscapeCommFunction Lib "kernel32" (ByVal nCid As Long, ByVal nFunc As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const SETDTR = 5
Public hComPort
...
hComPort = CreateFile("COM1", GENERIC_READ, &H1, 0, OPEN_EXISTING, 0, 0)
...
Call EscapeCommFunction(hComPort, SETDTR)
то получаю аналогичный лог
Выходит, что
OUT &H3F8+4,1 в QB равносильно
EscapeCommFunction(hComPort, SETDTR) в VB6 (естественно, имея HANDLE COM-порта; у меня он содержится в
hComPort).
Короче, таким вот образом я "промониторил" все обращения к порту, какие делает программа-драйвер написаная в QB. Осталось "подобрать" аналоги для VB6, и в это я уперся.
На самом деле, изначально хотел заобщаться со своим АЦП через
IOCTL команды, но по ним нет главного - значения констант. Сами команды я нашел:
IOCTL_SERIAL_CLR_DTR
IOCTL_SERIAL_CLR_RTS
IOCTL_SERIAL_GET_COMMSTATUS
IOCTL_SERIAL_GET_DCB
IOCTL_SERIAL_GET_MODEMSTATUS
IOCTL_SERIAL_GET_PROPERTIES
IOCTL_SERIAL_GET_TIMEOUTS
IOCTL_SERIAL_GET_WAIT_MASK
IOCTL_SERIAL_IMMEDIATE_CHAR
IOCTL_SERIAL_PURGE
IOCTL_SERIAL_SET_BREAK_OFF
IOCTL_SERIAL_SET_BREAK_ON
IOCTL_SERIAL_SET_DCB
IOCTL_SERIAL_SET_DTR
IOCTL_SERIAL_SET_QUEUE_SIZE
IOCTL_SERIAL_SET_RTS
IOCTL_SERIAL_SET_TIMEOUTS
IOCTL_SERIAL_SET_WAIT_MASK
IOCTL_SERIAL_SET_XOFF
IOCTL_SERIAL_SET_XON
IOCTL_SERIAL_WAIT_ON_MASK
но в той же
MSDN ни слова про их значения, только про результат и для чего они - эти команды. Поиск в яндексе не увенчался успехом, вобщем одно разочарование
...
ИТОГО:
КОД в QB +++++++++ЗАПРОС отображаемый в PortMon+++++++++АНАЛОГ КОДА в VB6
OUT &H3F8+4, 1 ++++++IOCTL_SERIAL_SET_DTR ++++++++++++++++++ EscapeCommFunction(hComPort, SETDTR)
OUT &H3F8+3, 64 +++++IOCTL_SERIAL_SET_BREAK_ON++++++++++++++ ???
OUT &H3F8+4, 0 ++++++IOCTL_SERIAL_CLR_RTS+++++++++++++++++++ EscapeCommFunction(hComPort, CLRRTS)
OUT &H3F8+4, 2 ++++++IOCTL_SERIAL_SET_RTS +++++++++++++++++++EscapeCommFunction(hComPort, SETRTS)
A = INP(&H3F8+6) +++++IRP_MJ_READ ++++++++++++++++++++++++++???
ЧТО ДОЛЖНО СТОЯТЬ ВМЕСТО ВОПРОСОВ?
Через что организовать чтение? Через какую API функцию считывать?
Тут еще момент: монитор выдает помимо всего прочего
IOCTL_SERIAL_GET_MODEMSTATUS, я так думаю, что скорее всего именно это есть последствия выполнения кода
A = INP(&H3F8+6), потому что считывание параметров с АЦП выполняется циклично:
- Код: Выделить всё
100 OUT b + 4, 0: d = 0: REM ACQUISITION
110 FOR F = 0 TO N - l
120 OUT b + 4, 2
125 V = INP(b + 6)
130 E = V AND 16
140 OUT b + 4, 0
150 IF E = 16 THEN d = d + 2 ^ (N - 1 - F)
160 NEXT F
и именно в этот момент монитор логит как калашников одно и тоже:
IOCTL_SERIAL_SET_RTS
IOCTL_SERIAL_GET_MODEMSTATUS
IOCTL_SERIAL_CLR_RTS
IOCTL_SERIAL_SET_RTS
IOCTL_SERIAL_GET_MODEMSTATUS
IOCTL_SERIAL_CLR_RTS
IOCTL_SERIAL_SET_RTS
IOCTL_SERIAL_GET_MODEMSTATUS
IOCTL_SERIAL_CLR_RTS
...
Такие дела. Помогите разобраться, осталось чуть-чуть
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...