mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ascii Dec in einzlne Ziffern zerlegen


Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, zuerstmal wünsch ich euch frohe Weihnachten.

Da ich zwischen den Mahlzeiten ein wenig Zeit hab bin ich natürlich am 
programmieren.
Und nun hab ich eine Frage:
Also folgendes:
Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal 
68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss 
ich in zwei einzelne Chars zerlegen, also 6 und 8.
Wie bekomm ich das hin?
Habe schon wild rum geschiftet und -30 gerechnet aber der nimmt immer 
den Hexwert irgendwie und ich komm nicht auf das richtige Ergebnis.
Habt ihr da eine kleine Lösung parat?
atoi() hat auch nicht funktioniert.
Steh grad a bissl aufm Schlauch

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einmal durch 10 teilen, einmal Modulo 10.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char* s = "44";
unsigned char c = (s[0] - '0') * 16 + s[1] - '0'
printf("%d", c );

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Printf bringt mit nix
Das ganze läuft auf Atmega162 und die einzelnen Zeichen, also 6 und 8 
sollen dann per USART als 36 und 38 Hex versendet werden.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest du dir erst mal klar werden, was du überhaupt 
willst.
So Sätze wie "Der nimmt da immer den Hex-Wert" sind dermaßen sinnfrei.

Wer nimmt nen Hex-Wert? Und seit wann unterscheidet ein Mikrocontroller 
zwischen Zahlensystemen...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schön das du das jetzt auch schon sagst.
Aber mit Printf geht es auch.

char* s = "44";
char out[4] = {0};
unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
sprintf( out, "%d", c );

sende(out);

Autor: Wayne Monga (vibra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in assembler gehts auch
; Bcd - zahlen in 2 ASCII char ---   wert in aa - ergebnis in r6 und r7  h/l Byte
;  
bcdasc:
    mov   temp,aa    ; aa aufheben
    lsr  temp
    lsr  temp
    lsr  temp
    lsr  temp    ;Msb ins Lsb schieben
    ori    temp,0x30  ;$30 dazuodern erzeugt ascii 30 -39 da nur zahl 0-9
    mov    r6,temp
    andi  aa,0x0f    ;löschen des Msb
    ori    aa,0x30
    mov    r7,aa
    ret

frohes Fest

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Hohmann schrieb:
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal
> 68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss
> ich in zwei einzelne Chars zerlegen, also 6 und 8.


..ich verstehe das so:
char cIn = 0x44;
char cHi = '0' +(cIn /10);
char cLo = '0' +(cIn %10);

tu_was_mit_zehnergrad_im_klartext(cHi);
tu_was_mit_einergrad_im_klartext(cLo);

..alternativ..
char cIn = 0x44;
char cHi = cIn /10;
char cLo = cIn %10;

tu_was_mit_zehnergrad_absolut(cHi);
tu_was_mit_einergrad_absolut(cLo);

(Ungetestet, teipos und co bitte entfernen)

HTH

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>char* s = "44";
>char out[4] = {0};
>unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
>sprintf( out, "%d", c );

>sende(out);

Wo hab ich denn da meine 6 und 8 stehen?
Entschuldigung für meine unglückliche Ausdrucksweise.
Hier mal der Code wo die 6 und 8 rein kommen sollen, hoffe das hilft 
weiter
Value= 0x44; //Wird eigentlich der Funktion übergeben
if(TempIndex == 29) //BoilerTemperatur
{
         Sendstring[13]=0x32; // 2 Teilnehmer

           Sendstring[15]=('6'); <--- hier soll die 6 rein
  Sendstring[16]=('8'; <-- hier soll die 8 rein

  for(j=0; j<=18 ;j++) //Status senden
  {
    USART2_Transmit(Sendstring[j]);
  }

Die Werte sollen also in dem Array gespeichert werden

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Hohmann schrieb:
> Sendstring[15]=('6'); <--- hier soll die 6 rein
> Sendstring[16]=('8'; <-- hier soll die 8 rein

Irgendwie hast du nen Knoten... %-)

Noch ne Variante:
sprintf(Sendstring[15], "%02u", Value);

Der Format String (%02u) bedeutet: 2 Stellige Unsigned-Int Zahl, ggf. 
mit führenden Nullen auffüllen.

Die Version mit Division und Modulo ist wahrscheinlich effizienter.

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo steht nach dem sprintf denn der Wert 6 drin?
Die 6 muss in den Sendstring[15] also muss ich dem String ja die 6 
zuweisen
Steht also nach
sprintf(Sendstring[15], "%02u", Value);

in Sendstring[15] die 6 drin?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> >char* s = "44";
> >char out[4] = {0};
> >unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
> >sprintf( out, "%d", c );
> >sende(out);
>
> Wo hab ich denn da meine 6 und 8 stehen?

Du hast geschrieben:

> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex.

wo kommt da eine 6 vor? In out steht dann die 68 drin und das wolltest 
du ja.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oben hab ich Dir die Lösung zwar schon mal geschrieben, jetzt servier 
ichs Dir mal in den Quellcode rein:

> Value= 0x44; //Wird eigentlich der Funktion übergeben
[..]
>    Sendstring[15]=('6'); <--- hier soll die 6 rein
>    Sendstring[16]=('8'; <-- hier soll die 8 rein

..wird damit zu..

     Sendstring[15]=('0' +(Value /10)); <--- hier ist die 6
     Sendstring[16]=('0' +(Value %10)); <--- hier ist die 8

Falls Du jemals Temperaturen über 100°C haben ★solltest★, dann musst Du 
das noch abfangen!

HTH und HF

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@g457
leider wissen wir nicht ob die 44 als sting vorliegt.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> @g457
> leider wissen wir nicht ob die 44 als sting vorliegt.

Doch, das wissen wir, dass sie das nicht tut:

Christian Hohmann schrieb:
> Value= 0x44; //Wird eigentlich der Funktion übergeben

HTH und ich hoffe, dass das die Unklarheiten jetzt beseitigt hat :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was aber diesem hier wiederspricht
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> was aber diesem hier wiederspricht
>> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex

Wieso? In Einklang mit obiger Zuweisung:

char Value = 0x44

Feddisch.

HTH :-)

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.