Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вс авг 19, 2012 15:27:35

Так и делал, далее при тестировании выдавало что-то типа: "невозможно обратиться к 0 адресу" или что-то подобное, но уже не важно, я уже все сделал на тех библиотеках, которые вы мне посоветовали)) :)) Все работает, только пришлось (для универсальности программы) делать целых 3 модуля:

HID_Lib_Plus.vb
СпойлерPublic Function HID_CloseDevice(ByVal Handle As Integer) As Integer

If System.IntPtr.Size = 4 Then
HID_CloseDevice = HID_Lib_Plus_x86.HID_Lib_Plus_CloseDevice(Handle)
Else
HID_CloseDevice = HID_Lib_Plus_x64.HID_Lib_Plus_CloseDevice_x64(Handle)
End If
End Function

HID_Lib_Plus_x64.vb
СпойлерPrivate Declare Function HID_CloseDevice Lib "HID_Lib_Plus_x64.dll" (ByVal Handle As Integer) As Integer

Public Function HID_Lib_Plus_CloseDevice_x64(ByVal Handle As Integer) As Integer
HID_Lib_Plus_CloseDevice_x64 = HID_Lib_Plus_x64.HID_CloseDevice(Handle)
End Function

HID_Lib_Plus_x86.vb
СпойлерPrivate Declare Function HID_CloseDevice Lib "HID_Lib_Plus.dll" (ByVal Handle As Integer) As Integer

Public Function HID_Lib_Plus_CloseDevice(ByVal Handle As Integer) As Integer
HID_Lib_Plus_CloseDevice = HID_Lib_Plus_x86.HID_CloseDevice(Handle)
End Function


И это все потому, что 2 библиотеки (х86 и х64) имеют одинаково названные функции... С другими функциями так-же...

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вс авг 19, 2012 15:42:35

В VB вроде есть алиасы с помощью которых можно изменить имя импортируемой функции.
Можно так же использовать условную компиляцию чтобы собирать программу под требуемую платформу. В этом случае, одинаковые имена не помеха.

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вс авг 19, 2012 15:47:57

Да, вы правы, есть, но вот давать другие имена я не умею, а с условной компиляцией не пробовал... Буду разбираться))) Спс))

Все, разобрался, использую Alias))
Теперь только 1 модуль:
HID_Lib_Plus
СпойлерModule HID_Lib_Plus
' x86
Private Declare Function HID_OpenDevice_x86 Lib "HID_Lib_Plus.dll" Alias "HID_OpenDevice" (ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer
Private Declare Function HID_CloseDevice_x86 Lib "HID_Lib_Plus.dll" Alias "HID_CloseDevice" (ByVal Handle As Integer) As Integer
Private Declare Function HID_ReadDevice_x86 Lib "HID_Lib_Plus.dll" Alias "HID_ReadDevice" (ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
Private Declare Function HID_WriteDevice_x86 Lib "HID_Lib_Plus.dll" Alias "HID_WriteDevice" (ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
Private Declare Function HID_DeviceTest_x86 Lib "HID_Lib_Plus.dll" Alias "HID_DeviceTest" (ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer
' x64
Private Declare Function HID_OpenDevice_x64 Lib "HID_Lib_Plus_x64.dll" Alias "HID_OpenDevice" (ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer
Private Declare Function HID_CloseDevice_x64 Lib "HID_Lib_Plus_x64.dll" Alias "HID_CloseDevice" (ByVal Handle As Integer) As Integer
Private Declare Function HID_ReadDevice_x64 Lib "HID_Lib_Plus_x64.dll" Alias "HID_ReadDevice" (ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
Private Declare Function HID_WriteDevice_x64 Lib "HID_Lib_Plus_x64.dll" Alias "HID_WriteDevice" (ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
Private Declare Function HID_DeviceTest_x64 Lib "HID_Lib_Plus_x64.dll" Alias "HID_DeviceTest" (ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer

Public Function HID_OpenDevice(ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer
If System.IntPtr.Size = 4 Then
HID_OpenDevice = HID_OpenDevice_x86(PID, VID, VersionNumber, Index)
Else
HID_OpenDevice = HID_OpenDevice_x64(PID, VID, VersionNumber, Index)
End If
End Function

Public Function HID_CloseDevice(ByVal Handle As Integer) As Integer
If System.IntPtr.Size = 4 Then
HID_CloseDevice = HID_CloseDevice_x86(Handle)
Else
HID_CloseDevice = HID_CloseDevice_x64(Handle)
End If
End Function

Public Function HID_ReadDevice(ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
If System.IntPtr.Size = 4 Then
HID_ReadDevice = HID_ReadDevice_x86(Handle, buffer, Len)
Else
HID_ReadDevice = HID_ReadDevice_x64(Handle, buffer, Len)
End If
End Function

Public Function HID_WriteDevice(ByVal Handle As Integer, ByVal buffer() As Byte, ByVal Len As Integer) As Integer
If System.IntPtr.Size = 4 Then
HID_WriteDevice = HID_WriteDevice_x86(Handle, buffer, Len)
Else
HID_WriteDevice = HID_WriteDevice_x64(Handle, buffer, Len)
End If
End Function

Public Function HID_DeviceTest(ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Short, ByVal Index As Short) As Integer
If System.IntPtr.Size = 4 Then
HID_DeviceTest = HID_DeviceTest_x86(PID, VID, VersionNumber, Index)
Else
HID_DeviceTest = HID_DeviceTest_x64(PID, VID, VersionNumber, Index)
End If
End Function
End Module

Re: Простейший код HID. Везде только слова, мыши и джойстики

Пн авг 20, 2012 21:27:15

У меня возникла проблема с VB6.0 - в переменную "VersionNumber" надо затолкать число, большее, чем 32'767, т.е. там что-то в районе 42'000. Совершенно не представляю, как мне объявить переменную из двух байт, может как два аргумента, типа
"Ver1 as byte, Ver0 as Byte"
Какие будут советы?

Ни на одну из пар VID-PID (найденных в диспечтере устройств) не реагирует библиотека, видимо из-за того, что подключение к устройствам уже установлено из среды WinXP. Плату с ATmega8A скоро изготовлю, надеюсь не впустую...
:solder:

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вт авг 21, 2012 09:50:13

VOG-NevaDA писал(а):Совершенно не представляю, как мне объявить переменную из двух байт
Переменная не должна состоять из двух байт, точнее издвух переменных, а должна занимать в памяти два байта.
Если верить этому, то тип переменной должен быть Integer.
"VersionNumber" это не обяхательный параметр. В мето него можо указать -1 и тогда будет производится поиск только по PID и VID.

Для примера, вот кусок кода на VB6. http://www.radiokot.ru/forum/viewtopic. ... 74#p446274
Код:
        Dim vid As Integer = 5824
        Dim pid As Integer = 1503


        Dim ver As Integer = -1
        Dim ind As Integer = 0
        Dim Handle As Integer
        Dim res
        Dim CountInputBuffers
        Handle = HID_OpenDevice(pid, vid, ver, ind)


VOG-NevaDA писал(а):Ни на одну из пар VID-PID (найденных в диспечтере устройств) не реагирует библиотека
Скорее всего не правильно указываете эти идентификаторы.
Что покажет эта программа? http://www.radiokot.ru/forum/viewtopic. ... 86#p446286

Re: Простейший код HID. Везде только слова, мыши и джойстики

Ср авг 22, 2012 23:05:07

Всё, собрал плату, определяется как HID, но функция HID_DeviceTest возвращает 0 при всех вариантах входных параметров...
Вложения
3.GIF
(14.6 KiB) Скачиваний: 657

Re: Простейший код HID. Везде только слова, мыши и джойстики

Чт авг 23, 2012 09:07:14

VOG-NevaDA писал(а):но функция HID_DeviceTest возвращает 0 при всех вариантах входных параметров
На скриншоте данные указаны в шестнадцатеричной системе счисления.
Это учтено в коде?

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вс авг 26, 2012 05:25:00

Простите, что долго не отвечал. Само собой учтено, пишется как &H2010 и т.д., это я знаю, ошибок в программе вроде не допускал, может только я зря 2-х байтовый аргумет обозвал Integer'ом...

Re: Простейший код HID. Везде только слова, мыши и джойстики

Вс авг 26, 2012 07:16:04

Я ставил алгоритм, перебирающий все возможные варианты индексов - бесполезно. Версию пробовал -1 и 0 - тот же эффект...
Ответить