Forum: PC-Programmierung C# Byte an uC senden


von MarkusW (Gast)


Lesenswert?

Hallo!

Habe da folgendes Problem:

Ich habe in Visual C# ein numericUpDown-Feld mit möglichen Werten von
0...255 (=1 Byte).
Jetzt will ich diesen Wert über die serielle Schnittstelle an meinen
Mega8 senden (dort wird es per cast nach uint8_t übernommen).

Bis zum Wert 127 funktioniert alles prima, danach springt der Wert auf
63 (128 eingestellt - uC empfängt 63).

Denke der Fehler liegt irgendwo in der Typkonvertierung? Habe schon
vieles ausprobiert (Convert.ToChar, ushort usw.).

Jemand eine Idee?

Grüße
Markus

von Slowflyer (Gast)


Lesenswert?

Tag Markus,

also das Problem liegt eher im Encoding. Defaultmäßig wir meiner
bescheidenen Meinung nach ASCII verwendet (7Bit, daher max. 0x63).
Diese soltest du vielleicht folgendermaßen umstellen:

<code>
this.serialPort1.Encoding = Encoding.UTF8;
</code>

Gruß, Slowflyer

von Johnny (Gast)


Lesenswert?

Ich denke Du hast ein durcheinander mit den Datentypen. Es ist nötig das
auf dem PC und auf dem uC unsigned datentypen, also ohne Vorzeichen,
verwendet werden.

Das Encoding muss normalerweise nicht angepasst werden.

von Johnny (Gast)


Lesenswert?

Nachtrag: In C# ist ein "char" ein UTF-8 Zeichen. Also für so ein
Vorhaben sehr ungeeignet. Ich würde den Index des verwendeten UpDown
Controls in ein "byte" wandeln und dann dieses an die serielle
Schnittstelle schicken. Dann sollte es eigentlich klappen.

von Slowflyer (Gast)


Lesenswert?

Hmm...

@ Johnny

Hast Recht! Wenn man Write(char[]..) oder Write(string) oder
WriteLine(string) verwendet, so scheint es als ob intern der Encoder
verwendet wird. Benutzt man dagegen Write(byte[]...) werden die Bytes
ohne Encoder an die serielle Schnittstelle übergeben.

Gruß, Slowflyer

von Johnny (Gast)


Lesenswert?

Sehr gut wenn's geklappt hat. Solche Dinge muss jeder mal durchmachen
;-)

von Slowflyer (Gast)


Lesenswert?

Ähm..

Ob es bei Markus funzt weiss ich leider nicht ;)

von Johnny (Gast)


Lesenswert?

Oh ja ;-)

von MarkusW (Gast)


Lesenswert?

Ja, es funktioniert.

Hatte zunächst probiert mir vorher einen String zusammen zu bauen, weil
ich ein paar Chars vorher senden muss. Geht natürlich nicht...

also zunächst
....Write("...");
und dann
Write(temp)

Encoding muss man dann auch nicht umstellen.

Danke für eure Tipps!
Gruß
Markus

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
Noch kein Account? Hier anmelden.