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)