SerialPort umlaute ausgeben

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    SerialPort umlaute ausgeben

    Hey Leute,

    hab grad nen Problem mit meinem Programm, und zwar hab ich einen Meldeempfänger der mir über dei Serielle-Schnitstelle (RS232) einen Text reinbringt, den Text schreibt dann mein Programm mit "Serialport1.ReadExisting" in eine Textbox.
    Das funktioniert alles soweit nur hab ich das Problem, das wen z.B.: ein "Ä" gesendet wir das es dann nicht als "Ä" ausgegeben wird, sondern als "?".

    Das gleiche Problem hab ich beim Ö,Ü und ß also die ganzen sonder zeichen die nicht im Ascii stehn.
    Beim Hyperterminal von Win XP bekomme ich Ä,Ö,Ü und ß.
    Was muss ich jetzt machen, das diese Zeichen auch in meine Textbox geschreiben werden?
    ?(

    Vielen Dank schon mal:
    M.f.G.: Flexy1994
    Also ich schafs einfach nicht.
    Ich hab des jetzt mal das aus probiert:
    (Das "Select" hab ich für die einfachere auswahl der Varrianten verwendet.)
    Bei beiden Varrianten bekomme ich kein Ä, Ö, Ü, ß
    Wenn ich den Melder mit dem Hyperterminal von Win XP auslese bekomme ich alles!
    Was mache ich falsch???

    VB.NET-Quellcode

    1. Dim enc As New System.Text.ASCIIEncoding()
    2. Select Case EMPFANGEN_VARIANTE
    3. Case 1
    4. PufferString = .ReadExisting
    5. Me.Invoke(Datenanzeigen)
    6. Case 2
    7. For I As Integer = 1 To .BytesToRead ' Alle Bytes einzeln lesen
    8. Dim ByteArray() As Byte = {.BaseStream.ReadByte} ' 1 Byte lesen
    9. PufferString = enc.GetString(ByteArray) ' Array in String
    10. Me.Invoke(Datenanzeigen) ' Delegaten aufrufen
    11. Next
    12. End select


    Danke
    M.f.G. Flexy1994
    Hi Leutz,
    habe das gleiche Problem wie flexy. Da ASCII ja keine Umlaute kann verbringe schon mehrer
    Tage mit einer Lösung. Da der Meldeempfänger die Nachrichten nur als ASCII über den Serial Port ausgibt
    und der Port meines wissens stanardmäßig nur ASCII sendet, versuche ich nun wie flexy
    verzweifelt ASCII zu "konvertieren", damit die Umlaute dargestellt werden.

    Hab schon folgenden Schnippsel mehrfach vor SerialPort1.Open() versucht :

    SerialPort1.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
    oder
    SerialPort1.Encoding = System.Text.Encoding.Default
    oder
    SerialPort1.Encoding = System.Text.Encoding.UTF8
    ...

    jedoch füht nichts zum Erfolg. Die ??? bleiben. ;( Hat noch einer eine Idee.
    Muss ich vieleicht vorher was "wandeln" Bin jetzt nicht gerade der Profi,
    aber für jede Hilfe dankbar.

    Grüß und Danke im voraus. Schwendes.

    P.S. : Die Sache von Mad Andy hab ich mir mal angesehen. Steig da aber nicht ganz durch.
    hmm. ich kenn den Serialport nicht, aber was du (ihr) versuchen könntet wäre:
    • Statt Buchstaben Zahlen übertragen, die nacher in Buchstaben umgewandelt werden (wie Bytes)
    • Die Umlaute mit irgendetwas ersetzen (z.b.: für ä → #a) und später wieder zu ä
    Auf beiden Seiten der Kommunikation müssen dieselben Einstellungen vorhanden sein (CodePage).
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _Encoding As System.Text.Encoding
    2. Private Sub Init()
    3. _Encoding = System.Text.Encoding.GetEncoding(1252) ' westeuropäisch
    4. End Sub
    5. Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
    6. Dim text As String = TextBox1.Text
    7. Dim by As Byte() = _Encoding.GetBytes(text)
    8. SerialPort1.Write(by, 0, by.Length)
    9. End Sub
    10. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    11. Dim ToRead As Integer = SerialPort1.BytesToRead
    12. If ToRead > 0 Then
    13. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    14. Dim Buffer(ToRead - 1) As Byte
    15. SerialPort1.Read(Buffer, 0, ToRead)
    16. TextBox2.Text &= _Encoding.GetString(Buffer)
    17. End If
    18. End Sub
    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!
    Hi Leutz,

    Problem konnte mittlerweile gelöst werden. Hatte ein Gespräch mit dem Hersteller des
    Melders (Swissphone). Die haben für den Patron damals eine angepasste Version des ISO8859-1
    verwendet. Hab mir dann die Code Tabelle vom Patron besorgt und konnte dann mit folgenden
    Codeschnipsel mein Umlaute Problem lösen :

    für den Serial Port
    ...
    SerialPort1.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
    ...

    und dann das "Replacing" der Zeichen

    ...

    txt = txt.Replace("@", "§")
    txt = txt.Replace("[", "Ä")
    txt = txt.Replace("\", "Ö")
    txt = txt.Replace("]", "Ü")
    txt = txt.Replace("{", "ä")
    txt = txt.Replace("|", "ö")
    txt = txt.Replace("}", "ü")
    txt = txt.Replace("~", "ß")
    ...

    Ist vieleicht nicht die feine Englische Art. Aber es funtzt. Also alle die ähnliches mit ihrem
    digitalen Melder (Patron Plus) vorhaben. Dieses vorgehen ist getestet und funtzt, zumindestens
    bei mir.

    Ansonsten nochmals danke für eure Ideen.
    Das sieht nach Encoding englisch-US aus.
    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!