mikrocontroller.net

Forum: PC-Programmierung RS232 auslesen mit ReadExisting


Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte zum Testen den Inhalt einer TextBox per serieller 
Schnittstelle an eine andere TextBox senden. Da ich auch Zeilenumbrüche 
senden will, verwende ich nicht "SerialPort1.WriteLine" und 
"SerialPort1.ReadLine", sondern "SerialPort1.Write" und 
"SerialPort1.ReadExisting".

Jetzt verbinde ich die Leitungen "TxD" und "RxD" und starte das Programm 
mit folgendem Code:

Public in_put As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'SerialPort1 ist schon geöffnet und parametriert

    SerialPort1.Write(TextBox1.Text)

End Sub

'****Anfang: Thread zum auslesen der RS232 und schreiben in TextBox2 *****

Private Delegate Sub Data()
Private Empfang As New Data(AddressOf Empf)

Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
    ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
    Handles SerialPort1.DataReceived

    in_put = SerialPort1.ReadExisting
    Me.Invoke(Empfang)

End Sub

Private Sub Empf()
    TextBox2.Text = in_put
End Sub

'****  Ende: Thread zum auslesen der RS232 und schreiben in TextBox2 *****

Alles funktioniert prima, wenn die Baudrate über 4800 bit/s ist.
Wenn die Baudrate darunter liegt, wird "SerialPort1_DataReceived" 
mehrmals durchlaufen und es werden nur Bruchstücke in "in_put " gelesen 
(meist 8 bis 12 Zeichen).
Diese Bruchstücke werden dann in "TextBox2.Text" geschrieben und sofort 
wieder mit dem nächsten Bruchstück überschrieben.
Wenn ich "SerialPort1.WriteLine" und "SerialPort1.ReadLine" verwende, 
kann ich doch auch mehr als 12 Zeichen auf einmal lesen und das bei 
einer Baudrate von 300 bit/s.
Woran liegt das? Wo doch alles bei höheren Baudraten mit 
"SerialPort1.ReadExisting" funktioniert.
Ich habe schon mit "SerialPort1.WriteTimeout", 
"SerialPort1.ReadTimeout", Buffer-Größe und Timer 'rumprobiert, ohne 
Erfolg.
Was muß ich ändern, damit "SerialPort1.ReadExisting" alle Zeichen auf 
einmal in die Variable "in_put" schreibt und "SerialPort1.ReadExisting" 
auch mit niedrigen Baudraten funktioniert ?

Vielen Dank im voraus

Grüße

Olaf

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Antwort in einem anderen Forum erhalten.

Mit "SerialPort1.ReceivedBytesThreshold = TextBox1.TextLength" 
funktioniert alles, wie ich es mir erwünscht habe (vorausgesetzt 
TextLength > 0 ;-) ).

Olaf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.