Главная » Статьи » Microbasic |
В данной статье рассказано о разработке приложения для Windows в среде PureBasic, для работы с USB HID устройствами. Компилятор можно найти здесь Для поддержки HID устройств, понадобится установить библиотеку Hid_Lib Она предназначена для версии 4.40 или 4.41 компилятора 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 ; Событие закрытия окна Окно программы. В программе есть несколько процедур. Программа для микроконтроллера 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, ссылка на который, была дана выше.
| |
Просмотров: 13304 | Комментарии: 1 | | |
Всего комментариев: 1 | ||
| ||