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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Felix (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.