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

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

Сообщение Хакер » 11.07.2006 (Вт) 15:24

Что вы пристали к человеку?

У каждого есть право на ошибку и неточность...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 11.07.2006 (Вт) 15:25

Ну ты внимательно перечитай что именно, ты пишешь :)

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

Сообщение tyomitch » 11.07.2006 (Вт) 15:45

Роман-вб писал(а):!Viper!

а Роману-vb изучать представление целых чисел г компе

Это голословная фраза. Ну где я ошибся, говоря о представлении целых чисел

Формально -- нигде.
Но высказанные тобой сведения не имеют ни малейшего отношения к теме. Например потому, что преобразования из десятичной записи в этой задаче нет совсем. Значит, и дополнительного кода в ней нет.



Хакер писал(а):Что вы пристали к человеку?

У каждого есть право на ошибку и неточность...

Некоторые люди упроно отказываются признавать за собой ошибки и неточности...
Изображение

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 16:00

Некоторые люди упроно отказываются признавать за собой ошибки и неточности...

это не так

GRS писал(а):Кто-нибудь можется сказать: ЧТО ДЕЛАЕТ AND?


Я писал(а):Я просто описал, как действует And и т.д. с числами! Не более.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 11.07.2006 (Вт) 16:06

The bitwise AND may be used to perform a bit mask operation. This operation may be used to isolate part of a string of bits, or to determine whether a particular bit is 1 or 0. For example, given a bit pattern:

Код: Выделить всё
0011

To determine whether the third bit is 1, a bitwise AND is applied to it along with another bit pattern containing 1 in the third bit, and 0 in all other bits:
Код: Выделить всё
    0011
AND 0010
  = 0010
Since the result is 0010 (not zero), the third bit in the original pattern was 1. Using bitwise AND in this manner is called bit masking, by analogy to the use of masking tape to cover, or mask, portions that should not be altered, or are not of interest. The 0 values mask the bits that are not of concern, in this case.
[Место cдаётся]

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

Сообщение tyomitch » 11.07.2006 (Вт) 17:25

Роман-вб писал(а):
Некоторые люди упроно отказываются признавать за собой ошибки и неточности...

это не так

GRS писал(а):Кто-нибудь можется сказать: ЧТО ДЕЛАЕТ AND?


Я писал(а):Я просто описал, как действует And и т.д. с числами! Не более.

А почему ты тогда не расписал, как And действует на Null? что Null And False = False, Null And True = Null And Null = Null.
Какая разница, что к теме это не относится? Раз увидел знакомое слово, значит нужно изливать все свои знания на эту тему.
:twisted: :twisted:
Изображение

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

Сообщение tyomitch » 11.07.2006 (Вт) 17:33

GRS писал(а):Для отображения чисел от 0 до 255 достаточно 8 бит. А по тексту и Вашим поправкам выходит, что каждый бит этого числа выдается еще раз по-битно?? Если 1 - то ооо1оооо, а если 0 - тогда ооо0оооо... Как считаете - это правильно? Почему все крутится вокруг пятого бита?
Что за строчка магическая E = INP(B + 6) AND 16?...

Действительно, для отображения чисел от 0 до 255 достаточно 8 бит. Но эти биты оказваются в порте не одновременно, а по очереди. Поэтому они и читаются (с задержкой) из одного и того же бита.

В моём справочнике написано, что в пятом бите регистра B+6 отражается состояние линии CTS. Видимо, именно эту линию дёргает твой АЦП.

Остальные биты регистра B+6 отражают состояние других линий канала. Там не обязательно нули.
Изображение

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

Сообщение GRS » 11.07.2006 (Вт) 20:10

Но эти биты оказваются в порте не одновременно, а по очереди.

ДА!

В моём справочнике написано, что в пятом бите регистра B+6 отражается состояние линии CTS. Видимо, именно эту линию дёргает твой АЦП.


Выход DATA моего АЦП висит как раз на CTS, ТЕПЕРЬ ВСЁ ПОНЯТНО.

Всем огромное спасибо! :D И за помощь, и за критику, и за полемику, в ходе которой что-то в голове прибавилось и поряснилось :wink:

tyomitch, тебе отдельное спасибо! Буду искать ту книжку :wink:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение GRS » 17.07.2006 (Пн) 19:40

:evil: Оказывается, не решилась моя проблема. Я хочу сказать, что единственное значение, которое я получаю есть - 255. Причем, что с одного, что с другого порта, подключен или не подключен АЦП - все поровну. Создается впечатление, что не там читаем и не туда пишем. Вот, мой код:
Код: Выделить всё
Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
Public W_PORT As Integer
Public A_STATE As Integer
Public CNT As Long
Public N As Integer

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'Это чтоб порбелом начинать читать или прекращать и выходить из программы
Select Case KeyCode
Case Is = 32
If A_STATE = 0 Then
  tmrTake.Enabled = True
  A_STATE = 1
  CNT = 1
Else
  tmrTake.Enabled = False
  A_STATE = 0
End If
Case Is = 27
End
End Select
End Sub

Private Sub Form_Load() ' инициализация
Dim TMP_CCL As Integer
A_STATE = 0

W_PORT = &H2F8
N = 8
Out W_PORT + 4, 1
For TMP_CCL = 1 To 100: Next TMP_CCL
Out W_PORT + 3, 64
For TMP_CCL = 1 To 500: Next TMP_CCL
End Sub

Private Sub tmrTake_Timer() 'все чтение из АЦП в этом таймере
Dim D As Integer
Dim E As Integer
Dim Te As Integer
Dim TMP_CCL As Integer

CNT = CNT + 1
Out W_PORT + 4, 0
D = 0
For TMP_CCL = 0 To N - l
Out W_PORT + 4, 2
E = Inp(W_PORT + 6) And 16
'Te = Inp(W_PORT + 6)
Out W_PORT + 4, 0
If E = 16 Then D = D + 2 ^ (N - 1 - TMP_CCL)
Next TMP_CCL
D = 5 * D / (2 ^ N - 1)
Out W_PORT + 4, 1
lblVolt.Caption = Trim(Str(D))
lblTime.Caption = Trim(Str(CNT))
End Sub


На форме два лэйбла и один таймер. Первый Лэйбл - значние АЦП, второй - просто счетчик считываний. Результат преобразовывается в Вольты (D = 5 * D / (2 ^ N - 1))

Как можно убедиться в том, что нормально пишется и читается? В QB все работает на ура, но здесь же... Хренотень какая-то.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение GRS » 18.07.2006 (Вт) 6:59

Если это нереально, то каков выход из ситуации? Потому что мне нормальный графический интерфейс нужен просто ЖУТЬ КАК. И быстродействие, о коем в случае использования QB даже думать не приходится.

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

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

Сообщение GRS » 18.07.2006 (Вт) 11:21

Я скачал программу, мониторит COM порт. Запрос имеет вид IOCTL_SERIAL_GET_тра-ля-ля или IOCTL_SERIAL_SET_тра-ля-ля. Как этим воспользоваться в VB? Это DeviceIOControl? Кому-нибудь попадалась ссылка с описанием констант для работы с последовательным портом?

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

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

Сообщение Viper » 18.07.2006 (Вт) 11:25

Направление правильное -> MSDN
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение GRS » 18.07.2006 (Вт) 12:10

Меня вот что смутило:
нашел в MSDN такой подраздел "Serial Port Driver IOCTLs". Вроде бы - то, чно нужно... Поднимаюсь наверх - Platform Builder for Microsoft Windows CE 5.0

Я ж в VB6 пишу... Или функция DeviceIoControl аналогично работает в кпк?

Ладно, это все лирика... Как мне обратиться к COM1 или COM2, как узнать их hDevice? Мне б примерчик все же... Не знаю - надо ли через тот же DeviceIoControl подготавливать "порт", устанавливать какие-то скорости обмена, четность и прочее? Или можно сразу слать, он настроен по умолчанию?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 18.07.2006 (Вт) 12:16

DeviceIOControl - это чтобы просто читать / писать ? не надо этого.

1. MSCOMM
2. CreateFile

или я что-то пропустил ?

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

Сообщение tyomitch » 18.07.2006 (Вт) 12:24

1. MSCOMM точно не подойдёт для устройства, выдающего результат через CTS.
2. Наверное, проще было бы разобраться в существующем коде; но у меня АЦП нету, помочь нечем :-(
Изображение

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

Сообщение Viper » 18.07.2006 (Вт) 12:35

2 GRS. Чтобы обратится к COM порту, надо открыть его функцией CreateFile, установить нужную маску и так далее... Одним словом, начинать надо с описания CreateFile, а далее идти по ссылке Communications в Примечаниях. Там есть пример общения с COM портом
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение GRS » 18.07.2006 (Вт) 12:48

Код: Выделить всё
Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

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


Ругается User-defined type not defined, как только жму F5. Что не так?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 18.07.2006 (Вт) 12:58

SECURITY_ATTRIBUTES
Бороться и искать, найти и перепрятать!

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

Сообщение GRS » 18.07.2006 (Вт) 13:02

SECURITY_ATTRIBUTES


Можно подробней? Как ее продекларировать?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение Viper » 18.07.2006 (Вт) 13:02

GRS писал(а):
Код: Выделить всё
Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

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


Ругается User-defined type not defined, как только жму F5. Что не так?


Все не так, неправильное объявление и неправильный вызов. Правильно будет так:

Код: Выделить всё
Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ИнМфд lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

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



Если вдруг нужна SECURITY_ATTRIBUTES, то определяй эту структуру, иначе передавай вместо нее 0.
vbNull к 0 не имеет никакого отношения.
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение GRS » 18.07.2006 (Вт) 13:07

Фигня какая-то... сейчас сижу в интернете, модем на COM2 висит. Выполняю код, пытаюсь получить handle COM1 - ответ 796. Пытаюсь для COM2 - ответ -1, снова пытаюсь для COM1 - ответ -1... Что не так?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

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

Почему он только один раз мне хэндл возвращает, а потом надо перегружать VB?
Про структуру SECURITY - точно, нашел в APIViewer'е :oops:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение GRS » 18.07.2006 (Вт) 13:22

использую Call CloseHandle (hComPort), даже в этом случае ничего не меняется - возвращает -1. Что случилось?... ...между нами... в одиночестве мы виноваты сами... тра ля ля ля :wink:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

Сообщение GRS » 18.07.2006 (Вт) 13:25

andreymp писал(а):
Почему он только один раз мне хэндл возвращает, а потом надо перегружать VB?

Может потому, что ты запрещаешь общий доступ( dwSharedMode=0) и хендл не освобождаешь.


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

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

Сообщение GRS » 18.07.2006 (Вт) 13:29

Код: Выделить всё
Private Const GENERIC_READ = &H80000000
Private Const OPEN_EXISTING = 3
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 Sub Command1_Click()
hComPort = CreateFile("COM1", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0)
End Sub

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


И ничего не изменилось на самом деле, монитор порта показывает, что никаких изменений при нажатии на Command2 не происходит: порт по прежнему открыт (IRP_MJ_CREATE - - - SERIAL0 - - - SUCCESS - - - Options:Open - из лог файла монитора порта)
Последний раз редактировалось GRS 18.07.2006 (Вт) 13:32, всего редактировалось 1 раз.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

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

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

НИ ФИ ГА... Ну и как закрыть хэндл? или как его правильно открыть, что бы потом закрыть? Почему Call CloseHandle(hComPort) не работает???
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 60

    TopList