ich habe gerade meine Project mit einem USB-HDI Interface unter Windows abgeschlossen. Mit diesem Quellcode sollte es daher möglich sein auch andere HDI Interface (z.B. X10 Fernsteuerung) auszulesen.
Gruß
MPZ
Code: Alles auswählen
; "USB HID Controll.pb"
;
; PowerBasic Example um ein HID Gerät anzusteuern.
; funktioniert z.B. mit einem PIC Controller PIC 18F2550 mit USB Schnittstelle
; Wer es wissen will: Der PIC 18F2550 hat z.b. 24x I/O´s und 10x 10bit AD´s
;
; Version 1.00 by MPZ Okt.2006
; for PB 4.00
;
; benötigt wird die mcHID.dll von der Firma Mecanique. Die mcHID Library ist
; Bestandteil der EasyHID Software:
; http://www.mecanique.co.uk/software/EasyHID.zip
;
; Ein direkter Download der DLL ist über den folgenden Link möglich
; http://www.docpro.com.br/arquivos/mcHID.zip
;
Enumeration
#Window_0
#Listview_0
#Text_0
#Text_1
#Button_0
#Button_1
#Button_2
EndEnumeration
;{/ Globale Variablen
Global pVendorID.l, pProductID.l, pIndex.l, DeviceHandle.l
Global VendorName.s, ProductName.s, GetSerialNumber.s
Global USB_HID.l
Global Dim BufferIn.b(8),Dim BufferOut.b(8)
Global NewList SelectList.s()
#WM_APP = 32768
#WM_HID_EVENT = #WM_APP + 200
#NOTIFY_PLUGGED = 1
#NOTIFY_UNPLUGGED = 2
#NOTIFY_CHANGED = 3
#NOTIFY_READ = 4
#VendorID = 6017 ; Herstellernummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
#ProductID = 2000 ; Produktnummer eines bestimmten Gerätes = mein programmierter PIC 18F2550
; Damit läßt sich der DeviceHandle eines bestimmten HIDs leicht bestimmen
; DeviceHandle = hidGetHandle(#VendorID, #ProductID)
VendorName.s = Space(256)
ProductName.s = Space(256)
GetSerialNumber.s = Space(256)
;}
Procedure Open_Window_0()
If OpenWindow(#Window_0, 321, 133, 258, 259, "HID Empfang", #PB_Window_SystemMenu | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
ListViewGadget(#Listview_0, 10, 30, 240, 170)
TextGadget(#Text_0, 10, 8, 240, 20, "Daten empfangen", #PB_Text_Center)
TextGadget(#Text_1, 10, 203, 240, 14, "Daten senden", #PB_Text_Center)
ButtonGadget(#Button_0, 10, 220, 60, 30, "Senden 1")
ButtonGadget(#Button_1, 100, 220, 60, 30, "Senden 2")
ButtonGadget(#Button_2, 190, 220, 60, 30, "Senden 3")
EndIf
ProcedureReturn = 1
EndIf
EndProcedure
;{/ DLL Datei Aufrufen
Prototype hidConnect (pHostWin.l); As Boolean
Prototype hidDisconnect (); As Boolean
Prototype hidRead (pHandle.l, pData.b); As Boolean
Prototype hidWrite (pHandle.l, pData.b); As Boolean
Prototype hidReadEx (pVendorID.l, pProductID.l, pData.b); As Boolean
Prototype hidWriteEx (pVendorID.l, pProductID.l, ByRef.b); As Boolean
Prototype hidGetVendorName (pHandle.l, pText.s, pLen.l); As Long
Prototype hidGetProductName (pHandle.l, pText.s, pLen.l); As Long
Prototype hidGetSerialNumber (pHandle.l, pText.s, pLen.l); As Long
Prototype hidGetVendorID (pHandle.l); As Long
Prototype hidGetProductID (pHandle.l); As Long
Prototype hidGetVersion (pHandle.l); As Long
Prototype hidGetInputReportLength (pHandle.l); As Long
Prototype hidGetOutputReportLength (pHandle.l); As Long
Prototype hidGetHandle (pVendoID.l, pProductID.l); As Long
Prototype hidGetItem (pIndex.l); As Long
Prototype hidGetItemCount (); As Long
Prototype hidSetReadNotify (pHandle.l, pValue.b);
Prototype hidIsReadNotifyEnabled (pHandle.l); As Boolean
Prototype hidIsAvailable (pVendorID.l, pProductID.l); As Boolean
Define mcHID_DLL.l = OpenLibrary(#PB_Any, "mcHID.dll")
If mcHID_DLL
Global hidConnect.hidConnect = GetFunction(mcHID_dll,"Connect") ; (ByVal pHostWin As Long) As Boolean
Global hidDisconnect.hidDisconnect = GetFunction(mcHID_dll,"Disconnect"); () As Boolean
Global hidRead.hidRead = GetFunction(mcHID_dll,"Read"); (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
Global hidWrite.hidWrite = GetFunction(mcHID_dll,"Write"); (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
Global hidReadEx.hidReadEx = GetFunction(mcHID_dll,"ReadEx"); (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Global hidWriteEx.hidWriteEx = GetFunction(mcHID_dll,"WriteEx"); (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Global hidGetVendorName.hidGetVendorName = GetFunction(mcHID_dll,"GetVendorName"); (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Global hidGetProductName.hidGetProductName = GetFunction(mcHID_dll,"GetProductName"); (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Global hidGetSerialNumber.hidGetSerialNumber = GetFunction(mcHID_dll,"GetSerialNumber"); (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Global hidGetVendorID.hidGetVendorID = GetFunction(mcHID_dll,"GetVendorID"); (ByVal pHandle As Long) As Long
Global hidGetProductid.hidGetProductid = GetFunction(mcHID_dll,"GetProductID"); (ByVal pHandle As Long) As Long
Global hidGetVersion.hidGetVersion = GetFunction(mcHID_dll,"GetVersion"); (ByVal pHandle As Long) As Long
Global hidGetInputReportLength.hidGetInputReportLength = GetFunction(mcHID_dll,"GetInputReportLength"); (ByVal pHandle As Long) As Long
Global hidGetOutputReportLength.hidGetOutputReportLength = GetFunction(mcHID_dll,"GetOutputReportLength"); (ByVal pHandle As Long) As Long
Global hidGetHandle.hidGetHandle = GetFunction(mcHID_dll,"GetHandle"); (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
Global hidGetItem.hidGetItem = GetFunction(mcHID_dll,"GetItem"); (ByVal pIndex As Long) As Long
Global hidGetItemCount.hidGetItemCount = GetFunction(mcHID_dll,"GetItemCount"); (ByVal pIndex As Long) As Long
Global hidSetReadNotify.hidSetReadNotify = GetFunction(mcHID_dll,"SetReadNotify"); ByVal pHandle As Long, ByVal pValue As Boolean)
Global hidIsReadNotifyEnabled.hidIsReadNotifyEnabled = GetFunction(mcHID_dll,"IsReadNotifyEnabled"); (ByVal pHandle As Long) As Boolean
Global hidIsAvailable.hidIsAvailable = GetFunction(mcHID_dll,"IsAvailable"); (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
Else
MessageRequester("Fehlermeldung", "Das Programm konnte die mcHID.dll Datei nicht öffnen", #PB_MessageRequester_Ok)
End
EndIf
;}
ProcedureDLL mcHID_Free(); DLL freigeben
If mcHID_DLL
CloseLibrary(#PB_Any)
EndIf
XLTable_DLL = 0
EndProcedure
Procedure Selectrequester (Selectbox.s,Selecttext.s,Mylist.s())
Enumeration 100 ; bei vielen Fenster und Event Wert erhöhen
#Window_Selectbox
#Text_Selectbox
#Listview_Selectbox
#Button_Selectbox0
#Button_Selectbox1
EndEnumeration
Return_Selectbox.l = -1 ; Fehlerwert = -1
If CountList(Mylist()) < 1
ProcedureReturn = Return_Selectbox
EndIf
If OpenWindow(#Window_Selectbox,0,0, 305, 138, Selectbox.s, #PB_Window_SystemMenu | #PB_Window_TitleBar| #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#Window_Selectbox))
TextGadget(#Text_Selectbox, 20, 10, 150, 14, Selecttext.s)
ListViewGadget(#Listview_Selectbox, 10, 30, 210, 100)
ButtonGadget(#Button_Selectbox0, 230, 70, 70, 23, "Wählen")
ButtonGadget(#Button_Selectbox1, 230, 107, 70, 23, "Abbrechen")
EndIf
EndIf
FirstElement(Mylist())
For a = 1 To CountList(Mylist())
AddGadgetItem (#Listview_Selectbox, -1, Mylist()) ; definieren des Listview-Inhalts
NextElement(Mylist())
Next
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
GadgetID = EventGadget() ; Is it a gadget event?
If Event = #PB_Event_Gadget
If GadgetID = #Button_Selectbox0
Event = #PB_Event_CloseWindow
Return_Selectbox = GetGadgetState(#Listview_Selectbox)
ElseIf GadgetID = #Button_Selectbox1
Event = #PB_Event_CloseWindow
EndIf
EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop
CloseWindow(#Window_Selectbox)
ProcedureReturn = Return_Selectbox
EndProcedure
;- Window Callback
Procedure WinProc(hWnd,Msg,wParam,lParam)
result = #PB_ProcessPureBasicEvents
If Msg = #WM_HID_EVENT
Select wParam
; HID device has been plugged message...
Case #NOTIFY_PLUGGED
;HID device has been plugged
AddGadgetItem(#Listview_0,0, "#NOTIFY_PLUGGED")
Case #NOTIFY_UNPLUGGED
;HID device has been unplugged
AddGadgetItem(#Listview_0,0, "#NOTIFY_UNPLUGGED")
Case #NOTIFY_CHANGED
;HID device has been changed
AddGadgetItem(#Listview_0,0, "#NOTIFY_CHANGED")
If hidGetItemCount() > 0
ClearList(SelectList())
For a = 0 To hidGetItemCount()
Devicetemp.l = hidGetItem(a)
hidGetProductName (Devicetemp,ProductName,256)
AddElement(SelectList())
SelectList() = ProductName
Next
USB_HID = Selectrequester ("HID Gerät wählen","HID Geräte:",SelectList())
If USB_HID > -1
DeviceHandle = hidGetItem(USB_HID)
hidGetProductName (DeviceHandle.l,ProductName,256)
AddGadgetItem(#Listview_0,0, "hidGetProductName = "+ProductName)
AddGadgetItem(#Listview_0,0, "hidGetVendorID = "+ Str(hidGetVendorID (DeviceHandle.l)))
AddGadgetItem(#Listview_0,0, "hidGetProductID = " + Str(hidGetProductID(DeviceHandle.l)))
AddGadgetItem(#Listview_0,0, "Input Datenlänge in Bytes = "+Str(hidGetInputReportLength (DeviceHandle.l)))
AddGadgetItem(#Listview_0,0, "Output Datenlänge in Bytes = "+Str(hidGetOutputReportLength (DeviceHandle.l)))
hidSetReadNotify (DeviceHandle, #True) ;read event...
EndIf
EndIf
;DeviceHandle = hidGetHandle(#VendorID, #ProductID)
;hidSetReadNotify (DeviceHandle, #True) ! IMPORTANT ! Read works only With this flag
Case #NOTIFY_READ
; READ works only if the hidSetReadNotify flag is set
AddGadgetItem(#Listview_0,0, "#NOTIFY_READ")
If hidRead(DeviceHandle, @BufferIn(0))
AddGadgetItem(#Listview_0,0, "Read: "+Str(BufferIn(0)) +"/"+ Str(BufferIn(1))+"/"+Str(BufferIn(2))+"/"+Str(BufferIn(3))+"/"+Str(BufferIn(4))+"/"+Str(BufferIn(5))+"/"+Str(BufferIn(6))+"/"+Str(BufferIn(7))+"/"+Str(BufferIn(8)))
Else
AddGadgetItem(#Listview_0,0, "Read fehlerhaft!")
EndIf
EndSelect
EndIf
ProcedureReturn result
EndProcedure
;{/ Main Unit
If Open_Window_0()
hidconnect (WindowID(#Window_0))
SetWindowCallback(@WinProc())
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_0
AddGadgetItem(#Listview_0,0, "Senden 1 angeklickt!")
; Anzahl der BufferOut ist abhängig vom HID Gerät
BufferOut(0) = 0 ; Muß immer Null sein!
BufferOut(1) = 1
BufferOut(2) = 2
BufferOut(3) = 3
BufferOut(4) = 4
BufferOut(5) = 5
BufferOut(6) = 6
BufferOut(7) = 7
BufferOut(8) = 8
hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
Case #Button_1 : AddGadgetItem(#Listview_0,0, "Senden 2 angeklickt!")
; Anzahl der BufferOut ist abhängig vom HID Gerät
BufferOut(0) = 0; Muß immer Null sein!
BufferOut(1) = 2
BufferOut(2) = 3
BufferOut(3) = 4
BufferOut(4) = 5
BufferOut(5) = 6
BufferOut(6) = 7
BufferOut(7) = 8
BufferOut(8) = 9
hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
Case #Button_2 : AddGadgetItem(#Listview_0,0, "Senden 3 angeklickt!")
; Anzahl der BufferOut ist abhängig vom HID Gerät
BufferOut(0) = 0; Muß immer Null sein!
BufferOut(1) = 3
BufferOut(2) = 4
BufferOut(3) = 5
BufferOut(4) = 6
BufferOut(5) = 7
BufferOut(6) = 8
BufferOut(7) = 9
BufferOut(8) = 10
hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
hidDisconnect ()
mcHID_Free()
EndIf
;}