Verfasst: 28.05.2009 21:24
COMate ist doch von srod ... 

Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Das wäre zu schön um wahr zu sein, wenn es von mir wäreKaeru Gaman hat geschrieben:COMate ist doch von srod ...
Naja, als Programmierer würde man das doch etwas komfortabler gestalten, einfach diesen Callback hier verwenden und das Programm bekommt mitgeteilt, wenn der Adapter gesteckt/entfernt wird:H.Brill hat geschrieben:Hallo,
[...]
Beim Einstecken des Kabels in den USB Port sieht
man dann in der Systemsteuerung, welcher Com
Port angelegt wurde (bei mir immer COM5).
[...]
Code: Alles auswählen
#DBT_DEVICEARRIVAL = $8000
#DBT_DEVICEQUERYREMOVE = $8001
#DBT_DEVICEQUERYREMOVEFAILED = $8002
#DBT_DEVICEREMOVEPENDING = $8003
#DBT_DEVICEREMOVECOMPLETE = $8004
#DBT_DEVICETYPESPECIFIC = $8005
#DBT_DEVNODES_CHANGED = $0007
#DBT_QUERYCHANGECONFIG = $0017
#DBT_CONFIGCHANGED = $0018
#DBT_CONFIGCHANGECANCELED = $0019
#DBT_USERDEFINED = $FFFF
#DBT_DEVTYP_OEM = $0000
#DBT_DEVTYP_VOLUME = $0002
#DBT_DEVTYP_PORT = $0003
#DBT_DEVTYP_DEVICEINTERFACE = $0005
#DBT_DEVTYP_HANDLE = $0006
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Protected Result, a$, K
Protected *db.DEV_BROADCAST_HDR
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_DEVICECHANGE
If wParam = #DBT_DEVICEARRIVAL
*db = lParam
If *db\dbch_devicetype = #DBT_DEVTYP_PORT
a$ = PeekS(*db + SizeOf(DEV_BROADCAST_HDR))
K = Val(RemoveString(a$, "COM", #PB_String_NoCase))
Debug "COM-Port " + Str(K) + " eingesteckt"
EndIf
ElseIf wParam = #DBT_DEVICEREMOVECOMPLETE
*db = lParam
If *db\dbch_devicetype = #DBT_DEVTYP_PORT
a$ = PeekS(*db + SizeOf(DEV_BROADCAST_HDR))
K = Val(RemoveString(a$, "COM", #PB_String_NoCase))
Debug "COM-Port " + Str(K) + " ausgesteckt"
EndIf
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
Code: Alles auswählen
Proc Senden
' 4 Byte - Rahmen zum Senden erstellen
Pruefsumme% = XOR(XOR(kommando%, adresse%), daten%)
send$ = Chr$(kommando%) + Chr$(adresse%) + Chr$(daten%) + Chr$(Pruefsumme%)
WriteCom(f%, send$)
ComError(f%)
GetComInput(f%)
Sleep 1000
EndProc
Code: Alles auswählen
Global comPort.l, comID.l, Daten.i, Adresse.i, Pruefsumme.i, Kommando.i, Send.s
Macro TestBit(value,bit)
(value>>bit&1)
EndMacro
Macro SetBit(value,bit)
(1 << bit | value)
EndMacro
Macro ClrBit(value,bit)
(~(1 << bit) & value)
EndMacro
Daten = 0
Kommando = 1
Adresse = 1
Procedure Senden()
Dim Buffer.b(4)
Send = Space(4)
Pruefsumme = (Kommando XOr Adresse) XOr Daten
Send = Chr(Kommando) + Chr(Adresse) + Chr(Daten) + Chr(Pruefsumme)
Buffer(0) = Kommando
Buffer(1) = Adresse
Buffer(2) = Daten
Buffer(3) = Pruefsumme
WriteSerialPortData(comID, @Send, 4)
EndProcedure
If OpenWindow(0, 10, 10, 400, 400, "Schalt - Relais", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(1,5, 10,100, 20, "Ende")
ButtonGadget(2,120, 10, 100, 20, "Setze")
CheckBoxGadget(10, 120, 100, 100, 20, "Relais 1")
CheckBoxGadget(11, 120, 130, 100, 20, "Relais 2")
CheckBoxGadget(12, 120, 160, 100, 20, "Relais 3")
CheckBoxGadget(13, 120, 190, 100, 20, "Relais 4")
CheckBoxGadget(14, 120, 220, 100, 20, "Relais 5")
CheckBoxGadget(15, 120, 250, 100, 20, "Relais 6")
CheckBoxGadget(16, 120, 280, 100, 20, "Relais 7")
CheckBoxGadget(17, 120, 310, 100, 20, "Relais 8")
Quit = 0
comID = OpenSerialPort(#PB_Any, "COM5", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
If comID And IsSerialPort(comID)
Senden()
MessageRequester("Info", "COM5: verfügbar !", 0)
Else
MessageRequester("Fehler", "COM5: NICHT verfügbar !", 0)
End
EndIf
Repeat
; Hier kommt die Event - Schleife
EventID.l = WaitWindowEvent()
; Event abwarten und auswerten
Select EventID
Case #PB_Event_CloseWindow
; X im rechts oben für Schließen gedrückt.
Quit = 1
Case #PB_Event_Gadget ; Event für Gadgets
Select EventGadget()
Case 1
; Ende - Button gedrückt
Quit = 1
Case 2
; Setzen - Button gedrückt
If GetGadgetState(10) = 1
Daten = SetBit(Daten, 0)
Else
Daten = ClrBit(Daten, 0)
EndIf
If GetGadgetState(11) = 1
Daten = SetBit(Daten, 1)
Else
Daten = ClrBit(Daten, 1)
EndIf
If GetGadgetState(12) = 1
Daten = SetBit(Daten, 2)
Else
Daten = ClrBit(Daten, 2)
EndIf
If GetGadgetState(13) = 1
Daten = SetBit(Daten, 3)
Else
Daten = ClrBit(Daten, 3)
EndIf
If GetGadgetState(14) = 1
Daten = SetBit(Daten, 4)
Else
Daten = ClrBit(Daten, 4)
EndIf
If GetGadgetState(15) = 1
Daten = SetBit(Daten, 5)
Else
Daten = ClrBit(Daten, 5)
EndIf
If GetGadgetState(16) = 1
Daten = SetBit(Daten, 6)
Else
Daten = ClrBit(Daten, 6)
EndIf
If GetGadgetState(17) = 1
Daten = SetBit(Daten, 7)
Else
Daten = ClrBit(Daten, 7)
EndIf
Kommando = 3
Adresse = 1
Senden()
EndSelect
EndSelect
Until Quit = 1
EndIf
CloseSerialPort(comID)
End
nope!H.Brill hat geschrieben:Stimmt das so mit der XOR-Verknüpfung ?Code: Alles auswählen
Pruefsumme = (Kommando XOr Adresse) XOr Daten
Code: Alles auswählen
(value >> bit And 1)
Code: Alles auswählen
(1 << bit Or value)