Hallo steh gerade auf dem Schlauch. Ich empfange Daten über eine UART-Schnittstelle, die Spannungen in ASCII kodiert überträgt. Spannung in mV. 26,100 Volt kommt da also als 32, 36, 31, 30, 30 daraus die Zahl 26100 zu machen ist kein Problem. So zum Vergleichen und weiterverabeiten bräuchte ich das jetzt als 16-Bit Integer in hex, das wäre lt meinem Taschenrechner 65F4. Nur wie komme ich dahin? habs mal mit google probiert, nur die rechnen dabei ja in Dezimal, das tut aber der uC nicht. Und ich komme nicht drauf, wie das gehen könnte, jongliere mit dem taschenrechner im Hex-modus, komm aber nicht klar. Kann mir einer nen Tipp geben? Danke und Gruß Gerhard
Keine passende Lib für deine Entwicklungsumgegund gefunden ? scanf etc.
Gerhard schrieb: > daraus die Zahl 26100 zu machen ist kein Problem. Wir haben zum Glück ein Stellenwertsystem.
1 | 2*10^4 + 6*10^3 + 1*10^2 + 0*10^1 + 0*10^0 |
:
Bearbeitet durch User
Gerhard schrieb: > So zum Vergleichen und > weiterverabeiten bräuchte ich das jetzt als 16-Bit Integer in hex Ich glaube da liegt auch noch ein kleines Verständnisproblem vor. Der Wert als solches muss zum Weiterverarbeiten muss in eine Variable. Wie sie von Dir "interpretiert" wird, also Binär, Octal, Dezimal, HEX ist nur eine Betrachtungsweise. Wenn Du z.B. schreibst "wert=0x5A;" wird im Speicher der 16-bit Variable das Bitmuster "0000000001011010" abgelegt. Du hättest auch "wert=90;" schreiben können und das Ergebnis ist exakt identisch.
Gerhard schrieb: > So zum Vergleichen und > weiterverabeiten bräuchte ich das jetzt als 16-Bit Integer in hex, Wo und warum brauchst du das? Kannst du das mal näher beschreiben? Oliver
Er hat einen STRING und will daraus eine Variable machen. also mit z.B. https://de.mathworks.com/help/matlab/ref/str2num.html
Harald A. schrieb: > Wenn Du z.B. schreibst "wert=0x5A;" wird im Speicher der 16-bit Variable > das Bitmuster "0000000001011010" abgelegt. Du hättest auch "wert=90;" > schreiben können und das Ergebnis ist exakt identisch. Das stimmt zwar, geht aber an der Fragestellung völlig vorbei. Dass das Ergebnis in deinem Beispiel identisch ist, liegt ja nur daran, dass der Compiler freundlicherweise und quasi unsichtbar die Umwandlung aus dem Dezimal- ins Dualsystem vornimmt, bevor das Anwendungsprogramm gestartet wird. In dessen Speicher gibt es in dem Fall gar keine Dezimalzahl, soweit es die beiden Befehle betrifft: Die arbeiten beide mit dem Dualsystem. Die Daten, die das Programm des OP über eine serielle Schnittstelle bekommt, gelangen aber als Dezimalzahl in den Speicher des Programms, da ist nirgendwo ein Compiler beteiligt, der irgendetwas umwandelt. > eine Variable. Wie die von Dir "interpretiert" wird, also Binär, Octal, > Dezimal, HEX ist nur eine Betrachtungsweise. Nein. Das Rechenwerk des µP rechnet IMMER im Dualsystem, nie im Dezimalsystem. Der Unterschied zeigt sich z. B. bei den Ergebnissen von Addition, Multiplikation usw., die wären im Dezimalsystem ganz anders.
:
Bearbeitet durch User
Hallo dankle für die posts. atoi() wäre auch mein Favorit gewessen, gibts aber in C99 nicht mehr.
Gerhard schrieb: > Hallo > steh gerade auf dem Schlauch. Ich empfange Daten über eine > UART-Schnittstelle, die Spannungen in ASCII kodiert überträgt. Spannung > in mV. 26,100 Volt kommt da also als 32, 36, 31, 30, 30 > daraus die Zahl 26100 zu machen ist kein Problem. So zum Vergleichen und > weiterverabeiten bräuchte ich das jetzt als 16-Bit Integer in hex, das > wäre lt meinem Taschenrechner 65F4. Nur wie komme ich dahin? habs mal > mit google probiert, nur die rechnen dabei ja in Dezimal, das tut aber > der uC nicht. Und ich komme nicht drauf, wie das gehen könnte, jongliere > mit dem taschenrechner im Hex-modus, komm aber nicht klar. Kann mir > einer nen Tipp geben? (%= Mod, Rest beim Teilen) 26100 -> gößer oder gleich 16, also ist es nicht das Ergebnis, also anfangen 26100 % 16 = 4 -> letzte Stelle 26100 / 16 = 1631 -> größer oder gleich 16, also nächste Runde 1631 % 16 = 15 = F -> vorletzte Stelle 1631 / 16 = 101 -> größer oder gleich 16, also nächste Runde 101 % 16 = 5 -> vorvorletzte Stelle 101 / 16 = 6 -> kleiner als 16, also vorvorvorletzte Stelle und Abbruch fchk
Spricht ja nichts dagegen, sich beim Sourcecode von atoi() Anregungen zu holen. Den Nicht-Hex-Teil kann man ja weg lassen.
Gerhard schrieb: > atoi() wäre auch mein Favorit gewessen, gibts aber > in C99 nicht mehr. --> strtoll()
Vorschlag um die Division zu vermeiden:
26100 -> 65f4
2 * 0x2710 ; 0x2710 = 10000 in hex
+ 6 * 0x3E8 ; 0x3E8 = 1000 in hex
+ 1 * 0x64 ; 0x64 = 100 in hex
+ 0 * 0xA
+ 0 * 1
-----------
65f4
Die Multiplikationen lassen sich leicht durch Addition ersetzen,
weil der erste Faktor immer <=9 ist.
Wozu dividieren? Einfach die Stellen (ASCII-0x30) der Reihe nach Addieren und zwischendrin die Summe mal 10 nehmen. Statt Multiplikation natürlich linksschieben und die Zwischenwerte x2 und x8 addieren.
Die unterste Stelle erhälst du mit
1 | (x >> 0) & 0xf; |
Die nächste Stelle erhälst du mit
1 | (x >> 4) & 0xf; |
Die nächste Stelle erhälst du mit
1 | (x >> 8) & 0xf; |
... Um aus einer Stelle ein ASCII-Zeichen zu machen addierst du '0' falls die Stelle in 0...9 ist und ansonsten 'a'-10 (hex in Kleinschreibung). Um Großbuckstaben zu erhalten addierst du stattdessen 'A'-10.
:
Bearbeitet durch User
Hallo Jan genau, so gehts, wie Jan geschrieben hat oder oben schon der Gustl hier in Primitiv-Form: //0x26100->0x65F4 rc24 = 2*10000; rc24+= 6*1000; rc24+= 100; Die Lösung von fchk geht nicht, da der olle uC ja in hex rechnet, da kommt nur Mist raus - sorry, nicht böse gemeint, mit dem der nem ähnlichen Lösungsansatz habe ich mich schon 2 Stunden erfolglos rumgeschlagen. Danke an Alle, ihr seit die Größten!!! Gerhard
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.