Главная » Статьи » Microbasic

Работа с USB HID устройствами в среде PureBasic

В данной статье рассказано о разработке приложения для Windows в среде PureBasic, для работы с USB HID устройствами.
Компилятор можно найти здесь

Для поддержки HID устройств, понадобится установить библиотеку Hid_Lib Она предназначена для версии 4.40 или 4.41 компилятора PureBasic.
Для установки библиотеки, содержимое архива HID_Lib_4.41.rar нужно извлечь в папку с PureBasic таким образом, чтобы файлы из архива были добавлены в одноимённые папки компилятора.
Если установка выполнена по умолчанию, архив нужно извлечь в C:\Program Files\PureBasic

Вот исходный текст программы на PureBasic

Code
#USB_PID=1
#USB_VID=$1234
Global W_DeviceHandle=0, R_DeviceHandle=0

; Работа с USB HID устройствами

Procedure FindDevice_Timer() ; Процедура вызывается по таймеру, каджие 200 мс.
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Проверка доступности HID устройства
  If Test<>Old_Test
  Old_Test=Test
  If Test  
  HID_Lib_CloseDevice(W_DeviceHandle) ; Освобождение хендлов, если таковые есть
  HID_Lib_CloseDevice(R_DeviceHandle)
  ; Получение идентификаторов HID устройства
  W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Хендл для записи
  R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Хендл для чтения
  SetGadgetText(1,"Подключено HID устройство")
  Else
  HID_Lib_CloseDevice(W_DeviceHandle) ; Освобождение хендлов, если таковые есть
  HID_Lib_CloseDevice(R_DeviceHandle)
  W_DeviceHandle=0 : R_DeviceHandle=0
  SetGadgetText(1,"Устройство не обнаруженно")
  SetGadgetText(5,"Нет")
  EndIf
  EndIf
EndProcedure

Procedure SendDevice(Command.u) ; Посылка данных HID устройству
  If W_DeviceHandle
  HID_Lib_WriteDevice(W_DeviceHandle, @Command,2)
  Else
  MessageRequester("", "Нет связи с устройством!", #MB_OK|#MB_ICONWARNING)
  EndIf
EndProcedure

Procedure Thread(*xx) ; Процедура работает в отдельном потоке и в ней выполняется приём данных
  Repeat
  If R_DeviceHandle
  In.u=0
  HID_Lib_ReadDevice(R_DeviceHandle, @In, 2) ; Приём данных от HID устройства
  Debug In
  In=In>>8
  If In=20
  SetGadgetText(5,"Да")
  ElseIf In=40
  SetGadgetText(5,"Нет")
  EndIf
  EndIf
  Delay(100)
  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,"Зажечь светодиод")
  ButtonGadget(3,170,70,120,24,"Погасить светодиод")
  TextGadget(4,50,40,98,16,"Кнопка нажата?")
  StringGadget(5,140,36,40,20,"Нет",1|#PB_String_ReadOnly)
FindDevice_Timer()
HideWindow(0,0)
SetTimer_(WindowID(0),1,200,@FindDevice_Timer()) ; Запуска таймера
CreateThread(@Thread(),0) ; Запуск процедуры в отдельном потоке

Repeat ; Главный цикл программы Repeat - Until
  Event=WaitWindowEvent() ; Идентификатор события
  If Event=#PB_Event_Gadget ; Событие в гаджете
  Select EventGadget()
  Case 2 ; Кнопка "Зажечь светодиод"
  SendDevice($AA00)
  Case 3 ; Кнопка "Погасить светодиод"
  SendDevice($5500)
  EndSelect
  EndIf
Until Event=#PB_Event_CloseWindow ; Событие закрытия окна

Окно программы.

В программе есть несколько процедур.
Процедура FindDevice_Timer(), вызывается по таймеру, каждые 200 миллисекунд и в ней проверяется доступность HID устройства с указанными PID и VID.
Процедура SendDevice() отсылает один байт HID устройству.
Процедура Thread() работает в отдельном потоке и в ней осуществляется приём данных от HID устройства.

Программа для микроконтроллера PIC18F4550 (HID устройства) разработана в среде MicroBasic на основе стандартного примера.

Code
program USB_HID_test

include "USBdsc"

dim
  k, i, ch, Button1 as byte
  userWR_buffer as byte[64]
  userRD_buffer as byte[64]

'******************************************************************************
' Main Interrupt Routine
'******************************************************************************
sub procedure interrupt
'** this is a way to call a procedure from interrupt
  HID_InterruptProc
end sub
'******************************************************************************

'******************************************************************************
' Initialization Routine
'******************************************************************************
sub procedure Init_Main
  '--------------------------------------
  ' Disable interrupts
  '--------------------------------------
  INTCON = 0 ' Disable GIE, PEIE, TMR0IE,INT0IE,RBIE
  INTCON2 = 0xF5
  INTCON3 = 0xC0
  RCON.IPEN = 0 ' Disable Priority Levels on interrupts
  PIE1 = 0
  PIE2 = 0
  PIR1 = 0
  PIR2 = 0

  ADCON1 = ADCON1 or 0x0F ' Configure all ports with analog function as digital
  '--------------------------------------
  ' Ports Configuration
  '--------------------------------------
  TRISA = 0xFF
  TRISB = 0xFE
  TRISC = 0xFF
  TRISD = 0
  TRISE = 0x07

  LATA = 0
  LATB = 0
  LATC = 0
  LATD = 0
  LATE = 0
end sub

'******************************************************************************
' Main Program Routine
'******************************************************************************

main:
  Init_Main()
  portb.0=1
  'delay_ms(1000)
' portb.0=0
' delay_ms(1000 )
' portb.0=1
   
  HID_Enable(@userRD_buffer, @userWR_buffer)
  Delay_mS(1000)
  Delay_mS(1000)
   

  while true
  k = HID_Read()
  i = 0
  while i < k
  ch = userRD_buffer[0]
  'userWR_buffer[0] = ch
   
  if ch = 0xAA then
  portb.0=1
  end if
  if ch = 0x55 then
  portb.0=0
  end if
   
  'HID_Write(@userWR_buffer, 1)
  inc(i)
  wend
  if Button1=0 then
  if porta.1=0 then
  delay_ms(50)
  if porta.1=0 then
  Button1=1
  userWR_buffer[0] = 20
  HID_Write(@userWR_buffer, 1)
  end if
  end if
  else
  IF porta.1=1 then
  delay_ms(50)
  if porta.1=1 then
  Button1=0
  userWR_buffer[0] = 40
  HID_Write(@userWR_buffer, 1)
  end if
  end if
  end if
   
   
  wend
  HID_Disable()
   
end.

Схема устройства и исходные тексты программ находятся в папке Examples архива HID_Lib_4.41.rar, ссылка на который, была дана выше.




Категория: Microbasic | Добавил: PB (01.04.2010)
Просмотров: 8648 | Комментарии: 1 | Теги: mikrobasic, PureBasic, HID, USB | Рейтинг: 5.0/3
Всего комментариев: 1
1 LeXaCH   (10.03.2012 08:36)
Пробывал повторить схему но уже в протоне, не получается принимать в пуре. Принимает только 0. Вот ссылочка на тему которую создал, может чем поможете http://www.picbasic.ru/forum/5-1081-1

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]