Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
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)