LordShade

USB HID Communication

5 posts in this topic

Hello. I am want to send and receive data to/from standard "USB HID device" ( physically it is an atmega chip with V-USB library on it ). How can I do it? Can anyone post examples please?

Share this post


Link to post
Share on other sites



or may be anyone has a UDF?

Share this post


Link to post
Share on other sites

I am found the example for PureBasic, that uses HID_Lib, so that is what I need, but on AutoIt:

#USB_PID=$F4EF
#USB_VID=$AB80

Global W_DeviceHandle=0, R_DeviceHandle=0 ; Глобальные переменные

Procedure FindDevice_Timer() ; periodically find usb device connection
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Устройство подключено (1), или нет (0)
 If Test<>Old_Test
  Old_Test=Test
  If Test                                                  ; Если устройство подключили
     HID_Lib_CloseDevice(W_DeviceHandle)
     HID_Lib_CloseDevice(R_DeviceHandle)
     R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Получаем доступ для чтения
     W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; и записи в устройство.
     SetGadgetText(1,"Подключено HID устройство")
     DisableGadget(2,0) : DisableGadget(3,0)
  Else                                                     ; Если устройство отключили
     HID_Lib_CloseDevice(W_DeviceHandle)                   ; Освобождаем ресурсы, связанные с ним
     HID_Lib_CloseDevice(R_DeviceHandle)
     W_DeviceHandle=0 : R_DeviceHandle=0
     SetGadgetText(1,"Устройство не обнаружено")
     SetGadgetText(5,"Отпущена")
     DisableGadget(2,1) : DisableGadget(3,1)
  EndIf
 EndIf
EndProcedure

Procedure SendDevice(Command.a) ; Передача команды USB устройству.
 Dim Out.a(2)
 Out(0) = 0
 Out(1) = Command
 If W_DeviceHandle
   HID_Lib_WriteDevice(W_DeviceHandle, @Out(),2) ; Запись данных (2 байта) в устройство
 Else
   MessageRequester("", "Нет связи с устройством!", 48)
 EndIf
EndProcedure

Procedure Thread(*xx) ; Эта процедура выполняется в отдельном потоке.
  Dim In.a(2)
  Repeat
    If R_DeviceHandle
      In(0) = 0
      If HID_Lib_ReadDevice(R_DeviceHandle, @In(), 2) = 2 ; Чтение данных из USB устройства.
        If In(1) = 0
          SetGadgetText(5,"Нажата")
        Else
          SetGadgetText(5,"Отпущена")
        EndIf
      EndIf
    EndIf
    Delay(10)
  ForEver
EndProcedure

OpenWindow(0,0,0,320,100,"Пример работы с HID устройством",#PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
   TextGadget(1,10,10,300,16,"Устройство не обнаружено",#PB_Text_Center)
   ButtonGadget(2,40,70,120,24,"Зажечь светодиод") : DisableGadget(2,1)
   ButtonGadget(3,170,70,120,24,"Погасить светодиод") : DisableGadget(3,1)
   TextGadget(4,50,40,108,16,"Состояние кнопки:")
   StringGadget(5,158,36,70,20,"Отпущена",1|#PB_String_ReadOnly)
FindDevice_Timer()
HideWindow(0,0)

AddWindowTimer(0,2,200)   ; Запуск таймера, с периодом генерации событий 200 милисекунд
CreateThread(@Thread(),0) ; Запуск кода процедуры Thread() в отдельном потоке

Repeat ; Главный цикл программы
  Event=WaitWindowEvent()
  If Event=#PB_Event_Gadget ; Произошло событие в одном из гаджетов
    Select EventGadget()
      Case 2          ; Клик по кнопке "Зажечь светодиод"
        SendDevice(1)
      Case 3          ; Клик по кнопке "Погасить светодиод"
        SendDevice(0)
    EndSelect
  ElseIf Event=#PB_Event_Timer
    If EventTimer()=2
      FindDevice_Timer()
    EndIf
  EndIf

 

Share this post


Link to post
Share on other sites

Do you have some .dll to work with?

 

Saludos

Share this post


Link to post
Share on other sites

No, I have not. But I think I can use standard libusb0.dll, but I don't know how.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now