Forum: Mikrocontroller und Digitale Elektronik Uart Zeichen zu DEC Zhal


von Mario (Gast)


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)


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)


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)


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)


Lesenswert?

MSB und LSB beachten!

von Joachim B. (jar)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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.

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.