zu dumm Daten in einem String abzulegen?!?

Gast #5615
Lesenswert?
• ▲
▼
Hallo,

ich hab' mich bereits recht lange selber mit dem Problem beschäftigt, 
aber da mir in naher Zukunft keine Lösung zu kommen scheint frag' ich 
doch mal lieber euch - ich denke das Problem ist eigentlich echt simple 
zu lösen - ich seh's oder weiß es bloß mal wieder nicht:

warum ist

kompass = (0x01*256 + 0x91)/2;
__________________________________________
nicht gleich :

uart_rxbuf[1] = 0x01;
uart_rxbuf[2] = 0x91;

kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2;

????
Es geht ja nur um die Zahlen - die Formel ist wurscht.
Ziel ist es einen elektronischen Kompass auszulesen (2xcm-1 oder so 
heißt der)

Vielen Dank für eure Unterstützung!!!

Christian
Gast #5616
Lesenswert?
• ▲
▼
Ist die Variable Kompass oben evtl. von einem anderen Datentyp als 
Kompass unten? (16bit vs. 8bit)?
Ich kann mir da nur was mit Überlauf vorstellen...

>warum ist
[...]
>nicht gleich :
sollte eigentlich gleichwertig sein.
Was funktioniert denn nicht?

Schmittchen.
Gast #5617
Lesenswert?
• ▲
▼
Hallo Schmittchen,

Danke sehr für deine Antwort!!!!
Die Variablen sind beide gleich!!! Bei mgl. 1 kommt 200 aus dem Display 
raus, bei Mgl. 2 kommt 72 raus - Mgl. 1 stimmt - 2 nicht. Es ist in der 
exakt selben Funktion - ich nehm entweder die eine Zeile raus und 
ersetze sie durch die Variablen, die ich zuvor auf den selben Wert setze 
- und schon kommt was anderes raus!!!! Gibts vielleicht eine andere 
Möglichkeit aus einem UART String die richtigen Zahlen rauszuholen????

Vielen Dank

Christian

PS: vielleicht hab' ich ja den String falsch initialisiert:

char uart_rxbuf[4];
unsigned char uart_rx_pos;

-ist das korrekt????
Gast #5618
Lesenswert?
• ▲
▼
Das muß aber doch ein Problem mit einem Überlauf sein!

> unsigned char uart_rx_pos;
was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun.

Ich vermute folgendes:
>kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2;
der erste Rechenschritt lautet uart_rxbuf[1]*256, das Ergebnis wird 
evtl./wahrscheinlich/vielleicht im Register zwischengespeichert, in dem 
vorher uart_rxbuf[1] gespeichert war?!?! Das würde überlaufen und wäre 
danach 0. Dann + 0x91. Dann geteilt durch 2 ergäbe die 72(dez).

Im anderen Fall macht der Compiler daraus wahrscheinlich was anderes.

Ich kann deine verzweifelte Sucherei gut nachvollziehen.

Schmittchen.
Gast #5619
Lesenswert?
• ▲
▼
Ich habe doch gewußt, daß ich noch was vergessen habe (wurde gestört).

Also: Was dagegen tun?
Ich würde es mal mit einem Cast auf eine 16Bitvariable versuchen.

kompass = ( unsigned int(uart_rxbuf[1]*256) + uart_rxbuf[2] ) /2;

wenn alles fehlschlägt noch einen Cast auf die gesamte Summe. Das sollte 
dann aber reichen.

Schmittchen.
Gast #5620
Lesenswert?
• ▲
▼
Hallo,

es funktioniert leider immer noch nicht. Wenn der Wert tatsächlich in 
der Variable abgespeichert wird wär das doch tierisch blöd, weil ich ja 
mit dem Variableninhalt nochmal rechnen möchte und die nicht plötzlich 
nen anderen Wert haben soll!!!
Das mit deinem Cast hab' ich vermutlich missverstanden - bzw. hats der 
Compiler missverstanden und ich hab' das folgendermaßen unelegant 
gelöst:

unsigned int variable;
unsigned int variable2;
uart_rxbuf[1] = 0x01;
uart_rxbuf[2] = 0x91;
kompass = ( variable2 = (variable = uart_rxbuf[1]*256) + 
uart_rxbuf[2])/2;

es kommt dabei immer noch 72 raus.

"> unsigned char uart_rx_pos;
was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun." - 
nein hat nix damit zu tun.

Der Compiler gibt mir aber auch keinen Warnmeldungen mit möglichem 
Überlauf oder sowas aus - bin echt am Verzweifeln....


Viele Grüße

Christian
Gast #5621
Lesenswert?
• ▲
▼
Hurra - Problem gelöst!!!!!!!

ich Trottel hab' char uart_rxbuf[4]; statt
unsigned char uart_rxbuf[4]; geschrieben - ich weiß zwar nicht warums 
nicht als char ohne unsigend funktioniert, möchte mich aber trotzdem 
nochmal für deine Ideen und Tips bedanken!!!


Christian
Gast #5623
Lesenswert?
• ▲
▼
> Wenn der Wert tatsächlich in der Variable abgespeichert wird wär das doch 
tierisch blöd

Ich hatte mir das nur so gedacht. Wär ja möglich gewesen, daß der 
Compiler die Variable aus dem SRAM in ein Register zieht, um dann mit 
dem Register die Berechnungen durchzuführen. Die Originalvariable im 
SRAM bliebe davon unbeeindruckt. War nur ein Versuch das seltsame 
Verhalten zu ergründen. Zum Glück macht der Compiler das ja jetzt dank 
konkreter Angaben (unsigned...) richtig.

Schmittchen.
Gast #5625
Lesenswert?
• ▲
▼
Hallo zusammen,

@ schmittchen: Tschuldigung, dass ich meine Meinung über deine Idee 
weiter oben so negativ dargestellt habe - war wirklich nicht meine 
Absicht!!!!!! Bei einem 2. durchlesen hatte mein Posting auch auf mich 
eine ziemlich beleidigende Wirkung - war nicht so gedacht!!!

Vielen Dank allen nochmals!!

Christian
Gast #5626
Lesenswert?
• ▲
▼
> Tschuldigung, dass ich [...] deine Idee weiter oben so negativ dargestellt habe

Hoppla, hab ich garnicht bemerkt/so empfunden.

Es muß nicht jeder Thread mit einem "Danke", "Super" usw. enden, sondern 
es wäre schön, wenn der Fragesteller am Ende des Threads seine/die 
Lösung bzw. die Art des Umsetztens hier kurz rückmelden würde. Das 
möchte ich nur ganz allgemein erwähnen. Du hast das ja zwischendrin 
schon gemacht.
Manchmal tauchen auch Fragen auf, die von keinem beantwortet werden 
(können), der Fragesteller die Lösung alleine findet und diese dann 
anschließend hier auch noch postet. Klingt dann zwar manchmal nach 
Monolog, hilft aber weiter, wenn jemand in der gleichen Situation 
steckt.

Schmittchen. "Vielen Dank für Ihre Aufmerksamkeit :-)"

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.