Autor Beitrag
avoid
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: Sa 29.08.15 20:51 
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. 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:
ausblenden 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>"); }           // start of header
        else if (Convert.ToInt32(t).ToString() == "2") { sb.Append("<STX>"); }      // start of text
        else if (Convert.ToInt32(t).ToString() == "3") { sb.Append("<ETX>"); }      // end of text
        else if (Convert.ToInt32(t).ToString() == "4") { sb.Append("<EOT>"); }      // end of transmission
        else if (Convert.ToInt32(t).ToString() == "5") { sb.Append("<ENQ>"); }      // enquire
        else if (Convert.ToInt32(t).ToString() == "6") { sb.Append("<ACK>"); }      // acknowledge
        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>"); }     // not acknowledge
        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>"); }      // record separator
        else if (Convert.ToInt32(t).ToString() == "31") { sb.Append("<US>"); }      // unit separator
        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

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Sa 29.08.15 21:10 
Den Code kannst du gut kürzen, indem du ein String-Array nimmst und darin die Aliase speicherst:
ausblenden C#-Quelltext
1:
string[] aliases = { "<SOH>""<STX>""<ETX>", ... };					

Dann kannst du einfach mit dem int-Wert des Chars als Index auf das Array zugreifen:
ausblenden C#-Quelltext
1:
sb.Append(aliases[(int)t]);					
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: Sa 29.08.15 22:39 
stimmt, guter tipp.
dann muss ich nur beachten das der Index bei 0 beginnt.

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.