Entwickler-Ecke
IO, XML und Registry - SerialPort
Alux - Fr 09.07.10 02:09
Titel: SerialPort
Auslesen von ComPort:
Ich versuchte erst von Hyperterminal zu Hyperterminal via 2 RS232 Konvertern zu kommunizieren. Dies gelang mir mit dem Basissystem Win 7 auf anhieb.
Mit VirtualBox 3.2.6 dauerte es etwas länger, bis ich darauf kam, dass ev die alten Konvertertypen von Win7 nicht mehr unterstützt werden. Zum Schluss kriegte ich auch das hin.
Als nächster Schritt wollte ich mit Hyperterminal ( 9600 8 N 1 ) Zeichen senden, über den RS232 Konverter ( Com3 ) die Zeichen in einem Fenster darstellen.
Fenster = RichTextBox1
( In diesem Forum fand ich die Möglichkeit mit MessageBox, welche auch funktioniert. Ich möchte die Ausgabe aber in RichTextBox machen und dies fortlaufend...)
Hier mein gescheiterter Versuch.
Delphi-Prism-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| method MainForm.serialPort1_DataReceived(sender: System.Object; e: System.IO.Ports.SerialDataReceivedEventArgs);
var S: array of Byte;
begin array.Resize(var S,SerialPort1.ReadBufferSize); SerialPort1.Read(S,0,SerialPort1.BytesToRead); RichTextBox1.Text:= RichTextBox1.Text + S.ToString; end; |
Kann mir jemand sagen was ich falsch mache?
Wäre froh um jede Hilfe.
Danke im Voraus
Alux
Moderiert von
Christian S.: Delphi Prism-Tags hinzugefügt
Moderiert von
Christian S.: Topic aus Delphi Prism - Die Sprache verschoben am Fr 09.07.2010 um 09:01
Nachtrag:
Natürlich habe ich auch den Port geöffnet. Dies mache ich mit einem Button namens EIN.
Hier noch der Code:
Delphi-Prism-Quelltext
1: 2: 3: 4: 5:
| method MainForm.Button1_Click(sender: System.Object; e: System.EventArgs); begin serialPort1.Open; Ein.BackColor:= BackColor.Red; end; |
Hoffe das sich noch der eine oder andere hier hin verirrt und vielleicht mir bei meiner Problemstellung weiterhelfen kann.
Ich wäre auf jeden Fall nicht böse darüber.
Alux 09.07.2010 22:00
Alux - Sa 10.07.10 18:56
Hallo zusammen
Kann mir wirklich niemand weiter helfen?
Ich weiss RS232 ist nicht mehr innnn. Ich wäre trotzdem für jede Unterstützung froh. Die Einleitung im DelphiPrism umfasst leider keine RS-Schnittstellen.
Im Voraus besten Dank.
Alux
Moderiert von
Kha: Komplettzitat entfernt
Christian S. - Sa 10.07.10 19:04
Hm, Du solltest vielleicht erstmal sagen, in wiefern der Versuch denn scheitert :-) Kommt eine Fehlermeldung (wenn ja, welche), tut sich einfach nix?
//edit: In einem Projekt von mir sieht es so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| internal void _Port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string data = null; try { data = _Port.ReadLine(); } catch { data = _Port.ReadExisting(); } if (!String.IsNullOrEmpty(data)) HandleData(data); } |
Alux - Sa 10.07.10 19:54
Besten Dank für Deine Antwort.
Nun der Fehler sieht so aus:
Kompilieren kann ich mein Programm. Sobald ich jedoch ein Buchstaben oder eine Zahl im Hyperterminal eingebe und es in meinem Fenster angezeigt werden sollte, hustet PRISM und verweisst auf die lezte Befehlszeile in meinem oben aufgeführten Programmteil:
RichTextBox1.Text:= RichTextBox1.Text + S.ToArray();
und sagt
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement richTextBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Siehe auch im Anhang
Gruss Alux
Moderiert von
Christian S.: Vollständiges Zitat des vorhergehenden Beitrags entfernt
Christian S. - Sa 10.07.10 20:05
Ah, mit der Fehlermeldung kann man doch was anfangen :-)
Wenn Du aus einem anderen Thread auf den Thread der GUI zugreifen willst, musst Du das über die
Invoke-Methode kapseln, sodass sicher gestellt ist, dass der Code im GUI-Thread ausgeführt wird:
Delphi-Prism-Quelltext
1: 2: 3:
| Invoke(method begin RichTextBox1.Text:= RichTextBox1.Text + S.ToArray(); end); |
//edit: Wieso eigentlich
ToArray? :gruebel:
Alux - Sa 10.07.10 21:12
Christian S. hat folgendes geschrieben : |
Ah, mit der Fehlermeldung kann man doch was anfangen :-)
Wenn Du aus einem anderen Thread auf den Thread der GUI zugreifen willst, musst Du das über die Invoke-Methode kapseln, sodass sicher gestellt ist, dass der Code im GUI-Thread ausgeführt wird:
Delphi-Prism-Quelltext 1: 2: 3:
| Invoke(method begin RichTextBox1.Text:= RichTextBox1.Text + S.ToArray(); end); |
//edit: Wieso eigentlich ToArray? :gruebel: |
Du bist gut!!! Danke. Nun stürzt das Ding nicht mehr ab.
Das mit dem ToArray ist mein Fehler. Ich hatte gestern Abend noch so allerlei probiert und habe es nicht mehr auf ToString zurück korrigiert.
Auf jeden Fall kann ich nun senden. Das eine Problem besteht aber noch. Anstatt ein a oder e oder sonst ein Zeichen bringt er mir im TextBox - Feld jeweils nur ein -> System.Byte[] (siehe auch im Anhang)
Alux
Christian S. - Sa 10.07.10 21:26
Vorweg: Bitte hänge Bilder auch als Bilddateien an, das ist einfacher anzugucken als ein PDF :-)
Was die Ausgabe angeht, musst Du bei der Konvertierung eines Byte-Arrays in einen String wohl selber Hand anlegen (Da könnte die BitCoverter-Klasse hilfreich sein). Oder Du schaust Dir mal die anderen Methoden des SerialPorts an, einige liefern direkt einen String zurück.
Alux - Mi 14.07.10 00:20
Christian S. hat folgendes geschrieben : |
Vorweg: Bitte hänge Bilder auch als Bilddateien an, das ist einfacher anzugucken als ein PDF :-)
Was die Ausgabe angeht, musst Du bei der Konvertierung eines Byte-Arrays in einen String wohl selber Hand anlegen (Da könnte die BitCoverter-Klasse hilfreich sein). Oder Du schaust Dir mal die anderen Methoden des SerialPorts an, einige liefern direkt einen String zurück. |
So, hier eine variante wie man Daten vom SerialPort auslesen kann...
Es wäre wirklich schön wenn es eine richtige Bediehnungsanleitung/Buch.. von PRISM geben würde!!!
Delphi-Prism-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| method MainForm.serialPort1_DataReceived(sender: System.Object; e: System.IO.Ports.SerialDataReceivedEventArgs);
var S: array[0..4095] of Byte;
begin if SerialPort1.BytesToRead > 0 then begin var Count: Integer := SerialPort1.BytesToRead; SerialPort1.Read(S, 0, Count); Invoke(method begin TextBox1.Text := TextBox1.Text + System.Text.Encoding.UTF7.GetString(S, 0, Count); end); end; end; |
( Die Schnittstelle muss aber erst noch mit dem Befehl serialPort1.open(); geöffnet werden )
( Für UTF7 kann auch zB UTF8 oder ASCII verwendet werden )
Danke für die Hilfe.
Alux
Moderiert von
Christian S.: Prism-Tags hinzugefügt
Christian S. - Mi 14.07.10 08:15
Alux hat folgendes geschrieben : |
Es wäre wirklich schön wenn es eine richtige Bediehnungsanleitung/Buch.. von PRISM geben würde!!! |
Für die Syntax kannst Du im PrismWiki von CodeGear nachgucken, und die Anleitung fürs Framework ist natürlich 100% dieselbe wie für C#: MSDN Library.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!