Entwickler-Ecke
IO, XML und Registry - SerialPort-Problem - CharZeichen > 127
Florian Wolf - Mi 03.03.10 17:09
Titel: SerialPort-Problem - CharZeichen > 127
Hallo,
ich habe das Problem, dass ich einen String über den SerialPort an einen Mikrokontroller senden will. Ich baue mir den String in einer Funktion zusammen und sende ihn dann. Dabei sollen zwei Werte von 0 bis 255 in je einem Zeichen des Strings übertragen werden. Dies geht solange gut, solange der Wert kleiner/gleich 127 ist. Will ich den Wert 128 oder größer übertragen, geht es schief. Ich bekomme keine Fehlermeldung von C# aber es wird definitiv nicht das richtige übertragen, da mein Mikrokontroller darauf nicht mehr reagiert.
Ein Beispiel dazu:
Das funktioniert:
C#-Quelltext
1: 2: 3:
| int Wert1 = 127; int Wert2 = 64; serialPort1.Write(">7100AO" + Convert.ToChar(Wert1) + Convert.ToChar(Wert2)); |
Und das funktioniert nicht:
C#-Quelltext
1: 2: 3:
| int Wert1 = 128; int Wert2 = 191; serialPort1.Write(">7100AO" + Convert.ToChar(Wert1) + Convert.ToChar(Wert2)); |
Kann mir jemand sagen, ob ich etwas spezielles beachten muss, wenn in meinem String Zeichen vorkommen sollen, die einen Wert > 127 haben. Oder mache ich bei der Konvertierung etwas falsch?
Ich habe schon versucht mit einem Terminalprogramm den String an meinen Mikrokontroller zu senden, das funktioniert ohne Probleme.
Moderiert von
Christian S.: Code- durch C#-Tags ersetztModeriert von
Christian S.: Topic aus C# - Die Sprache verschoben am Mi 03.03.2010 um 17:40
JüTho - Mi 03.03.10 17:17
Hallo und :welcome:
Ich vermute, dass dein Microcontroller nicht mit Unicode arbeitet. Ein String ist unter .NET eine Zeichenkette von Unicode-Zeichen; jedes Char wird also durch 2 Bytes dargestellt. Du solltest deshalb stattdessen die Überladung von Write verwenden, die mit einem Byte-Array arbeitet.
Gruß Jürgen
Florian Wolf - Mi 03.03.10 17:26
JüTho hat folgendes geschrieben : |
Ich vermute, dass dein Microcontroller nicht mit Unicode arbeitet. Ein String ist unter .NET eine Zeichenkette von Unicode-Zeichen; jedes Char wird also durch 2 Bytes dargestellt. Du solltest deshalb stattdessen die Überladung von Write verwenden, die mit einem Byte-Array arbeitet.
|
Danke für die Schenlle Antwort.
Ich bin mir noch nicht ganz sicher ob ich die Antwort ganz richtig verstanden habe.
Ich habe gerade einen Serialport Monitor installiert und geschaut was über den Port gesendet wird. In dem Fall der funktioniert, enthalten die entsprechenden die Werte 127 und 64. In dem Fall in dem die Werte 128 und 194 sein sollen, wird jeweils der Wert 63 übertragen.
Hat das jetzt etwas mit dem 2-Byte-Senden zu tun?
JüTho - Mi 03.03.10 17:36
Es müssten immer zwei Bytes zusammen betrachtet werden. Was kommt denn vor und nach der 63? Jürgen
Florian Wolf - Mi 03.03.10 17:43
JüTho hat folgendes geschrieben : |
Es müssten immer zwei Bytes zusammen betrachtet werden. Was kommt denn vor und nach der 63? Jürgen |
Davor kommt nicht, das ist ja das was ich nicht verstehe. Auch wenn ich nur ein Zeichen mit dem Wert 128 übertrage wird eine 63 übertragen.
Florian Wolf - Mi 03.03.10 17:57
JüTho hat folgendes geschrieben : |
Du solltest deshalb stattdessen die Überladung von Write verwenden, die mit einem Byte-Array arbeitet. |
Das scheint tatsächlich zu funktionieren.
Quelltext
1:
| serialPort1.Write(new Byte[] { 128 },0,1); |
Das schickt mir ein Zeichen mit dem Wert 128.
Das macht meine Funktionen, die alle mit Srings arbeiten zwar deutlcih komplizierter, aber vielleicht bekomme ich das ganze so gelöst....
Ich habe meine Funktionen umgeschrieben und mit der Überladung mit Byte-Array funktioniert das senden jetzt.
Danke für die Hilfe.
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!