Benutzer mit den meisten Antworten
funktion von CHR(9 Problem

Frage
-
Hallo Visual Studio Profis,
ich versuche gerade eine kleinen Datalogger für Modbus In Visual Studio 2011 VB.NEt zu schreiben.
hierzu öffne ich einen Com Port. und muß nun eine Anfrage senden.
Dies geschieht mit SerielPort.Write(String).
Der String besteht aus mehreren Byts, die ich wie folgt generiere.
String = Chr(1) & Chr(3) & Chr(1) & Chr(48) & Chr(0) & Chr(1) & Chr(133) & Chr(249)
es werden alle Byts gesendet, aber die letzten beiden haben beim Empfänger den Wert 63.
Was mache ich falsch, das nur Werte bis 127 richtig umgewandelt werden - ab 128 bekomme ich immer 63 zurück.
Ich habe schon ein wenig recherchiert und bin auf einen Fehler im der Auswahl der Codepage gekommen. Habe auch schon an den verschiedensten Stellen im Projekt versucht die Codepage und unicode Einstellungen zu ändern - leider ohne Erfolg.
Hat jemand eine Lösung für mein Problem?
Gruß
Markus
Antworten
-
Hallo,
bei einer Einstellung von 8N1 sind es schon 8 Bits.
"Hexwerte" sendet man nie nur Bytes. Zeichenketten werden beim SerialPort durch die Encoding-Eigenschaft umgewandelt - und die sollte hier Encoding.Default sein.
Für Datenfolgen, die weniger eine Zeichenfolge sind (oben fast nur Steuerzeichen) kannst Du gleich ein Byte Array verwenden und via Write übertragen:
Dim sp As System.IO.Ports.SerialPort Dim dataBytes As Byte() = {1, 3, 1, 48, 0, 1, 133, 249} sp.Write(dataBytes, 0, dataBytes.Length)
Wenn nur ein Zeichen ankommt/verarbeitet wird, könnte es aber auch am Protokoll liegen, da vor den 133, 249 eine 0, 1 kommt, könnte damit die Daten-Länge angegeben werden - teste ggf. mal 0, 2.
Gruß Elmar
- Bearbeitet Elmar Boye Freitag, 26. Juli 2013 08:35 typo
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Sonntag, 25. August 2013 17:13
- Als Antwort markiert Ciprian Bogdan Mittwoch, 9. April 2014 13:53
Alle Antworten
-
Hallo Markus,
vermutlich verwendest Du Encoding.ASCII - denn da wird alles über 127 zu einer 63 (?) - da im ASCII 7-Bit-Zeichensatz nicht definiert. Da es sich vermutlich um eine ANSI-Übertragung handelt, verwende Encoding.Default:
Dim s As String = Chr(1) & Chr(3) & Chr(1) & Chr(48) & Chr(0) & Chr(1) & Chr(133) & Chr(249) Dim asciiBytes = System.Text.Encoding.ASCII.GetBytes(s) Dim ansiBytes = System.Text.Encoding.Default.GetBytes(s)
Der COM-Port sollte natürlich auch 8-Bit übertragen...
Gruß Elmar
- Bearbeitet Elmar Boye Donnerstag, 25. Juli 2013 20:48 COM-Port
-
Hallo Elmar,
ich danke für deine Anregung - funktioniert aber nicht.
Es wird immer nur eine 63 übertragen. Wie kann ich testen, ob tatsächlich 8 Bit übertragen werden ich bekomme ja kein Zeichen gesendet, das das 8. Bit nutzt. Wobei ich davon ausgehe, da meine Parameter auf 8N1 stehen.
Habe ich vieleicht einen Befehl übersehen, mit dem ich die Hex Werte direkt senden kann, statt alles in einem String zu senden. - das würde die Sache etwas vereinfachen, da ich meien Adressen dann nicht erst umrechnen muß.
Gruß
Markus
-
Hallo,
bei einer Einstellung von 8N1 sind es schon 8 Bits.
"Hexwerte" sendet man nie nur Bytes. Zeichenketten werden beim SerialPort durch die Encoding-Eigenschaft umgewandelt - und die sollte hier Encoding.Default sein.
Für Datenfolgen, die weniger eine Zeichenfolge sind (oben fast nur Steuerzeichen) kannst Du gleich ein Byte Array verwenden und via Write übertragen:
Dim sp As System.IO.Ports.SerialPort Dim dataBytes As Byte() = {1, 3, 1, 48, 0, 1, 133, 249} sp.Write(dataBytes, 0, dataBytes.Length)
Wenn nur ein Zeichen ankommt/verarbeitet wird, könnte es aber auch am Protokoll liegen, da vor den 133, 249 eine 0, 1 kommt, könnte damit die Daten-Länge angegeben werden - teste ggf. mal 0, 2.
Gruß Elmar
- Bearbeitet Elmar Boye Freitag, 26. Juli 2013 08:35 typo
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Sonntag, 25. August 2013 17:13
- Als Antwort markiert Ciprian Bogdan Mittwoch, 9. April 2014 13:53
-
Hallo Elmar,
das war's! Danke!!
Funktioniert Einwandfrei. Ich habe nicht gewust, dass ich statt der String Variablen auch ein Byte Array senden kann. Das war der Knoten.
Ich hatte vorher schon eine Encoding Zeile hinzugefügt, mit der ich bis auf die 133 Alles richtig Übertragen bekommen habe.
SerialPort.Encoding = System.Text.Encoding.GetEncoding(28591)
Nochmals Danke
Markus
-
Hi,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
Danke und viele Grüße,
Ciprian
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.