Forum: Mikrocontroller und Digitale Elektronik ATmega328p - UART - nur Strings ?


von Felix (Gast)


Lesenswert?

Hallo, ich hab eine Frage, und zwar:
Ist es bei der seriellen kommunikation immer üblich, strings oder chars 
zu senden, oder kann man direkt auch z.B. Integer-Datentypen versenden ?

Ich habe nämlich einen ATmega328p, der auf der UART-Schnittstelle ein 
Signal erwartet. Dann habe ich noch eine C# WinForm, über die ich 
mittels Knopfdruck die in eine Textbox eingegebene Zahl über den 
SerialPort zum µC schicke. C# erwartet bei der SerialPort.Write - oder 
SerialPort.WriteLine-Methode einen String. Ich würde aber gerne einfach 
nur z.B. die Zahl 5 schicken, die eine LED 5 mal aufleuchten lässt. Wenn 
ich jetzt "5" als String sende, ist es dann ASCII 5, was der Dezimalzahl 
53 entsprechen
würde ?
Wenn ich aber die Zahl "2" als String an meinen µC schicke, und dann das 
UDR-Register auslese und den Inhalt in einer Int-Variablen speichere, 
kommt 25 an. Warum ? Mich verwirrt das Ganze etwas.
Danke schon mal im Voraus, LG Felix

von Peter D. (peda)


Lesenswert?

Mit Text hat man ein einfaches Protokoll, d.h. '\n' zeigt das Paketende 
an.
Text läßt sich auch gut mit einem Sniffer protokollieren.
Bei Binärdaten muß man sich aber erst noch ein Prokoll ausdenken, wie 
Nachrichten eindeutig synchronisiert werden können.

von Wolfgang (Gast)


Lesenswert?

Felix schrieb:
> kann man direkt auch z.B. Integer-Datentypen versenden ?

Kann man, allerdings mit der Einschränkung, dass der Datentyp nur 8 Bit 
haben darf. Wie willst du ihn sonst in das Senderegister vom UART 
reinbekommen?

> Wenn ich jetzt "5" als String sende, ist es dann ASCII 5, was der
> Dezimalzahl 53 entsprechen würde ?

... oder auch binär 0b110101 oder hex 0x35 oder octal 065

von Kurt B. (kurt-b)


Lesenswert?

Felix schrieb:
> Hallo, ich hab eine Frage, und zwar:
> Ist es bei der seriellen kommunikation immer üblich, strings oder chars
> zu senden, oder kann man direkt auch z.B. Integer-Datentypen versenden ?

Üblich wird da wohl Garnichts sein.
Es kommt immer darauf an was man erreichen will.

Pro "Sendung" wird (meisst) ein Byte gesendet, was das bedeutet und 
welchen Wert das hat das ist rein davon abhängig was der Anwender 
beabsichtigt.

Das Byte kann ein ASCII Zeichen sein, ein HEX-Zahl bedeuten, ein Byte 
beinhalten, ein Teil eines WORD sein oder Teil eines Single oder 
Strings.

Der Anwender, oder der der die Kommunikation festgelegt hat, ist der der 
da sagt was ist. Technisch ist es egal, es ist immer ein Byte mit 8 Bit 
(meisst!).

(es gibt auch mehrere "serielle Kommunikationen", auch das will in 
Überlegungen einbezogen sein.)

 Kurt

von техникус (Gast)


Lesenswert?

Ein UART kennt per Hardware nur bytes. Nun kann man einen 32bit Integer 
als 4 bytes nacheinander versenden. Wenn man das ein paar mal 
hintereinander macht und irgendwann geht ein byte verloren, weiss man 
nicht mehr wo man steht.
Dh bedeutet man sollte sich besser ein Protokoll ausdenken.

von Eric B. (beric)


Lesenswert?

Felix schrieb:
> Wenn ich aber die Zahl "2" als String an meinen µC schicke, und dann das
> UDR-Register auslese und den Inhalt in einer Int-Variablen speichere,
> kommt 25 an. Warum ?

Weil du mit großem Wahrscheinlichkeit einen Fehler in deinem Code hast. 
Entweder an der PC-Seite oder an der ATmega-Seite, oder vielleciht sogar 
en beide Seiten.
Das ASCII-Zeichen '2' hat den Wert 50 (dezimal). Das hätte als Wert in 
deine Variabele ankommen sollen...

von Rainer B. (katastrophenheinz)


Lesenswert?

Unabhängig von deinem fehlenden Verständnis für den Unterschied zwischen 
ASCII- und Binärformat sieht es auf den ersten Blick so aus, als käme 
der ganze Frame um ein Bit verschoben ( 25 statt 50 ) beim Empfänger an. 
Was sagen denn die Status-Bits im UCRS0A wenn du die 25 ausliest? Und 
poste mal den AVR-Code und die Einstellungen des seriellen Port auf 
Seite des PC. Und was kommt an, wenn du statt ASCII '2' versuchsweise 
mal ASCII '9' sendest?

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.