C / Mikrocontroller
-
Danke erstmal für die Hilfe, habs inzwischen ein bisschen umgeschrieben und funktioniert auch. Sieht derzeit so aus:
void setup(){ Serial.begin(9600); } void loop(){ static int counter = 1; if (counter == 1) { int i; int j; int k; int l; int f; static char ausgabe[17]; static char wirkleistungt1[17]; static char wirkleistungt2[17]; static char wirkenergie[9]; char test[] = "1B1B1B0101010176050195B2F462006200726301017601010500873B900B0649534B0104CEE6DCFD810163BA810076050195B2B5620062007263070177010B0649534B0104CEE6DCFD870100620AFFFFFB62016500C0750A7777078181C7C203FF810101010449534B0177070100000009FF810101010B0649534B0104CEE6DCFD8177070100010800FFF70000018201621E52FFFD00000000012A491A0177070100010801FF8101621E52FFFD00000000012A411A0177070100010802FF8101621E52FFFD00000000000008000177070100100700FF8101621B520055000002290177078181C7C205FF810101018302A2CCA002791F089D3963BB6B7792D1BDA74DCAB4ADD1C02CBFA52AD7A971C0FB4641F1DC2698712B08C3FD74447C9E440101016355BA0076050195B2B66200E200726302017101632A8F001B1B1B1B"; for (i=0; i <= 15; i++) { ausgabe[i] = test[298+i]; } ausgabe[16] = 0; for (j=0; j <= 15; j++) { wirkleistungt1[j] = test[346+j]; } wirkleistungt1[16] = 0; for (k=0; k <= 15; k++) { wirkleistungt2[k] = test[394+k]; } wirkleistungt2[16] = 0; for (j=0; j <= 7; j++) { wirkenergie[j] = test[442+j]; } wirkenergie[8] = 0; Serial.println(ausgabe); Serial.println(wirkleistungt1); Serial.println(wirkleistungt2); Serial.println(wirkenergie); counter = (counter +1); } }
Und ja, wird später für einen Arduino.
Kenne das alles nur aus ganz ganz anderen Programmiersprachen und habe mich hier nur selber mal eingelesen um ein bisschen als Hobbybastler rum zu probieren
Könnte das ganze auch am Ende in Dezimal umwandeln, die Zahlen werden maximal 9-Stellig im Dezimalbereich, hatte eigentlich gedacht man könnte das schön in einen String umwandeln und dann durch ein anhängen von DEC umwandeln, Satz mit X
-
Wenn es binäre Daten sind, kannst du mit dem println nicht viel anfangen.
Dann kannst du dein test[] aber auch anders anlegen.
-
Das funktioniert mitlerweile ja soweit alles, die Ausgabe ist sowieso nur Testweise eingefügt damit ich sehe, was ich an welcher Stelle wirklich gespeichert habe um die Fehler frühzeitig zu sehen.
test[] ist ebenfalls nur vorrübergehend angelegt, damit ich die nachfolgenden Funktionen schon erstellen kann. Später soll das Testarray von einer anderen Quelle ausgelesen werden, aber die Funktion ist so weit fertig.
-
Da du sagst, dass es höchstens 9 stellige Werte sind, kannst du die Umwandlung HEX-DEC auch mit einem 32-Bit Zwischenwert machen. Oder sicherheitshalber 64-Bit, falls deine 16-char großen Arrays eine Obergrenze sind, die später vielleicht irgendwann mal ausgereizt werden könnte. Das macht die Umrechnung unkompliziert, da du die normalen Schultechniken zur Darstellung von Ziffernsystemen benutzen kannst, ohne dich mit der Speicherung der Zwischenergebnisse herum schlagen zu müssen.
Noch Fragen, JumpY?
-
Sonstige Sachen sind nicht, aber hast du zufällig eine Seite wo eine von dir angesprochene Umwandlung mal gezeigt wird?
-
Na, wie in der Grundschule: Erste Ziffer sind die Einer, zweite Ziffer sind die Zehner, dritte Ziffer die Hunderter. Bloß sind's im Hexadezimalsystem Einer, 16er, 256er, usw.
Das heißt, ein bisschen Division und Modulo und du bist fertig.
-
Alles klar, dann mache ich es so wie ich es mir überlegt hatte mit "case ..." zu jeder einzelnen Stelle
Vielen Dank.
-
JumpY schrieb:
Alles klar, dann mache ich es so wie ich es mir überlegt hatte mit "case ..." zu jeder einzelnen Stelle
Die Antwort hätte ich nun nicht erwartet.
Wo kommen denn die Zahlen 1, 10, 100, 1000, usw. her? Da ist ein Zusammenhang mit der Anzahl der Ziffern: 10.
Der gleiche Zusammenhang gilt in allen anderen Ziffernsystemen, bloß mit unterschiedlicher Zahlen von Ziffern. Bei 16 eben 1, 16, 256, 4096, 65536, usw.
Denk da unbedingt drüber nach. Zur Not hilft der Link. Wenn dir das bisher tatsächlich noch nicht bekannt war, dann wirst du hinterher die Zahlenwelt mit anderen Augen sehen, das verspreche ich dir.
Wenn du das verstanden hast, dann kannst du auch ganz ohne Hilfe vom 7.356er ins (1.764 + i*848.23)er System umrechnen, egal wie verrückt dies gerade für dich klingen mag.
-
Nur mal so, wenn es eh ein Arduino wird und du wohl Werte durch die Gegend schicken willst, dann schick doch ints: http://arduino.cc/en/Serial/Print
-
@ GER_Moki , ja es werden Daten so geschickt, jedoch brauche ich für zwischendurch schonmal Testwerte, die ich gerne in Dezimal hätte da ich diese mit bestimmten Listen abgleiche.
@ SeppJ , normalerweise ist mir der Zusammenhang dieser Zahlen durchaus bekannt. Meine Idee war es, die Zahl Stück für Stück zu verarbeiten. 1. Ziffer * 16^0, 2. * 16^1 usw. Sah dann ungefähr so aus, auch wenn die pow()-Funktion nicht funktioniert und nur absoluten Schwachsinn auswirft. Fand ich für mich vom denken her nicht wirklich schwierig, aber scheinbar gehts ja noch viel einfacher wie du das sagst auch wenn ich damit nicht wirklich etwas anfangen kann.
for (f=0; f<=15; f++) { switch (ausgabe[f]) { case '0': temp = 0; break; case '1': temp = 1; break; case '2': temp = 2; break; case '3': temp = 3; break; case '4': temp = 4; break; case '5': temp = 5; break; case '6': temp = 6; break; case '7': temp = 7; break; case '8': temp = 8; break; case '9': temp = 9; break; case 'A': temp = 10; break; case 'B': temp = 11; break; case 'C': temp = 12; break; case 'D': temp = 13; break; case 'E': temp = 14; break; case 'F': temp = 15; break; default: temp = 99; } value = value + temp*pow(16,15-f); } Serial.print(value);
-
JumpY schrieb:
Meine Idee war es, die Zahl Stück für Stück zu verarbeiten. 1. Ziffer * 16^0, 2. * 16^1 usw. Sah dann ungefähr so aus, auch wenn die pow()-Funktion nicht funktioniert und nur absoluten Schwachsinn auswirft.
Ich glaube hier liegt das Problem. pow sollte eigentlich keinen Schwachsinn auswerfen. Du benutzt es sicherlich falsch.
Weiterhin ist dir hoffentlich bekannt, dass '^' in C keine Potenz ist, sondern XOR, oder?
Aber im Prinzip brauchst du gar nirgends direkt zu potenzieren, ein paar Multiplikationen/Divisionen, immer wieder wiederholt, sind genug.
Guckste als Anregung:
https://ideone.com/DcPvEg
-
Ja weiß ich, deshalb habe ich die Funktion dazu doch einen Post über deinem eingefügt wie ich es versucht habe.
Die von dir geposteten Funktionen habe ich ebenfalls schon durchprobiert, der Mikrocontroller versteht das printf aber nicht, beziehungsweise kann er das nicht ausgeben. Mit anderen Printfunktionen erzeuge ich in der Konstellation nur Fehlermeldungen leider.
-
Dann liegt das in deiner Fehlbenutzung der ausgabefunktionen, nicht an der Umrechnung. Das printf ist bei mir doch sogar nur zur Demo drin, kein Teil des Umrechnungscodes. Da musst du natürlich die Funktionen deines Mikrocontrollers nehmen, die ich bei dem Onlinecompiler schließlich nicht benutzen kann. Ich wollte dir nur zeigen (und nur als grober Ansatz! Du siehst an der Ausgabe, dass das noch wesentlich schöner ginge!), wie man das Problem durch Rechnen löst anstatt durch switch. Damit du die Mathematik besser verstehst.
-
Also es lag definitiv an der Fehlbenutzung, weil ich irgendwie jedesmal ein Overload erzeugt habe. Habe mir die ganze Sache nochmal durchgeschaut und bin mitlerweile zu einem sehr zufriedenstellenden Ergebnis gekommen.
Vielen Dank für eure Hilfe, vermutlich wird man sich nochmal hören