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
char* s = "44"; unsigned char c = (s[0] - '0') * 16 + s[1] - '0' printf("%d", c );
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.
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...
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);
in assembler gehts auch
1 | ; Bcd - zahlen in 2 ASCII char --- wert in aa - ergebnis in r6 und r7 h/l Byte |
2 | ; |
3 | bcdasc: |
4 | mov temp,aa ; aa aufheben |
5 | lsr temp |
6 | lsr temp |
7 | lsr temp |
8 | lsr temp ;Msb ins Lsb schieben |
9 | ori temp,0x30 ;$30 dazuodern erzeugt ascii 30 -39 da nur zahl 0-9 |
10 | mov r6,temp |
11 | andi aa,0x0f ;löschen des Msb |
12 | ori aa,0x30 |
13 | mov r7,aa |
14 | ret |
frohes Fest
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:
1 | char cIn = 0x44; |
2 | char cHi = '0' +(cIn /10); |
3 | char cLo = '0' +(cIn %10); |
4 | |
5 | tu_was_mit_zehnergrad_im_klartext(cHi); |
6 | tu_was_mit_einergrad_im_klartext(cLo); |
..alternativ..
1 | char cIn = 0x44; |
2 | char cHi = cIn /10; |
3 | char cLo = cIn %10; |
4 | |
5 | tu_was_mit_zehnergrad_absolut(cHi); |
6 | tu_was_mit_einergrad_absolut(cLo); |
(Ungetestet, teipos und co bitte entfernen) HTH
>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
1 | Value= 0x44; //Wird eigentlich der Funktion übergeben |
2 | if(TempIndex == 29) //BoilerTemperatur |
3 | {
|
4 | Sendstring[13]=0x32; // 2 Teilnehmer |
5 | |
6 | Sendstring[15]=('6'); <--- hier soll die 6 rein |
7 | Sendstring[16]=('8'; <-- hier soll die 8 rein |
8 | |
9 | for(j=0; j<=18 ;j++) //Status senden |
10 | {
|
11 | USART2_Transmit(Sendstring[j]); |
12 | }
|
Die Werte sollen also in dem Array gespeichert werden
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:
1 | 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.
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
1 | sprintf(Sendstring[15], "%02u", Value); |
in Sendstring[15] die 6 drin?
> >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.
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
@g457 leider wissen wir nicht ob die 44 als sting vorliegt.
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 :-)
was aber diesem hier wiederspricht
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.