Temperaturdaten über COM1: einlesen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Temperaturdaten über COM1: einlesen...

Beitrag von Ghosty1967 »

Hallo Leute...
Wir haben uns für die Temperaturüberwachung ein Thermometer zugelegt, welches auch über eine serielle Schnittstelle verfügt.
Nun habe ich versucht in PB4.2 mit Hilfe der MVCOM Lib dieses Thermometer auszulesen. Ich komme da aber bei besten Willen nicht weiter.
Der Hersteller hat nur eine kurze Beschreibung der Schnittstelle beigelegt und ein Beispiel in TurboPascal.
Könnte mir jemand helfen, einen funktionierenden PBCode zu erstellen?


Hier mal der Auszug des Herstellers:
______________________________________________________________________________________________
Schnittstellenprotokoll
Bei der Datenübertragung muss sichergestellt sein, daß die Spannungspegel für die Signale RTS=+12V und DTR=-12V vom PC
zur Verfügung gestellt werden. Dies muß über die Schnittstelleninitialisierung der Software realisiert werden.

Parameter: Baudrate=2400, Datenbits=8, Stopbits=2: Parität=None
Zur Übertragung der Meßwerte müssen nachfolgende Anforderungen an das Meßgerät gesendet werden. Nachfolgende Tabelle
veranschaulicht, welche Werte über die Schnittstelle abgefragt werden können.
MESSWERT 1+2 autom. erkennen = FC(hex), Tastaturfreigabe = 0(hex)
Hinweis:
Wenn mit dem Befehl FC(hex) Daten aus dem Gerät ausgelesen werden, so wird dessen Tastatur gesperrt.
Diese kann mit dem Befehl 0(hex) wieder freigegeben werden.

Die Daten werden im nachfolgenden Format vom Gerät gesendet.
Datentyp = String (Die Stringlänge ist geräteabhänging (1/2 Kanal))
Messwert 1=Zeichen 01-07 - Einheit 1=Zeichen 09-10
Messwert 2=Zeichen 15-21 - Einheit 1=Zeichen 23-24
Zeichen 25=LF - Zeichen 26=CR

Beispiel. Turbo Pascal Quell-Code zur Schnittstelleninitialisierung

PROCEDURE V24oeffnen(com1,com2:Boolean); {RS232 initialisieren}
VAR wert :Byte
BEGIN
IF com1 THEN BEGIN
PORT[$3FB]:=128; {Baudeingabe aktivieren}
PORT[$3F8]:=48; {Baudrate - LSB, 2400 Baud}
PORT[$3F9]:=0; {Baudrate - MSB}
PORT[$3FB]:=7; {8 Bits, No Parity, 2 Stop}
PORT[$3FC]:=2; {DTR=0, RTS=1}
Wert:=PORT[$3F8]:=0; {Empfangsregister leeren}
END;
END;
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Hat sich erledigt... Dnake :wink:
Benutzeravatar
Falko
Admin
Beiträge: 3535
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.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

So wie ich das mit dem Pascalprogramm lese wird nur die COM-Schnittstelle
mittels Portbefehle (inpout32.dll) initialisiert. Also eingestellt und der Puffer
gelöscht.

PB 4.2 hat aber eigene Befehle für die RS232, die man nun nutzen kann.

Wenn ich das richtig gelesen habe musst du erst zum Gerät ein FC(Hex) = 252(Dec) senden.
Damit wird dessen Tastatur gesperrt und die Daten von
ihm zu deinen PC gesendet.
Danach kann man die Daten solange auslesen, bis man dem Gerät ein 0(HEX) sendet

Leider kann ich das nicht ausprobieren. Aber du könntest ja versuchen
anhand der PB-Hilfe und dieser kleinen Sourcestütze das korrekt für deine Hardware umzusetzen. (Source nicht geprüft!)

Code: Alles auswählen

OpenWindow(0,0,0,100,100,"ReadThermo")
If OpenSerialPort(0, "COM1", 2400, #PB_SerialPort_EvenParity, 8, 2, #PB_SerialPort_NoHandshake, 1024, 1024)
   Debug "Success"
Else
   Debug "Failed"
EndIf

PokeB(*Buffer.l,252);entspricht FC(Hex)
WriteSerialPortData(0,@Buffer,1); Tastatur sperren und Werte ausgeben

Repeat
Puffer.l=0
While AvailableSerialPortInput(0) > 0 
  If ReadSerialPortData(0, @Puffer, 2)
     text.s=text+PeekS(@Puffer,2)
     If PeekS(@Puffer+1,2)=Chr(Asc(#CR$)) And PeekS(@Puffer+2,2)=Chr(Asc(#LF$));Ist ein Enter und ein Linefeed erfolgt
     Debug text
     Puffer=0
     text=""
     EndIf
  EndIf   

Wend

Until WaitWindowEvent()=#PB_Event_CloseWindow
PokeB(*Buffer.l,0); entspricht 0
WriteSerialPortData(0,@Buffer,1); Tastatur freigeben und keine Werte ausgeben
CloseSerialPort(0)
CloseFile(0)
CloseWindow(0)
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Dank, für Deine Hilfestellung....

Ich habe es gestern schon geknackt. Das blöde war, das ich keine weiteren Infos über die Konfiguration der RS232 hatte.
Der Handshake stimmte nicht und das ganze Ding ist ziemlich Zeitkritisch!

Thx... :allright:
Benutzeravatar
Falko
Admin
Beiträge: 3535
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.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Hauptsache es funktioniert :allright:

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten