Re: Mehrere Bytes von CAN-Botschaft auslesen Kategorie: Programmierung (von André H. - 13.05.2009 0:07) | ||
Als Antwort auf Mehrere Bytes von CAN-Botschaft auslesen von Simon - 6.05.2009 16:10 | ||
| ||
Hallo Simon, > ich stolpere über ein eigentlich einfaches Problem! Ich habe eine CAN-Botschaft mit der ID 0x13. > Diese Soll meine CC2 empfangen und die enthaltenen Daten auslesen. Die Botschaft hat einen DLC > von 8 Byte. Das Auslesen von CAN-Botschaften geschieht immer über Bytearrays. Diese Arrays sollten mind. 8Byte gro� sein. > Wenn ich > > can.get(1, spannung_neu) > > verwende, kopiert er mir immer nur das erste Byte in das array spannung_neu can.get() schreibt so viele Bytes in das Array, wie die Gegenstelle gesendet hat. Wenn die Gegenstelle 8 Byte sendet, werden auch mit can.get() 8 Byte in das Array geschrieben. �ber den Rückgabewert von can.get() kannst Du die Anzahl der Empfangenen Bytes prüfen. (siehe u.a. im Handbuch) > Hier mal mein Queltext > > > byte spannung[7], spannung_neu[7]; Hier haben wir schon den ersten Fehler! Warum definierst Du die Arrays mit je 7 Werten? (Index 0 bis 6 = 7 Werte) Wenn Du nun auf spannung[7] zugreifst, landest Du in Wirklichkeit in spannung_neu[0], da Du die Indexgrenze überschreitest. Dies kann auch die schönsten unvorhersehbaren "Effekte" ergeben, wenn man versucht, au�erhalb der definierten Arraygrenzen zuzugreifen, da man hier Daten im RAM verändert, die auch die Programmausfühung stark beeinflussen können. Davon abgesehen sollte man Bytearrays immer mit einer Geraden Anzahl an Elementen definieren. > loop > { > can.expect(1,0x13); > wait can.rxd(1); > if can.rxd(0) > { > if can.getID(1) == 0x13 > { > can.get(1, spannung_neu); > if spannung_neu != spannung Das funktioniert so nicht. Man kann Arrays nicht direkt vergleichen. Der Compiler macht hieraus if spannung_neu[0] != spannung[0] Wenn Du Arrays oder Strings vergleichen willst, mu�t Du mit einer der Vergleichsfunktionen von strx.c2 arbeiten. In diesem Fall strx.compsel(). > { > can.send(2,0x30,spannung_neu,8); > plm.beep(14); > sleep 100; > plm.beep(-1); > sleep 50; > spannung = spannung_neu; Auch das geht nicht. Selbiger Grund, wie oben beim Vergleich. Es wird hier nur Element [0] kopiert. Wenn Du einen ganzes Array kopieren willst, mu� Du mem.copy() verwenden. > } > } > } > can.get(1, spannung_neu); > } > MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Mehrere Bytes von CAN-Botschaft auslesen (von Simon - 13.05.2009 10:15) Re: Mehrere Bytes von CAN-Botschaft auslesen (von Simon - 13.05.2009 10:15) |