PB 4.02 und USB-Ansteuerung (offen/geschlossen)

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

COMate ist doch von srod ... :?:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

Kaeru Gaman hat geschrieben:COMate ist doch von srod ... :?:
Das wäre zu schön um wahr zu sein, wenn es von mir wäre :lol:

Das Einzigste, was ich damit gemacht habe, ist was für viele
Excelfunktionen, wovon leider kein große feedback zurück kam.

Nee, das war die MVCOM (Nicht von mir), die er meinte, die ich nur für
meine Projekte gebraucht habe. Übrigens, die USB2RS232, welche die
einfachste Lösung ist und ebenfalls für einen Lau bei www.pollin.de zu
erhalten ist, lässt sich genauso wie die Serielle Schnittstelle über virtuelle
COM-Ports nutzen, die bei neueren OS automatisch installiert werden. Bei
Win9x ist aber meistens eine CD dabei.

Hier nochmal zur Erinnerung mein alter Thread dazu:

http://www.purebasic.fr/german/viewtopi ... 581#187581

http://www.purebasic.fr/german/viewtopi ... 773#187773

Mit dem aktuellen PB ist leider die MVCOM überflüssig geworden, weil
man damit direkt Funktionen für "Serial Port" enthalten hat.

Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo,
Also das mit den USB->Seriell Konvertern kann
ich bestätigen. Hab da ein Vivanco Kabel und
die 8-fach Relaiskarte von Conrad. Den Treiber,
der dem Kabel beiliegt, installieren und gut ist.
Beim Einstecken des Kabels in den USB Port sieht
man dann in der Systemsteuerung, welcher Com
Port angelegt wurde (bei mir immer COM5).

Mein Programm hatte ich zwar damals in XProfan
geschrieben, denke aber, daß es mit den nativen
SerialPort - Befehlen von PB 4.30 genauso gut geht.
PB 5.60
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

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).
[...]
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:

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
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallole und Danke an alle für die Beiträge.
Ich werde mir dann erst mal einen USB<=>COM Adapter besorgen. Dann es mal mit der MVCOM-Lib versuchen. Ich habe ja 2 Aufgaben:
1.) Aus Excel Werte auslesen ( wo ich den DispHepler verwende - was schon fertig ist und in Anwendung, aber eben nicht in PB 4.30 funktoniert )
2.) Eine Erweiterung: Bei einem bestimmtem Ereignis in der Exceltabelle das nicht nur auf dem Bldschirm, sondern auch noch ausserhalb mit einer Lampe darstellen ( als Warnhinweis )
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Seit PB4.2(?) brauchst du keine MVCOM-Lib mehr, das kann PB mittlerweile selbst.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

>>> 1.) Aus Excel Werte auslesen ( wo ich den DispHepler verwende - was
>>>schon fertig ist und in Anwendung, aber eben nicht in PB 4.30 funktoniert )

Zu PB 4.3 und Excelfunktionen, da hätte ich noch einen Tip. Somit könnte man
die Excelfunktionen als auch die eigenen SerielPort - Funktionen nutzen.

http://www.purebasic.fr/german/viewtopi ... 466#239466

Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo,
Ich will mal die Conrad Relais Karte mit PB
ansteuern, komme aber irgendwie nicht weiter.
Die Schnittstellenparameter stimmen soweit.
Habs auch schon mit versch. Variablentypen usw.
probiert.
In XProfan sieht das so aus :

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
Ausprobieren ist zwar für euch nicht möglich, aber vielleicht sieht
ja jemand meinen Fehler. Stimmt das so mit der XOR-Verknüpfung ?

Hier mal der Code :

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
PB 5.60
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

H.Brill hat geschrieben:Stimmt das so mit der XOR-Verknüpfung ?

Code: Alles auswählen

Pruefsumme = (Kommando XOr Adresse) XOr Daten
nope!

du musst schon eine bitweise Verknüpfung benutzen, keine logische.

du schreibst ja auch nicht

Code: Alles auswählen

(value >> bit And 1) 
oder

Code: Alles auswählen

(1 << bit Or value) 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

Genauer gesagt, das "XOR" durch ein "!" ersetzen
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Antworten