Entwickler-Ecke
Basistechnologien - Convertierung von Zeichen
avoid - Sa 29.08.15 20:51
Titel: Convertierung von Zeichen
ich bastle gerade mal wieder ein kleines Tool mit dem ich über Serialport Daten sende und empfange. die Geräte mit denen dieses Tool Kommunizieren soll arbeiten aber mit dem Zeichensatz
IA5 bzw. Appendix_A [
http://www.gscott.co.uk/ESPA.4.4.4/appendix_a.html]. dieser ist überwiegend kompatibel zu ASCII aber einige Zeichen unterscheiden sich.
mir geht es nun darum wie ich einen Beispielstring so konvertieren kann das er im richtigen Zeichensatz gesendet wird und wie ich empfangene Zeichen wieder richtig zurück wandeln kann das ich sie Normal lesen kann. Dabei muss ich beachten das die Steuerzeichen von 001 bis 031 umgewandelt werden müssen und z. b. als <LF> oder <ACK> dargestellt werden.
ich hab schon mal etwas rumprobiert um den empfang leesbar zu machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| private string StringToHex(string hexstring) { var sb = new StringBuilder(); foreach (char t in hexstring)
if (Convert.ToInt32(t).ToString() == "1") { sb.Append("<SOH>"); } else if (Convert.ToInt32(t).ToString() == "2") { sb.Append("<STX>"); } else if (Convert.ToInt32(t).ToString() == "3") { sb.Append("<ETX>"); } else if (Convert.ToInt32(t).ToString() == "4") { sb.Append("<EOT>"); } else if (Convert.ToInt32(t).ToString() == "5") { sb.Append("<ENQ>"); } else if (Convert.ToInt32(t).ToString() == "6") { sb.Append("<ACK>"); } else if (Convert.ToInt32(t).ToString() == "8") { sb.Append("<BS>"); } else if (Convert.ToInt32(t).ToString() == "9") { sb.Append("<HT>"); } else if (Convert.ToInt32(t).ToString() == "10") { sb.Append("<LF>"); } else if (Convert.ToInt32(t).ToString() == "11") { sb.Append("<VT>"); } else if (Convert.ToInt32(t).ToString() == "12") { sb.Append("<FF>"); } else if (Convert.ToInt32(t).ToString() == "13") { sb.Append("<CR>"); } else if (Convert.ToInt32(t).ToString() == "16") { sb.Append("<DEL>"); } else if (Convert.ToInt32(t).ToString() == "21") { sb.Append("<NAK>"); } else if (Convert.ToInt32(t).ToString() == "22") { sb.Append("<SYN>"); } else if (Convert.ToInt32(t).ToString() == "23") { sb.Append("<ETB>"); } else if (Convert.ToInt32(t).ToString() == "28") { sb.Append("<FS>"); } else if (Convert.ToInt32(t).ToString() == "29") { sb.Append("<GS>"); } else if (Convert.ToInt32(t).ToString() == "30") { sb.Append("<RS>"); } else if (Convert.ToInt32(t).ToString() == "31") { sb.Append("<US>"); } else { sb.Append(t); }
return sb.ToString(); } |
aber was das senden an geht hab ich keine Idee. :(
hat sich mit so etwas schon wer befasst und kann mir weiter helfen?
Gruß,
avoid
Stundenplan - Sa 29.08.15 21:10
Den Code kannst du gut kürzen, indem du ein String-Array nimmst und darin die Aliase speicherst:
C#-Quelltext
1:
| string[] aliases = { "<SOH>", "<STX>", "<ETX>", ... }; |
Dann kannst du einfach mit dem int-Wert des Chars als Index auf das Array zugreifen:
C#-Quelltext
1:
| sb.Append(aliases[(int)t]); |
avoid - Sa 29.08.15 22:39
stimmt, guter tipp.
dann muss ich nur beachten das der Index bei 0 beginnt.
Ralf Jansen - So 30.08.15 15:15
Der IA5 Zeichensatz hat die Codepage 20106, zumindest die deutsche IA5 Version. IA5 scheint es in sprachspezifischen Versionen zu geben.
Dein SerialPort nimmt Bytes an und gibt Bytes aus du mußt also nur die passende byte<->string Umwandlung verwenden. Dafür gibt es in .Net die Encoding Klassen.
Wenn du die string basierten Read/Write Methoden vom Port verwendet hast kannst du einfach das dabei zu verwendende Encoding über die Property gleichen Namens festlegen, also sowas wie mySerialPort.Encoding = Encoding.GetEncoding(20106); oder alternativ auf die Byte basierten Read/write MEthoden umsteigen und die Umwandlung für den Fall das man tatsächlich den string braucht und nicht einfach die Bytes dann selbst umwandeln. Das Encoding hat dafür eine GetString Methode.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!