Autor Beitrag
Florian Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Mi 03.03.10 17:09 
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:
ausblenden C#-Quelltext
1:
2:
3:
int Wert1 = 127;
int Wert2 = 64;
serialPort1.Write(">7100AO" + Convert.ToChar(Wert1) + Convert.ToChar(Wert2));


Und das funktioniert nicht:
ausblenden 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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 03.03.2010 um 17:40
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Mi 03.03.10 17:26 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Mi 03.03.10 17:43 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Mi 03.03.10 17:57 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Du solltest deshalb stattdessen die Überladung von Write verwenden, die mit einem Byte-Array arbeitet.


Das scheint tatsächlich zu funktionieren.
ausblenden 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.