Forum: Mikrocontroller und Digitale Elektronik Uart Zeichen zu DEC Zhal


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 Mario (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Schwierigkeit.
Ich habe eine Testplatine, wo ich über UART vom PC paar Zahlen schicken 
möchte.
als Beispiel (decimal) 1234
der mikrocontroller bekommt (hex) 31 32 33 34
wie kann ich das in eine decimalzahl im controller umwandelt?
Also damit meine shortvarible den wert 1234 (dec) oder halt 0x4D2 hat.

Vielen Dank!
Mario

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> wie kann ich das in eine decimalzahl im controller umwandelt?

atoi

http://www.cplusplus.com/reference/cstdlib/atoi/

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> der mikrocontroller bekommt (hex) 31 32 33 34

Das sind ASCII-Zeichencodes.
Wenn du von diesen Werten 0x30 sobtrahierst (Nummer der '0'), bekommst 
du den Wert der Zahl heraus. (0x31-0x30 = 1)
Wenn du jetzt noch die Stellen mit dem dezimalen Wert multiplizierst, 
bekommst du auch die entsprechende Dezimalzahl heraus.
Das kann man alles in eine Schleife verpacken und dann ist es hübsch.

von Thomas F. (igel)


Bewertung
1 lesenswert
nicht lesenswert
Mario schrieb:
> als Beispiel (decimal) 1234
> der mikrocontroller bekommt (hex) 31 32 33 34

Atmel Application Note 204:

http://www.atmel.com/images/doc0938.pdf

Und hier der Code dazu:
http://www.atmel.com/images/AVR204.zip

von Jonas B. (jibi)


Bewertung
0 lesenswert
nicht lesenswert
MSB und LSB beachten!

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> atoi

aber nur wenn das letzte Zeichen \0 ist.

Hoffentlich wird das mitgesendet oder wenigstens ein \r welches man vor 
atoi zu \0 ersetzen kann.

von Jacko (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Will man eine ZAHL übertragen, sollte man sich vorher (!) über
den Wertebereich von BYTE, WORD, oder LONG im Klaren sein.
Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen.
Dafür reicht jedes NICHT-'0' bis '9'-Zeichen.
So ein Zeichen muss aber folgen, sonst wird EWIG gewartet...

Außerdem muss man sich im Klaren sein, wie man programmtechnisch
eine neue Zahl an das Hauptprogramm signalisiert/abliefert.

ZAHL = 0
EMPFANGE_ZAHL:
  ASCII '0'...'9' kommt:
   ZAHL mal 10 nehmen, vom empfangenen Byte '0' abziehen
   und zu ZAHL addieren.
  Zurück nach EMPFANGE_ZAHL

  Anderes Zeichen kommt:
   ZAHL in einen Puffer kopieren und "neue Zahl" melden!
   ZAHL = 0
  Zurück nach EMPFANGE_ZAHL

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Jacko schrieb:
> Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen.


dafür reicht ja normalerweise ein \r welches man zu \0 ersetzt und das 
gleich in ein Array of Char input_txt[MAXLAENGE]={0}; einliest.

: Bearbeitet durch User
von c-hater (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Joachim B. schrieb:

> Jacko schrieb:
>> Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen.
>
>
> dafür reicht ja normalerweise ein \r welches man zu \0 ersetzt

1. Es reicht natürlich jedes beliebige Zeichen, was nicht im Vorrat der 
erlaubten Zeichen ist.

2. Irgendwelche Ersetzungen sind nicht nötig, wenn man dem "Decoder" 
einfach die Länge des Strings mit übergibt. Nullterminierte Strings sind 
C-Erfindung und nicht mehr. Insbesondere kein unabänderliches Axiom. Das 
kommt nur den C-Only-Typen so vor...

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
c-hater schrieb:
> 2. Irgendwelche Ersetzungen sind nicht nötig, wenn man dem "Decoder"
> einfach die Länge des Strings mit übergibt. Nullterminierte Strings sind
> C-Erfindung und nicht mehr. Insbesondere kein unabänderliches Axiom. Das
> kommt nur den C-Only-Typen so vor...

mal nicht so c-hate :)

klar kann man die Länge mit übertragen, bequemer ist doch zu terminieren 
und auch kürzer, ein \r und Ende ists.
Eine Länge kann schon mehr Platz unnötig verschwenden.

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Da man sowieso umwandel muss kann man auch einfach die beiden Bytes aus 
dem Speicher übertragen, die die 1234 darstellen, und sie auf 
PC-Seite(Mikrocontroller-Seite) wieder entsprechend zusammen setzen. 
Insbesondere bei Float-Werten ist das eine wesentlich effektivere Lösung 
als erst die entsprechenden Stellen mit atoi und ähnlichem umzuformen. 
;)

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Da man sowieso umwandel muss kann man auch einfach die beiden Bytes aus
> dem Speicher übertragen, die die 1234 darstellen, und sie auf
> PC-Seite(Mikrocontroller-Seite) wieder entsprechend zusammen setzen.
> Insbesondere bei Float-Werten ist das eine wesentlich effektivere Lösung
> als erst die entsprechenden Stellen mit atoi und ähnlichem umzuformen.
> ;)

dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil 
man Anfang und ende nicht mehr erkennen kann.

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Wenn man nur die Wandlung mit atoi macht (und sonst nichts weiter mit 
den Zeichen) dann braucht man noch nicht einmal die '\0', da atoi eh 
beim ersten Zeichen aufhört, das nicht zum Integer passt.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
c-hater schrieb:
> Nullterminierte Strings sind
> C-Erfindung und nicht mehr.

Sie machen aber die Programmierung einfacher. Vielleicht will man ja 
noch weitere Zahlen und Wörter parsen.
Es ist auch kein Aufwand, da man ja eh auf das Zeilenende testen muß, 
das \n mit \0 zu überschreiben.
Je nach OS und Terminalprogramm ist das Zeilenende auch unterschiedlich. 
Ich akzeptiere daher alle Kombinationen: "\n", "\r", "\n\r", "\r\n".

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil
> man Anfang und ende nicht mehr erkennen kann.

Darum muss man sich doch immer machen.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Peter II schrieb:
>> dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil
>> man Anfang und ende nicht mehr erkennen kann.
>
> Darum muss man sich doch immer machen.

aber viel weniger als bei einer ASCII Übertragung, weil man freie 
Steuerzeichen hat die nicht in den Daten vorkommen.

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.