Hallo Zusammen, ich habe eine Routine zum berechnen einer Checksumme für die RS232 Kommunikation mit einem Gerät. Die Checksumme bildet sich aus dem aufaddieren der einzelnen Bytes im Protokoll, dann Bit 9-... abschneiden und dem anschließendem "1" setzen des MSB. Jetzt muss ich das ganze über die RS232 in den Atmel schicken. Für die Programmierung nutzte ich VB.net 2005. Mein Problem dabei ist nun folgendes: Meine Checksumme ist als Integer deklariert und wird auch richtig berechnet. Allerdings kann ich ja eine "181" (errechnete Checksumme als Decimal) nicht einfach als String wandeln und über RS232 schicken, weil ja daraus ein "0x31 0x38 0x31" gemacht wird. Um dieses Problem zu lösen, wollte ich die Funktion chr() nutzen. Allerdings funktioniert das nur bis 127. Sobald es in den erweiterten Ascii reingeht (was ja 181 ist) kommt immer "0x3F" raus. Wie kann ich in VB.Net 2005 eine Dezimalzahl (128-255) in das dazugehörige Ascii-Zeichen umwandeln? Grüße Robert
> Allerdings funktioniert das nur bis 127. > Sobald es in den erweiterten Ascii reingeht (was ja 181 ist) > kommt immer "0x3F" raus. Könnte es sein, daß Du keine 8-Bit-Übertragung auf der seriellen Schnittstelle verwendest? Welche Kommunikationsparameter hast Du eingestellt? Welchen Datentyp verwendest Du für die Zuweisung des Ergebnisses von chr()? Quelltext?
Hallo Rufus, meine Parameter sind 8N1 und 9600Baud. Hier ist der Code. Public Function CheckUnit(ByVal sp As System.IO.Ports.SerialPort) As Boolean Dim sSendData As String = "123456abcdef" Dim chkSum As Char = CheckSum(sSendData) If sp.IsOpen = False Then sp.Open() sp.Write(sStart) For Each letter As String In sSendData sp.Write(letter) Next sp.Write(chkSum) sp.Write(sEnd) sp.Close() End If Return True // im Moment ohne Funktion End Function Private Function CheckSum(ByVal protocol As String) As Char Dim chk As Integer = 0 For Each letter As String In protocol chk = chk + Asc(letter) Next chk = chk And 255 Return Convert.ToChar(chk Or 128) End Function Wie gesagt. Bis Ascii 127D funktioniert alles super. Vielleicht findest Du ja was.
Hallo, mache das doch mit bytes und der funktion: System.Text.Encoding encoder = new ASCIIENCODER(); byte[] buffer= encoder.GetBytes("das ist der Text"); und rückwärts gehts dann so: string text= encoder.GetString(buffer); Das sollte so ganz gut funktionieren. Musst halt nur VB Syntax draus machen. Sebastian
Das habe ich auch schon versucht. Das Problem liegt darin, dass der Ascii-Encoder nur mit dem 7-Bit Ascii Code arbeitet. Kennt jemand eine Methode, damit ich den Hexwert einer Dezimalzahl zwischen 0 und 255 über die RS232 schicken kann?
Das Problem ist in der Dokumentation von System.IO.Ports.SerialPort.Write beschrieben (genauer: der Variante davon, die ein Byte-Array sendet): By default, SerialPort uses ASCIIEncoding to encode the characters. ASCIIEncoding encodes all characters greater then 127 as (char)63 or '?'. To support additional characters in that range, set Encoding to UTF8Encoding, UTF32Encoding, or UnicodeEncoding.
Hallo Rufus, danke für den Tip. Ich habe jetzt eine andere Lösung gefunden. So sieht der aktuelle Code aus. Public Function CheckUnit(ByVal sp As System.IO.Ports.SerialPort) As Boolean Dim sSendData As String = "123456abcdef" Dim chkSum As Byte = CheckSum(sSendData) If sp.IsOpen = False Then sp.Open() sp.Write(sStart) For Each letter As String In sSendData sp.Write(letter) Next sp.BaseStream.WriteByte(chkSum) sp.Write(sEnd) sp.Close() End If Return True End Function Private Function CheckSum(ByVal protocol As String) As Byte Dim chk As Integer = 0 For Each letter As String In protocol chk = chk + Asc(letter) Next chk = chk And 255 chk = chk Or 128 Return Convert.ToByte(chk) End Function Kann es durch den Zugriff auf den BaseStream zu unerwarteten Problemen kommen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.