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


von ONC (Gast)


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:
1
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)


Lesenswert?

Schau mal nach: vbCr,vbNl,vbCrnl

von uxdx (Gast)


Lesenswert?

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

von Franko P. (sgssn)


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)


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)


Lesenswert?

&H0A = "0A"

von ONC (Gast)


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:
1
Imports System.IO.Ports
2
Public Class Form1
3
    Dim data_received As String
4
5
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
6
        Dim theText As String = TextBox1.Text
7
     
8
    End Sub
9
10
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
11
        data_received = SerialPort1.ReadLine
12
        If Len(Data_received) > 0 Then
13
            TextBox1.Text &= data_received
14
        End If
15
    End Sub
16
17
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
18
        Timer1.Interval = 300
19
        Timer1.Enabled = False
20
    End Sub
21
22
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
23
        Timer1.Enabled = True
24
        SerialPort1.NewLine = "&H0A" ' Ohne " macht er &HA draus,geht auch nicht.
25
        SerialPort1.Open()
26
        SerialPort1.BaudRate = 9600
27
        SerialPort1.DataBits = 8
28
        SerialPort1.Parity = Parity.Even
29
    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)


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)


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)


Lesenswert?

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

von zonk (Gast)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.