![]() |
TComPort - RS232 Ausgabe in Memo
Hallo alle zusammen,
ich habe hier eine ganz einfache Anwendung, mit der ich Befehle über RS232 zu einem Gerät sende. Das funktioniert wunderbar. Hier die Codeschnipsel (wirklich sehr sehr einfach gehalten):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin Form1.ComPort1.Port:='COM1'; Form1.ComPort1.BaudRate:=br9600; Form1.ComPort1.DataBits:=dbEight; Form1.ComPort1.Parity.Bits:=prNone; Form1.ComPort1.StopBits:=sbOneStopBit; Form1.ComPort1.FlowControl.FlowControl:=fcNone; Form1.ComPort1.Connected:=true; // Verbidnung herstellen end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.ComPort1.Connected:=false; // Verbidnung trennen end;
Delphi-Quellcode:
procedure TForm1.ComPort1AfterClose(Sender: TObject);
begin Form1.Label13.Caption:='Status: Nicht Verbunden'; // Status "Nicht Verbunden" anzeigen end; procedure TForm1.ComPort1AfterOpen(Sender: TObject); begin Form1.Label13.Caption:='Status: Verbunden'; // Status "Verbunden" anzeigen end;
Delphi-Quellcode:
Nun würde ich gern in einem Memo die Live-Anzeige der Konsole darstellen. Ich will also die Befehle und dessen Ergebnisse sehen. Sende ich Befehl1, bekomme ich auf der Konsole Ergebnis1 dargestellt. Nur wie bekomme ich das in ein Memo?
procedure TForm1.Button3Click(Sender: TObject);
var Befehl1:string; // Befehl vom Typ string begin // Wenn die Verbindung hergestellt ist, dann Befehl senden if Form1.ComPort1.Connected=true then begin Befehl1:='ich bin ein Befehl' + #13; Form1.ComPort1.WriteStr(Befehl1); end; Ich habe da leider gar keine Idee. Habt Ihr da Hinweise für mich? Vielen Dank im Voraus. Grüße |
AW: TComPort - RS232 Ausgabe in Memo
|
AW: TComPort - RS232 Ausgabe in Memo
Welche Konsole meinst du ?
und :
Delphi-Quellcode:
if Form1.ComPort1.Connected=true then begin
Befehl1:='ich bin ein Befehl' + #13; ![]() |
AW: TComPort - RS232 Ausgabe in Memo
Das "Form1" gehört da auch nicht hin, entweder durch "self" ersetzen oder ganz weglassen.
|
AW: TComPort - RS232 Ausgabe in Memo
Meine Routine sieht dafür folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // <-- Im ObjektInspektor von ComPort1 das Ereignis OnRxChar zuweisen
var i : integer; r_buff : array[0..1024] of Char; bCR : boolean; begin bCR := False; ComPort1.Read(r_buff,SizeOf(r_buff)); for i := 1 to Count do begin if r_Buff[i-1] > #13 then sReceive := sReceive+ r_Buff[i-1] else case r_Buff[i-1] of #13: bCR := True; end; end; if length(sReceive) > 250 then bCR := True; if bCR then begin Memo1.Lines.Insert(0, 'Empfange: ' + sReceive); end; end; |
AW: TComPort - RS232 Ausgabe in Memo
Zitat:
Zitat:
Danke Euch schonmal für die Antworten. Ich werde dann mal weiter lesen. Ich bin dann gestern auch noch auf die RxChar Funktion gekommen, aber mein Versuch war nicht so toll ;) Meine Kenntnisse sind auf dem Gebiet nicht sehr umfangreich.
Delphi-Quellcode:
Procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var Ausgabe:string; // Variable vom Typ String begin Form1.ComPort1.ReadStr(Ausgabe, Count); Form1.Memo1.Text:=Ausgabe; end; |
AW: TComPort - RS232 Ausgabe in Memo
Zitat:
|
AW: TComPort - RS232 Ausgabe in Memo
Und das andere Extrembeispiel:
Man lässt die Klasse zwei mal erzeugen, dann greifen die Methoden beider Instanzen auf die Form1-Variable zu. - Entweder die erste Instanz greift ständig auf die falschen Komponenten drauf su, nämlich auf die der zweiten Instanz, welche zufällig in der Variable verlinkt ist, weil ihr Zeiger als Letztes dort reingeschrieben wurde, anstatt auf ihre Eigenen (Self). - Oder es knallt, weil man beim dynamischen Erzeugen diese Variable nicht verwendet/gesetzt hat. (siehe DeddyH) Gibt der Leerrer denn noch Unterricht? Dieses TComport hat noch andere Events, bzw. eine Weitere Klasse, welche einem komplette Strings liefern kann. z.B. beginnend bei einem definierten Startzeichen, aber vorallem endend mit einem bestimmten Stopzeichen, ohne daß man das selber machen behandeln muß. OnRxChar wird nicht unbedingt am ende der Zeile/Message ausgelöst, womit die empfangenen Zeichen noch unvollständig seie können.
Delphi-Quellcode:
ComPort1.ReadStr(Ausgabe, Count);
Memo1.Text := Memo1.Text + Ausgabe; |
AW: TComPort - RS232 Ausgabe in Memo
Das sag ich doch, nur mit anderen Worten :roll:
|
AW: TComPort - RS232 Ausgabe in Memo
Ich seh schon... :shock: Aber er unterrichtet natürlich noch im Fach Informatik. Vielleicht habe ich es aber auch nur falsch aufgefasst. Es ist doch schon so lange her :oops:
Nun zu der Ausgabe.
Delphi-Quellcode:
Es funktioniert grundsätzlich über die RxChar. Die Ausgabe in das Memo kann man ja noch auf anderen Wegen machen.
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var Ausgabe:String; // Variable vom Typ String begin ComPort1.ReadStr(Ausgabe, 80); Memo1.Lines.Add(Ausgabe); end; Der Fehler lag im ReadInterval Timeout des TComPort. Dieser ist per Default auf -1 gesetzt! Somit blieb mein Memo immer leer! Ich bin durch Zufall darauf gestoßen... Die Ausgabe ist ja sogar in dieser Form in den Examples aufgeführt - also muss diese Methode ja auch funktionieren. :thumb: Das ReadInterval Timeout habe ich nun mal auf 1000 gesetzt. Das Memo füllt sich schön mit dem Ausgabetext und natürlich auch mit meinen Befehlen. So sieht der ausgegebene Inhalt aktuell aus: Zitat:
Zitat:
Auf alle Fälle schon mal ein großes Danke an Euch! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz