Uart Zeichen zu DEC Zhal

Gast #4901403
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
Gast #4901412
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.
Gast #4902272
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
Gast #4902300
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...
#4902316
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.
#4902407
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. 
;)
Gast #4902414
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.
#4902524
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".
Gast #4902569
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren