Forum: PC-Programmierung VB.NET NewLine "0a" Chr


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ONC (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leser, ich habe eigentlich ein ganz simples Ziel:
Ein Gerät sendet Daten über eine RS232 Schnittstelle an den PC.
VB.net soll mir das in einer TextBox mit Multiline anzeigen (RichTextBox 
geht nicht, da das ganze irgendwann auch unter Win CE laufen soll, und 
ich deshalb unter VB 2008 mit CompactFramework arbeite).

Problem ist ebenso simpel: Das Gerät sendet erst alles, was in der 
ersten Zeile angezeigt werden soll, und dann alles für die nächste 
Zeile.
Damit die Zielhardware, in diesem Fall also mein Rechner, weiß was für 
welche Zeile bestimmt ist, beginnen alle Daten für die Zweite Zeile 
immer mit "0a".

Konvertiere ich dies nun zu Ascii, macht er eine neue Zeile. Scheint 
also zu stimmen.

Mein Problem:
SerialPort1.NewLine = Chr("0a")
 bringt den Fehler "System.InvalidCastException: "Ungültige 
Konvertierung von der Zeichenfolge 0a in Typ Integer."...

Da ich vollkommener Anfänger bin, vermute ich mal, er will das ganze in 
einem anderen Format. Als Ascii kann ichs aber nicht einfügen, da "0a" 
als HEX ja immer nur eine Leerzeile bringt.

Wie bringe ich VB nun bei, dass alles ab 0a in eine neue Zeile soll, 
bzw. in welchem Format muss ich das bei "NewLine" eintragen? Mit " und 
ohne " macht keinen Unterschied, stürzt beim Beginn der Abfrage bzw. 
öffnen des Ports mit oben genanntem Fehler ab.

Hat hierfür jemand eine Idee?
Danke

von Karadur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schau mal nach: vbCr,vbNl,vbCrnl

von uxdx (Gast)


Bewertung
0 lesenswert
nicht lesenswert
In Windows ist eine neue Zeile doch 0x0D 0x0A, nur 0x0A ist Linux/Unix

von Franko P. (sgssn)


Bewertung
0 lesenswert
nicht lesenswert
ONC schrieb:
> SerialPort1.NewLine = Chr("0a")

Hi
"0A" ist doch ein String. Müsste das dann nicht heissen: '0A' ?

Gruß

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ONC schrieb:

> Mein Problem:
> SerialPort1.NewLine = Chr("0a") bringt den Fehler
> "System.InvalidCastException: "Ungültige Konvertierung von der
> Zeichenfolge 0a in Typ Integer."...

Versuch's doch einfach mal mit:

SerialPort1.NewLine = ControlChars.Lf

von rrr (Gast)


Bewertung
0 lesenswert
nicht lesenswert
&H0A = "0A"

von ONC (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, habe leider erst heute wieder Zeit gefunden mich damit 
zu beschäftigen.

uxdx schrieb:
> In Windows ist eine neue Zeile doch 0x0D 0x0A, nur 0x0A ist Linux/Unix

Ich kann aber leider nicht ändern was dass Gerät "mir" mitteilt.

c-hater schrieb:
> SerialPort1.NewLine = ControlChars.Lf

Friert die Form ein

rrr schrieb:
> &H0A = "0A

Auch das friert leider die Form ein.

Aktueller Code:
Imports System.IO.Ports
Public Class Form1
    Dim data_received As String

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim theText As String = TextBox1.Text
     
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        data_received = SerialPort1.ReadLine
        If Len(Data_received) > 0 Then
            TextBox1.Text &= data_received
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 300
        Timer1.Enabled = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        SerialPort1.NewLine = "&H0A" ' Ohne " macht er &HA draus,geht auch nicht.
        SerialPort1.Open()
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.Even
    End Sub

ReadExisting geht, aber überschreibt die TextBox mit den nächsten Daten, 
bevor die ersten überhaupt richtig angezeigt werden.
Alles was ich benötig:
Daten vom Port lesen, bis "0A" ankommt, dann den Text in Zeile 1, alles 
hinter "0A" in Zeile 2, und dass über den Timer alle XY Sekunden 
abfragen...

von hollaholla (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich zitiere:
Constant  Description
vbCrLf  Carriage return/linefeed character combination.
vbCr  Carriage return character.
vbLf  Linefeed character.

(https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/constants-and-enumerations)

ONC schrieb:
> SerialPort1.NewLine = ControlChars.Lf

Probiere mal die der Reihe nach durch

von ONC (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hollaholla schrieb:
> Probiere mal die der Reihe nach durch

Bereits erledigt... da meine Hardware "0a" schreibt, müsste es ja Lf 
sein.

Vielleicht habe ich die "NewLine" Zeile auch an der falschen Stelle?

Erst im Button, der auch den Port öffnet, dann im Timer für Data 
Received versucht... friert weiterhin ein.

von Karadur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Scheint ja nicht zu gehen, hatte ich am 20.11 schon geschrieben.

von zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lass die Newline Zeile weg.
Wenn dann chr(10) bzw char(&ha) aber daran scheint es nicht zu liegen da 
der Wert auch standartmässig eingestellt ist.
Kann es sein dass der Timer zu oft feuert? Oder zu wenig sodass der 
Puffer vollläuft?
Der Aufruf des Ports dürfte ,,blockierend" sein,d.h. wenn nix im Port 
ist wird das Programm so lange angehalten also es friert ein

von zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Standardmäßig wird die- ReadLine Methode blockiert, bis eine Zeile 
empfangen wird. Wenn dieses Verhalten nicht erwünscht ist, legen Sie die 
ReadTimeout -Eigenschaft auf einen Wert ungleich 0 (null) fest, um zu 
erzwingen, dass die- ReadLine Methode eine auslöst, TimeoutException 
Wenn keine Zeile auf dem Port verfügbar ist.

(https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.readchar?view=dotnet-plat-ext-5.0)

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ONC schrieb:

> c-hater schrieb:
>> SerialPort1.NewLine = ControlChars.Lf
>
> Friert die Form ein

Bestimmt nicht. Was die Form einfriert, ist dein unsinniges Programm, 
welches im maintread blockierend auf den Empfang einer Zeile wartet.

Du musst also die Struktur deines Programmes ändern.

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.

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