Hallo!
Ich habe in einem "uint8_t rxbuffer[100]" Daten liegen.
Ich möchte diese Daten in einem normalen Byte wie folgt definiert "
uint8_t data1" einlesen.
z.B. steht bei rxbuffer[10]: decimal 30. ( Ich sehe im Debug Modus im
AVR Studio das ich diese Daten tatsächlich drinnen hab im rxbuffer)
Ich habe versucht über "byte1 = rxbuffer[10];" sowohl auch mit "byte1 =
*(rxbuffer+10);" die Daten einzulesen.
Kein Erfolg.
Was mache ich denn falsch?
PS:Ich bekomme keine Fehlermeldung beim compilieren im AVR Studio
Danke
Luke schrieb:> "byte1 = rxbuffer[10];"
das ist richtig so. Wenn dennoch ein nicht erwartetes Ergebnis kommt,
liegt der Fehler an anderer Stelle.
> sowohl auch mit "byte1 = *(rxbuffer+10);"
Wenn das dein Compiler ohne Warnungen frisst, solltest du die entweder
die Einstellungen ansehen oder einen anderen Compiler aussuchen. Nicht
alles, was syntaktisch akzeptabel ist, ergibt das gewünschte Ergebnis.
Einfach mal ganz doof und nur der Vollständigkeit halber:
Du schreibst, dass dein Datenbyte wie folgt heißt: uint8_t data1
Nachher schreibst du allerdings "byte1 = rxbuffer[10];" ist das
richtig?! Habe es so verstanden, dass es wie folgt heißen soll: data1 =
rxbuffer[10];
Will nicht deine Intelligenz in Frage stellen, aber manchmal hat man ein
extrem großes Brett vorm Kopf ;)
EDIT: Bin anscheinend nicht der einzige dem das aufgefallen ist ^^
Stefan Schmidt schrieb:> Einfach mal ganz doof und nur der Vollständigkeit halber:> Du schreibst, dass dein Datenbyte wie folgt heißt: uint8_t data1>> Nachher schreibst du allerdings "byte1 = rxbuffer[10];" ist das> richtig?! Habe es so verstanden, dass es wie folgt heißen soll: data1 => rxbuffer[10];>> Will nicht deine Intelligenz in Frage stellen, aber manchmal hat man ein> extrem großes Brett vorm Kopf ;)
Sorry war mein Fehler! Ich meinte natürlich: uint8_t byte1,
und byte1 = rxbuffer[10];
dummy schrieb:> Setz den Breakpoint eine Zeile unter>> byte1 = rxbuffer[10];
Habe ich gemacht. Bekomme keinen Wert in byte1 obwohl im AVR Studio
Debug Modus ich die Daten drinnen stehen habe.
Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß
sie überschrieben wird? Evtl. in einer ISR?
Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==",
das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter
Fehler :-)
npn schrieb:> Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß> sie überschrieben wird? Evtl. in einer ISR?>> Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==",> das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter> Fehler :-)
Zu beidem Nein.
Luke schrieb:> npn schrieb:>> Veränderst du an anderer Stelle vielleicht die Variable "byte1", so daß>> sie überschrieben wird? Evtl. in einer ISR?>>>> Oder vielleicht hast du bei einem Vergleich "=" geschrieben statt "==",>> das wäre dann eine Zuweisung statt einem Vergleich. Ein gern gemachter>> Fehler :-)>> Zu beidem Nein.
Dann wiederhole ich nochmal die Frage von Gerald. Woher weißt du, daß
der Wert nicht übernommen wird?
Luke schrieb:> Bekomme keinen Wert in byte1 obwohl im AVR Studio> Debug Modus ich die Daten drinnen stehen habe.
Wie stellst du das fest, daß du keinen Wert "bekommst"?
Luke schrieb:> Hier ein Screenshot
mit oder ohne Optimierung?
Wenn die Variablen nicht verwendet werden, optimiert er es weg. mache
mal ein printf einfach rein.
Wenn das alles ist, was in deiner While-Schleife drin steht, könnte es
sein, daß der Compiler die Zuweisung wegoptimiert. Denn die Variablen
werden nicht weiterverwendet. Müßte auch eine Warnung vom Compiler
kommen.
Alternativ schalte mal die Optimierung ganz aus und debugge nochmal.
In solchen Fällen hilft ein AssemblerListing oder der Disassembler von
AVR Studio, um zu sehen, ob deine C-Anweisungen überhaupt abgearbeitet
werden.
Wie schon geschrieben wurde: Da du die Variablen nicht weiterverwendest,
könnten sie wegoptimiert worden sein.
Kann es sein, dass Byte? eine lokale Variable ist und Du eine andere,
gleichnamige beobachtest?
Eine weitere Möglichkeit wäre, beim letzten Kompilieren ist was in die
Hose gegangen und der hinter der Anzeige liegende Code differiert.
Also: Lösch' beide Beobachtungsfenster (nicht nur schließen); kompiliere
den Code neu und behalte das Ausgabefenster im Auge; bau' die
Beobachtungsfenster neu auf und versuch den Code erneut.
Zum Code selbst: Manchmal haut die Optimierung ganze Codesequenzen raus,
wenn Du die Zuweisung XXX = YYY zur ersten Variablen später nicht
benutzt. Gelegentlich hilft eine Abfrage wie: if (XXX)oder die
Optimierung ganz abschalten.