Serielle Schnittstelle auslesen Theorie

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Ok, also Read ist ja offensichtlich was es tut man gibt ihm ja sogar den Byte()-Behälter mit.

    Und ReadExisting macht dasselbe und konvertiert direkt mit? Oder macht es noch mehr? In der Beschreibung steht "Liest alle sofort verfügbaren Bytes auf Grundlage der Codierung im Stream und im Eingabepuffer des SerialPort-Objekts"

    Das verstehe aber aus einigen Gründen nicht. Ich weiß was der Eingabepuffer ist, den liest Read quasi auch aus.
    Aber was ist der Stream?
    Was heißt sofort verfügbar?
    Wo wird die erwähnte Codierung angegeben?

    Haudruferzappeltnoch schrieb:

    Und ReadExisting macht dasselbe und konvertiert direkt mit?


    Also es müssen ja Bytes gelesen werden, Brötchenkrümmel können es ja schlecht sein :D . Wenn man diese Function in den Docs anschaut:
    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-5.0


    Liest alle sofort verfügbaren Bytes auf Grundlage der Codierung sowohl im Stream als auch im Eingabepuffer des SerialPort-Objekts.

    public string ReadExisting ();


    Ist jetzt C# kopiert, irgendwo kann man das auf der Seite umstellen, in VB wäre das dann:

    VB.NET-Quellcode

    1. public ReadExisting () as string

    Man sieht also schon was für'n Typ zurück kommt.
    Gibt zurück
    String

    Der Inhalt des Streams und des Eingabepuffers des SerialPort-Objekts.


    Das da noch was im Hintergrund passiert, also aus den Bytes ein String gebaut wird ist damit auch klar. Irgendwo im Netz kann man sich den Source des Frameworks anschauen, ich denke nur da kann man herausfinden, wie das genau im Hintergrund gemacht wird. Wird aber vermutlich System.Text.Encoding.Default.GetString() sein.
    Takafusa, ich glaub, Haudruferzappeltnoch hat sich noch nie mit Encoding-Problemen herumschlagen müssen.
    @Haudruferzappeltnoch Encoding-Probleme treten zum Beispiel auf, wenn ein 16-Bit-String zu einem 8-Bit-String wird (aus einem Zeichen werden ggf zwei). Du hast im Alltag bestimmt schon einmal gesehen, dass auf einer Programmoberfläche

    ß steht wo ein ß stehen müsste,
    ü steht wo ein ü stehen müsste,
    ä steht wo ein ä stehen müsste,
    ö steht wo ein ö stehen müsste.

    Das war ein typisches Beispiel ein C++ std::wstring (UTF16) wird einfach zu ANSI1252 konvertiert ohne drüber nachzudenken.
    Bei so einer Umwandlung funktioniert alles mit den ersten x Buchstaben problemlos, aber dann sind die Buchstaben in den Tabellen halt verschieden. Wenn du nun ein Projekt hast, wo ein std::wstring kommt und du die Textdatei aber mit ANSI1252 befüllen musst, dann reicht es nicht, einfach in einen 8-Bit-String umzuwandeln – weil dann kommt der obige Quark heraus – sondern du musst dann noch fixen. Da gibt es aber Methoden. Ich will zu dem Punkt kommen, dass du dieses fixen nicht vergessen darfst, sonst siehst du Zeichen wie oben.

    Deswegen muss das Encoding des Geräts == Encoding des Programms sein.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bartosz“ ()

    @Haudruferzappeltnoch SerialPort.ReadExisting() liefert einen String zurück. Dieser ist entsprechend .Encoding konvertiert.
    SerialPort.Read() liefert eine Byte-Folge zurück.
    Je nachdem, was Du erwartest, rufst Du die eine oder die andere Methode auf.
    Üblicherweise ist das absolut eindeutig.
    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!