serielle Schnittstelle auslesen

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

serielle Schnittstelle auslesen

Beitrag von exit »

Hallo!

Ich möchte eine RS232-Verbindung zu einem Zähler herstellen. Befehle wie Zählerreset gehen schon.

Wie lese ich die Daten mit Version PB4.2 aus? Oder wo stehen diese zum Abholen bereit?
Über AvailableSerialPortInput sehe ich, dass Daten vorhanden sind.

Sind sie im *Puffer und wie komme ich daran?

Code: Alles auswählen

daten_vorhanden = AvailableSerialPortInput(2) ;gibt die Anzahl vorhandener Bytes im Eingangspuffer zurück

If daten_vorhanden > 0

Daten_Zaehler = ReadSerialPortData(2, *Puffer, Laenge)


EndIf
Im Codearchiv sind leider nur Beispiele älterer PB-Versionen.
- Windows 10
- PureBasic 5.62
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wenn die Daten als String vorhanden sind, dann:

Code: Alles auswählen

daten.s = PeekS(*puffer, daten_zaehler)
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@exit
es kommt drauf an, ob Dein Zähler von selbst Daten sendet oder diese erst sendet wenn er einen Befehl erhalten hat.
Gibt es eine Anleitung zu dem Zähler? Unter Umständen kann man das dort nachlesen.
Ich selbst schreibe an einem Programm, mit dem man Thermostate (Kühl.- bzw. Heizaggregate) für Reaktoren (Chemie) steuert/überwacht. Diese senden in der Regel erst irgendwelche Werte, wenn sie einen Befehl erhaten haben. Dabei muß ich drauf achten, daß ich die Befehle nicht zu schnell hintereinander los schicke, weil man die Werte sonst nicht in der richtigen Reihenfolge erhält oder sogar nicht alle übertragen werden.
Eine Art Query-Planner soll die Ausführung von Map/Reduce-Funktionen in Hadoop stark beschleunigen.
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

Beitrag von exit »

Vielen Dank erstmal für die Antworten.

- Ja es ist eine Beschreibung vorhanden in der steht welche Zeichen man senden muss um Daten zu erhalten. Auch diesem Wege kann ich auch schon den Zählerstand auf 0 setzen.

- Ich denke, dass die Antwort von mk-soft meiner Frage am nächsten kommt.

Wenn es nicht klappt nerve ich an dieser Stelle weiter.
- Windows 10
- PureBasic 5.62
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 »

exit hat geschrieben:...Wenn es nicht klappt nerve ich an dieser Stelle weiter.
Du darfst auch ruhig hier weiter nerven :lol:
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

Beitrag von exit »

So funktioniert es!

Danke für die Hilfe :allright:

Code: Alles auswählen

;Abfrage Zählerstand im Zeittakt senden
If COMFehler = 0                                                ;Durchlauf NUR wenn ComPort ohne Fehler geöffnet wurde
  Wait_RSR232 = Wait_RSR232 + 1                                 ;Abfragezyklus 
  If Wait_RSR232 > 50                                           ;Abfragezyklus einstellen und starten
    WriteSerialPortString(ComPort_Nr, STX$)                     ;Startzeichen senden
    WriteSerialPortString(ComPort_Nr, "0001")                   ;00 01 Zähleradresse und Auslesebefehl senden
    WriteSerialPortString(ComPort_Nr, ETX$)                     ;Endezeichen senden
  Wait_RSR232 = 0                                               ;Reset Abfragezyklus
  EndIf


  Bytes_im_Puffer = AvailableSerialPortInput(ComPort_Nr)        ;liegen Daten vor?
  If Bytes_im_Puffer > 0                                        ;dann Daten auslesen
    laenge.s =  Space(14)                                       ;Längenstring erstellen  
                               
    ReadSerialPortData(ComPort_Nr, @laenge,14)                  ;akt. Länge (14 byte) aus dem Zähler auslesen
  
    laengenstring$ = laenge.s 
    laenge$ = Mid(laengenstring$, 8,5)                          ;Länge herausfiltern

    SetGadgetText(#akt_Laenge, laenge$)                         ;Länge anzeigen 

  EndIf
EndIf
- Windows 10
- PureBasic 5.62
Antworten