VB.NET - Serielle Datenübertragung


PingOfDeath1983

Grünschnabel
Hallo,

ich habe noch ein Problem in einem Projekt von mir. Und zwar müssen Zeichen wie Ö,ä usw. (mehrere) in einen bestimmten Hex-Wert umgewandelt werden bevor sie seriell gesendet werden.

Hier mal der Code:

Code:
    Function LED_Zeichensatz(ByVal sText As String) As String

        Dim sRepWhat$, sRepWith$, sTemp$, iWhere$
        Dim cnt As Integer

        'System.Text.Encoding.

        'sText = System.Text.Encoding.GetEncoding(850).GetString(System.Text.Encoding.Default.GetBytes(sText))

        sRepWhat = "C3.C2.C1.C0.C4.C5.C6.DF.C7.D0.C9.CA.C8.CB.CD.CC.CE.CF.D1.D3.D4.D2.D6.D5.D8.DE.DA.D9.DB.DC.BE.DD.E3.E2.E1.E0.E4.E5.E6.E7.E9.EA.E8.EB.ED.EC.EE.EF.F1.F3.F4.F2.F6.F5.F8.FE.FA.F9.FB.FC.FF.FD.A5.A3.A4.0A.0D" '"falsche" Werte
        sRepWith = "7F.80.81.82.83.84.85.86.87.88.89.8A.8B.8C.8D.8E.8F.90.91.92.93.94.95.96.97.98.99.9A.9B.9C.9D.9E.9F.A0.A1.A2.A3.A4.A5.A6.A7.A8.A9.AA.AB.AC.AD.AE.AF.B0.B1.B2.B3.B4.B5.B6.B7.B8.B9.BA.BB.BC.BD.BE.BF.20.20"
        'sRepWith = "7F.80.81.82.83.84.85.86.87.88.89.8A.8B.8C.8D.8E.8F.90.91.92.93.94.95.96.97.98.99.9A.9B.9C.9D.9E.9F.A0.A1.A2.A3.A4.A5.A6.A7.A8.A9.AA.AB.AC.AD.AE.AF.B0.B1.B2.B3.B4.B5.B6.B7.B8.B9.BA.BB.BC.BD.BE.BF.20.20" 'richtige Werte laut Perl

        For cnt = 1 To Len(sText) 'Gehe alle Buchstaben des Textes durch

            sTemp = Hex(Asc(Mid(sText, cnt, 1)))  'Extrahiere den nächsten Buchstaben
            iWhere = InStr(sRepWhat, sTemp) 'Wenn gefunden

            If iWhere > 0 Then

                sTemp = Mid(sRepWith, iWhere, 2) 'und finde sein Äquivalent in der Codetabelle
                Mid(sText, cnt, 1) = Chr(Val("&H" & sTemp)) 'Dann noch im Text ersetzen

            End If
        Next cnt

        Form1.Label3.Text = sText

        'sText = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.Default.GetBytes(sText))
        'sText = System.Text.Encoding.GetEncoding(850).GetString(System.Text.Encoding.Default.GetBytes(sText))

        Form1.Label4.Text = sText
        Return sText
    End Function


......


Code:
    Sub SendSerialData(ByVal data As String)

        If strComport = "COM ?" Then
            Form1.ComboBoxCOM.Enabled = True
            Form1.credits.Enabled = False
            Form1.credit_timer = 0
        Else

            Using com As IO.Ports.SerialPort = _
                My.Computer.Ports.OpenSerialPort(strComport, 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)

                com.Encoding = System.Text.Encoding.ASCII 'GetEncoding(850)

                'portName ,baudRate ,parity ,dataBits ,stopBits

                'com.Encoding.CodePage()
                com.Encoding = System.Text.Encoding.UTF8

                com.WriteLine(data)

                Form1.Label5.Text = data

            End Using

        End If
    End Sub

Leider geht dabei etwas schief - was weiss ich auch nicht!
Es ist jedenfalls so, dass wenn ich den vom VB-Programm gesendeten String im HyperTerminal auslese nur ein "Kästchen" ankommt und nicht das gewünschte Zeichen. Das passiert NUR bei Zeichen die das 8te Bit nutzen .... also Umlaute/Sonderzeichen.

Jemand eine Idee?

Gruß, PingOfDeath1983
 

Nico Graichen

Erfahrenes Mitglied
Hi

Entweder du nutzt ein anderes Encoding oder du ersetzt vor dem Codieren die Zeichen durch ein entsprechendes Äquivalent (ä durch ae, ö durch oe, usw).

Grund: Im ASCII - Zeichensatz gibt es keine Umlaute
 

PingOfDeath1983

Grünschnabel
Das Problem ist, dass das Zielgerät (Lunartec LED-Lauflichtleiste) ä; ö; ü zwar kann, aber es steht nirgends geschrieben wie ich diese Zeichen übertragen muss.
Die Codierung bei der HEX-Umwandlung habe ich aus einem anderen Programm (daher weiss ich erst wie ich die Zeichen ändern muss).
Bei dem Gerät gab es noch ein Programm dazu welches die Zeichen übertragen kann - über Hyperterminal kommen sie auch richtig an, nur über den VB-Code leider nicht ....

Um überhaupt erstmal weiter zu kommen: Wo müsste/muss ich denn eine Codierung einstellen - beim übertragen oder beim umwandeln - oder muss ich überhaupt nicht encodieren da ich die Zeichen schon getauscht habe - ich brauche einen Ansatzpunkt da ich überhaupt nicht mehr aus dem Ausprobieren mehr raus komme :-(

PS: ä --> ae usw. existiert schon aus "Notfallfunktion" ... aber deswegen klappts mit ä trotzdem nicht ...

Gruß, PingOfDeath1983
 

JensG

Erfahrenes Mitglied
Hallo,

gibt es keine Dokumentation des Protokolls zu diesem Gerät ?
Eventuell hilft auch ein Schnittstellen-Analyser...

Schau dir mal dieses Beispiel hier an:
http://www.gssg.de -> Visual Basic -> VB.net
-> Serial Port (RS232) Chat

Vielleicht findest du da Ansatzpunkte.

Gruß
Jens