Serielle Schnittstelle empfängt keine CR

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Serielle Schnittstelle empfängt keine CR

    Hi,
    Ich wollte mir ein einfaches vb.net Programm bauen, dass mir die Daten von der Seriellen Schnitstelle einliest und dann über ein REST-API versendet. Weiterhin dachte ich das ganze kann ich ihn 3-4 Stunden locker schaffen.
    Leider sitze ich immer noch am ersten Teil (der Empfang über Seriel). Der Grund dessen ist einfach. Der Sender sendet korrekt die Werte und ebenfalls sendet er ein CR nach jeder Zeile. Dies ist in der spezifikaten des Senders so definiert und über "Realterm" kann ich das CR auch sehen. d.h. seitens des Senders ist alles in Ordnung
    z.b.:
    0017bC0M 05:39:51.7800 00
    0017rC1M 05:39:54.7000 00
    0017 b - 00:00:02.920

    Mein Problem auf vb-Seite ist nun das der CR dort nicht ankommt. Ich hatte zuerst mit

    VB.NET-Quellcode

    1. SerialPort1.readline()

    versucht die einzelnen Zeilen zu lesen, allerdings kam nie etwas zurück. Nun habe ich alles auf

    VB.NET-Quellcode

    1. SerialPort1.ReadExisting()

    und datareceived umgestellt. Hier bekomme ich auch daten geliefert. Allerdings ist der CR nicht mit dabei.
    Wenn ich das richtig verstehe müsste aber der CR mitgeliefert werden. Ohne CR ist es für mich extrem schwierig die einzelnen Zeilen zusammenzubauen, da sie ja nie gleich lang sind.
    So sieht aktuell die Initiierung des SerialPorts aus:

    VB.NET-Quellcode

    1. SerialPort1.PortName = cb_comportsavailable.SelectedItem
    2. SerialPort1.BaudRate = 9600
    3. SerialPort1.ReadTimeout = 50
    4. SerialPort1.StopBits = StopBits.One
    5. SerialPort1.DataBits = 8
    6. SerialPort1.Handshake = Handshake.XOnXOff
    7. SerialPort1.Open()

    Irgendwelche Ideen?
    msdn.microsoft.com/de-de/libra…rt.newline(v=vs.110).aspx

    Liegt vmtl. daran, dass er auf \r\n wartet(Windows halt). Du aber nur \r bekommst was außerdem auch in der Ursprünglichen Bedeutung keine neue Zeile ist, sondern nur wieder an den Anfang an der Zeile geht.

    Also setz einfach die NewLine Eigenschaft auf CarriageReturn, sollte denk ich funktionieren
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @mstenz Willkommen im Forum. :?:
    Machst Du SerialPort1.NewLine = vbCr, wie @jvbsl und @Eierlein schrieben und dies in Verbindung mit .ReadLine im .DataReceived-Event.
    Das sollte es gewesen sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke. Das hat in der Tat geholfen, ich hatte bereits geprüft ob vbCR in dem String enthalten ist, aber keine positive Rückmeldung erhalten, weshalb ich vermutet habe dass kein CR auf der Leitung ist, aber anscheinend war der Code der dies prüfen sollte nicht korrekt.
    @mstenz Das .ReadLine liefert den gesendeten String ohne Zeilenende-Kennung zurück, das ist der Sinn der .NewLine-Property.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm dann ist wohl MSDN wohl tatsächlich falsch, kanns halt hier auf Linux auch schwer überprüfen, da hier NewLine tatsächlich LF sein dürfte^^
    msdn.microsoft.com/de-de/libra…rt.newline(v=vs.110).aspx

    MSDN schrieb:

    By default the end-of-line value is NewLine.

    msdn.microsoft.com/de-de/libra…nt.newline(v=vs.110).aspx

    MSDN schrieb:

    A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.

    Und Win ist eindeutig non-Unix^^

    Edit: Wobei man hier sagen muss, dass .Net keine Unterscheidung zwischen *nix und Unix hat

    Edit2:

    MSDN .Net 2.0 schrieb:

    A value that represents the end of a line. The default is a line feed, (NewLine).

    Wobei der Weiterführende Link wiederum \r\n sagt
    Also bei .Net 2.0 sagt MSDN selbst zwei verschiedene Sachen, bei aktuellem .Net gibt es diesen Widerspruch nicht(falsch kann es trotzdem noch sein)

    Editor-Bug gefixt. ~Thunderbolt
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Hier ein kleines Consolen-Testprogramm:

    VB.NET-Quellcode

    1. 'Getestet mit Vb2010
    2. Imports System.IO.Ports
    3. Imports System.Convert
    4. Module Module1
    5. Sub Main()
    6. Dim t As String
    7. Dim mySerialPort As New SerialPort("COM1")
    8. 'mySerialPort.NewLine = vbCrLf
    9. Debug.Print("Anzahl Zeichen: " & mySerialPort.NewLine.Length)
    10. For i = 1 To mySerialPort.NewLine.Length
    11. t = Convert.ToInt16(GetChar(mySerialPort.NewLine, i)) 'Beginnt mit 1!!!
    12. Debug.Print(t.ToString)
    13. Next
    14. Debug.Print("--------")
    15. End Sub
    16. End Module
    Hätte ich auch selbst hinbekommen, jedoch bin ich wie gesagt auf Linux(nur sehr sehr selten auf Windows).
    Aber hier noch nen einfacherer Beweis:
    github.com/Microsoft/reference…O/ports/SerialPort.cs#L61

    vs. Mono Implementierung
    github.com/mono/mono/blob/mast…O.Ports/SerialPort.cs#L52
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---