Нужно перенести этот код с QB на VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 18.07.2006 (Вт) 14:38

andreymp писал(а):Гы... Так у тебя и hComPort не объявлена. И поверь - в Command1_Click она у тебя не та что в Command2_Click.

Вот это я заипался :shock: Пойду немного подремлю :cat:, может башка на место встанет... Спасибо.

Но вопрос нифига не исчерпан... Мне надо этот код... перенести...
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 18.07.2006 (Вт) 18:26

Други, у меня кое-что получилось, но не все :wink: Итак...

Мониторю я программой 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 ни слова про их значения, только про результат и для чего они - эти команды. Поиск в яндексе не увенчался успехом, вобщем одно разочарование :cry: ...

ИТОГО:
КОД в 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

...

Такие дела. Помогите разобраться, осталось чуть-чуть :roll:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.07.2006 (Ср) 10:44

2 GRS, ищи значения констант в .h файлах (Заголовочные файлы C). По идее они должны идти в поставке Visual Studio
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.07.2006 (Ср) 12:13

Viper, их там нет, я проверил.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.07.2006 (Ср) 12:31

Тоже убедился в этом странном факте. :( По идее они должны бы быть в файле WinIOCtl.h, но именно этих констант там нет. Да и вообще нет...

Добавлено:

Эти константы находятся в файле ntddser.h. Сей файл входит в DDK (Driver Development Kit). Посему искать стоит в этом направлении. У меня его нет, поскольку с драйверами не вожусь
Весь мир матрица, а мы в нем потоки байтов!

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 13:24

Может, есть какой-то работающий в XP аналог inpout32.dll? Как QB работает понять не могу, у него ж вообще никаких библиотек нет... Или есть? Может их использовать можно?

Какие выходы предложите еще, ведь, даже найдя значения констант, я не уверен, что заработает. Можно создать какую-то переменную в одном проекте (на QB) и обращаться к ней из другого (на VB). Но тормозить будет наверное, апупенно! Да? Но, вообще - возможно? Как, если не секрет.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.07.2006 (Ср) 14:02

GRS писал(а):Можно создать какую-то переменную в одном проекте (на QB) и обращаться к ней из другого (на VB).


чушь... не заработает
Весь мир матрица, а мы в нем потоки байтов!

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 14:22

Вобщем, нашел я этот файл, но у меня не получилось. Я неправильно декларирую? Или посылаю?
Вот код:
Код: Выделить всё

Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const IOCTL_SERIAL_SET_DTR = 9
Private Const IOCTL_SERIAL_SET_BREAK_ON = 4

Public hComPort

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 Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As Long) As Long

Private Sub Command1_Click()
hComPort = CreateFile("COM1", GENERIC_READ, &H1, 0, OPEN_EXISTING, 0, 0)
End Sub

Private Sub Command2_Click()
Call CloseHandle(hComPort)
End Sub

Private Sub Command3_Click()
Call DeviceIoControl(hComPort, IOCTL_SERIAL_SET_BREAK_ON, 0, 0, 0, 0, 0, 0)
End Sub


И ничего не происходит после того, как я жму Command3. Параметры неправильные? Когда я говорю "ничего не происходит" имею в виду никакой реакции в PortMon'е. Закрытие и открытие происходит четко.

Вот файлик, который я скачал:
Вложения
ntddser.rar
Окончание .h не разрешено, так что он сжат в RAR'е :)
(3.43 Кб) Скачиваний: 46
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.07.2006 (Ср) 14:41

ищи в файле winioctl.h макрос CTL_CODE, он (макрос этот) делает кое-какие преобразования своих аргументов и уже преобразованное значение подставляется как константа вида IOCTL_*.

Дополнительно, объявляй константы As Long и hComPort тоже объяви как Long.
Весь мир матрица, а мы в нем потоки байтов!

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 16:09

ищи в файле winioctl.h макрос CTL_CODE, он (макрос этот) делает кое-какие преобразования своих аргументов и уже преобразованное значение подставляется как константа вида IOCTL_*.

:shock: Эээээ.... :shock: :shock: :shock:
вот файл:
Код: Выделить всё

/*
* Copyright (c) 1990-2000 Microsoft Corporation.  All rights reserved.
* Module Name: winioctl.h
* Abstract: this module defines device IO control codes.
*/

#ifndef _WINIOCTL_
#define _WINIOCTL_

//
// Macro definition for defining IOCTL and FSCTL function control codes.  Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers.
//

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

//
// Define the method codes for how buffers are passed for I/O and FS controls
//

#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3

//
// Define the access check value for any access
//
//
// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
// constants *MUST* always be in sync.
//

#define FILE_ANY_ACCESS                 0
#define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe


//
// Define the various device type values.  Note that values used by Microsoft
// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
// by customers.
//

#define DEVICE_TYPE ULONG

#define FILE_DEVICE_BEEP                0x00000001
#define FILE_DEVICE_CD_ROM              0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
#define FILE_DEVICE_CONTROLLER          0x00000004
#define FILE_DEVICE_DATALINK            0x00000005
#define FILE_DEVICE_DFS                 0x00000006
#define FILE_DEVICE_DISK                0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
#define FILE_DEVICE_FILE_SYSTEM         0x00000009
#define FILE_DEVICE_INPORT_PORT         0x0000000a
#define FILE_DEVICE_KEYBOARD            0x0000000b
#define FILE_DEVICE_MAILSLOT            0x0000000c
#define FILE_DEVICE_MIDI_IN             0x0000000d
#define FILE_DEVICE_MIDI_OUT            0x0000000e
#define FILE_DEVICE_MOUSE               0x0000000f
#define FILE_DEVICE_MULTI_UNC_PROVIDER  0x00000010
#define FILE_DEVICE_NAMED_PIPE          0x00000011
#define FILE_DEVICE_NETWORK             0x00000012
#define FILE_DEVICE_NETWORK_BROWSER     0x00000013
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
#define FILE_DEVICE_NULL                0x00000015
#define FILE_DEVICE_PARALLEL_PORT       0x00000016
#define FILE_DEVICE_PHYSICAL_NETCARD    0x00000017
#define FILE_DEVICE_PRINTER             0x00000018
#define FILE_DEVICE_SCANNER             0x00000019
#define FILE_DEVICE_SERIAL_MOUSE_PORT   0x0000001a
#define FILE_DEVICE_SERIAL_PORT         0x0000001b
#define FILE_DEVICE_SCREEN              0x0000001c
#define FILE_DEVICE_SOUND               0x0000001d
#define FILE_DEVICE_STREAMS             0x0000001e
#define FILE_DEVICE_TAPE                0x0000001f
#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
#define FILE_DEVICE_TRANSPORT           0x00000021
#define FILE_DEVICE_UNKNOWN             0x00000022
#define FILE_DEVICE_VIDEO               0x00000023
#define FILE_DEVICE_VIRTUAL_DISK        0x00000024
#define FILE_DEVICE_WAVE_IN             0x00000025
#define FILE_DEVICE_WAVE_OUT            0x00000026
#define FILE_DEVICE_8042_PORT           0x00000027
#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
#define FILE_DEVICE_BATTERY             0x00000029
#define FILE_DEVICE_BUS_EXTENDER        0x0000002a
#define FILE_DEVICE_MODEM               0x0000002b
#define FILE_DEVICE_VDM                 0x0000002c
#define FILE_DEVICE_MASS_STORAGE        0x0000002d
#define FILE_DEVICE_SMB                 0x0000002e
#define FILE_DEVICE_KS                  0x0000002f
#define FILE_DEVICE_CHANGER             0x00000030
#define FILE_DEVICE_SMARTCARD           0x00000031
#define FILE_DEVICE_ACPI                0x00000032
#define FILE_DEVICE_DVD                 0x00000033
#define FILE_DEVICE_FULLSCREEN_VIDEO    0x00000034
#define FILE_DEVICE_DFS_FILE_SYSTEM     0x00000035
#define FILE_DEVICE_DFS_VOLUME          0x00000036

//
// Windows CE Specific Defines
//
#define FILE_DEVICE_HAL               0x00000101
#define FILE_DEVICE_CONSOLE             0x00000102
#define FILE_DEVICE_PSL               0x00000103
#define FILE_DEVICE_SERVICE            0x00000104

#endif   // _WINIOCTL_

А чего теперь с ним делать? Чес слово - вообще не понял... какой макрос?... :shock: Этот файл в проект надо добавлять? Обращаться к нему?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2006 (Ср) 16:26

Visual Basic:

/*
* Copyright (c) 1990-2000 Microsoft Corporation. All rights reserved.
* Module Name: winioctl.h
* Abstract: this module defines device IO control codes.
*/

Сдаётся мне, что надо было писать не [sуntax="vb"] а [sуntax="c"]
Код: Выделить всё

/*
* Copyright (c) 1990-2000 Microsoft Corporation.  All rights reserved.
* Module Name: winioctl.h
* Abstract: this module defines device IO control codes.
*/

#ifndef _WINIOCTL_
#define _WINIOCTL_

//
// Macro definition for defining IOCTL and FSCTL function control codes.  Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers.
//

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

//
// Define the method codes for how buffers are passed for I/O and FS controls
//

#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3

//
// Define the access check value for any access
//
//
// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
// constants *MUST* always be in sync.
//

#define FILE_ANY_ACCESS                 0
#define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe


//
// Define the various device type values.  Note that values used by Microsoft
// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
// by customers.
//

#define DEVICE_TYPE ULONG

#define FILE_DEVICE_BEEP                0x00000001
#define FILE_DEVICE_CD_ROM              0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
#define FILE_DEVICE_CONTROLLER          0x00000004
#define FILE_DEVICE_DATALINK            0x00000005
#define FILE_DEVICE_DFS                 0x00000006
#define FILE_DEVICE_DISK                0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
#define FILE_DEVICE_FILE_SYSTEM         0x00000009
#define FILE_DEVICE_INPORT_PORT         0x0000000a
#define FILE_DEVICE_KEYBOARD            0x0000000b
#define FILE_DEVICE_MAILSLOT            0x0000000c
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 16:30

ГЛЮК
Последний раз редактировалось GRS 19.07.2006 (Ср) 17:00, всего редактировалось 1 раз.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 16:59

А по существу? :wink: Я не очень в этой теме сведом, буду признателен за пояснение. В особенности, выделенной FUNCTION.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 18:12

Поиск дал мне такой результат: на Си, в Дэльфи испольуют какой-то оператор Include и указывают путь к файлу *.h и все счастливы.

Вобщем, если это макрос, значит, можно сделать это вручную - только как? Кто умеет?
Из всего этого безобразия разглядел #define FILE_DEVICE_SERIAL_PORT 0x0000001b, что-то подсказывает, что он мне тоже нужен :roll:

Как я понял, если мне надо отправить в порт IOCTL_SERIAL_SET_RTS , то нужно как-то преобразовать в число CTL_CODE (0x0000001b, 0, 12, 0) и установить его в качестве значения этого самого IOCTL_SERIAL_SET_RTS. Еще вопрос, 0x0000001b - это число в какой системе(не надо меня пинать, оно так смахивает на значение реестра DWORD в Hex-режиме... :roll: )

Я не вижу строки преобразования, разве что весь макрос и есть строчка: ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)). Что означает << 16, << 14, << 2 (и только один несчастный Method не трогаем :lol:) :?: Я не нашел такого оператора [<<] в VB.
Последний раз редактировалось GRS 19.07.2006 (Ср) 20:07, всего редактировалось 2 раз(а).
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 18:39

О пля :shock: , товарищчи :wink: , гляньте сюда, я нашел ответ на свой вопрос :?:
DeviceType = FILE_DEVICE_SERIAL_PORT = 0x0000001b = 27
Access = 0
Function = 12
Method = 0


тады мона записать так:

IOCTL_SERIAL_SET_RTS = (27*2^16) OR (0*2^14) OR (12*2^2) OR (0)

Это ж надо, какая шутка: у меня нет под рукой VB и я не могу попробывать :(
Последний раз редактировалось GRS 19.07.2006 (Ср) 19:29, всего редактировалось 2 раз(а).
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 18:45

Нашел VB. Не работает... Блин :cry:

Даже так пробывал: Call DeviceIoControl(hComPort, 1769520, 0, 0, 0, 0, 0, 0), и никаких реакций...
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 19:27

GetLastError выдает код ошибки 6...
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.07.2006 (Ср) 20:08

MSDN писал(а):ERROR_INVALID_HANDLE 6 | - The handle is invalid.
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 19.07.2006 (Ср) 20:14

:oops: Б#ЯЯЯЯ:

Код: Выделить всё
Call DeviceIoControl(hComPort, 1769520, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0)


Чё за DummyReturnedBytes :?: :?: :?: Кто мне объяснит? Его поставил, все заработало!
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.07.2006 (Ср) 20:31

Видимо вспомогательный буфер. Например WriteProcessMemory не работает без byteswritten-переменной, куда пишется количество реально записанных байт.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.07.2006 (Ср) 20:38

keks-n и остальные: передача в параметр ByRef As Long нуля ничем не отличается от передачи туда временной переменной.
Меня наводит на определённые подозрения то, что два приведённых фрагмента кода различаются использованием ByVal.
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 20.07.2006 (Чт) 6:54

Очередной ТРАБЛ.
В файле ntddser.h есть описание:
Код: Выделить всё
typedef struct _SERIAL_LINE_CONTROL {
  UCHAR  StopBits;
  UCHAR  Parity;
  UCHAR  WordLength;
} SERIAL_LINE_CONTROL, *PSERIAL_LINE_CONTROL;

и есть вот это:
Код: Выделить всё
#define IOCTL_SERIAL_SET_LINE_CONTROL \
  CTL_CODE (FILE_DEVICE_SERIAL_PORT, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)


Ну, как получить CTL_CODE я разобрался, а как передать через этот код StopBits, Parity, WrodLength? Т.е., мне надо установить новые значения. Как правильно описать и передать SERIAL_LINE_CONTROL?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 20.07.2006 (Чт) 11:15

Мужики, ну помогите :roll:

Короче, мне надо считывать MODEMSTATUS. Как?
Тут еще момент, этот DeviceIoControl должен как-то аргументы передавать, наверное это как раз третий аргумент lpInBuffer As Any. Есть какой-то примерчик? Все что я встречаю в сети - там везде ноли, т.е. ничего кроме функции не шлется.
Я по этому спросил про определение нового типа. Попытался сделать так:
Код: Выделить всё
Private Type SERIAL_LINE_CONTROL
  StopBits As Integer
  Parity As Integer
  WordLength As Integer
End Type

SERIAL_LINE_CONTROL.StopBits = 1
SERIAL_LINE_CONTROL.Parity = 0
SERIAL_LINE_CONTROL.WordLength = 5

my_result = DeviceIoControl(hComPort, IOCTL_Code, SERIAL_LINE_CONTROL, 0, 0, 0, DummyReturnedBytes, ByVal 0)


Ошибка, даже не выполняется...

Дело в том, что драйвер на QB свой строчкой OUT &H3F8+3,64 меняет
WordLength равны изначально (при инициализации наверное) 7, на 5, т.е. WordLehgth = 5. Наверное, это как-то связано со строчками:
Код: Выделить всё
125 V = INP(b + 6)
130 E = V AND 16

потому как 16 это 00010000, единица в пятом разряде. Ну, не знаю - мое предположение. Может и не так.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.07.2006 (Чт) 11:58

Пятый разряд соответствует линии CTS. Другим линиям соответствуют другие разряды.
Связи с длиной слова нет никакой.

Шестой бит в регистре B+3 -- это "Set Break Enable", судя по справочнику на http://www.captain.at/serial-port-registers.php (первый результат в гугле). Неужели ты до сих пор ни один такой справочник не нашёл? Так и пишешь вслепую, на ощупь?
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.07.2006 (Чт) 15:25

GRS Может тебе проще было оформить все общение с портом в PB, а в VB сделать лишь интерфейс

и будет это работать только в Win9x
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 21.07.2006 (Пт) 5:55

tyomitch, благодарю :wink: Возможно, я бы и нашел, но нет еще четкого понимания адреса и регистра. Описание пинов у меня есть.

В этой связи возник другой вопрос: а при помощи чего сформированые биты посылать в регистр? Какой функцией: DeviceIoControl? Я с ней не могу разобраться до конца, по ходу все ее IOCTL'ы это уже сформированые биты... Допустим, мне необходимо передать порту, что скорость должна быть 36600 bit/s. Как это ему сообщить? Можно на примере :roll: :?:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 21.07.2006 (Пт) 10:12

DeciceIOControl помимо кода принимает ещё несколько параметров, в числе которых буфера ввода и вывода. Попробуй передавать через буфер.
Изображение

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList