Probleme mit can-bus und 2 If bedingungen

Hallo ich hab nen uno mit nem can-bus shield

wenn ich bei if nur eine bedingung festlege funktionierts einwandfrei
der arduino reagiert und sendet auf ner anderen id die gewünschte nachricht
verwende ich aber && und setze 2 bedingungen dann geht nichts mehr

und ein weiteres problem habe ich sind 2 dieser bedingungen erfüllt und es kommt eine dritte hinzu
hätte ich gerne das mein programm solange auf jener id eine nachricht sendet bis eben eine andere bedingung wieder erfüllt ist

so funktionierts

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

//********************************Setup Loop*********************************//

void setup() {
  Serial.begin(9600);
  Serial.println("CAN Write - Testing transmission of CAN Bus messages");
  delay(1000);
  
  if(Canbus.init(CANSPEED_125))  //Initialise MCP2515 CAN controller at the specified speed
    Serial.println("CAN Init ok");
  else
    Serial.println("Can't init CAN");
    
  delay(1000);
}

//********************************Main Loop*********************************//

void loop(){

  tCAN message;
  if (mcp2515_check_message()) 
  {
    if (mcp2515_get_message(&message)) 
  {
        if(message.id == 0x084 and message.data[] <= 0x04) 
             {
               
        message.id = 0x011; //formatted in HEX
        message.header.rtr = 0;
        message.header.length = 8; //formatted in DEC
        message.data[0] = 0x00;
        message.data[1] = 0x00;
        message.data[2] = 0x00;
        message.data[3] = 0x00; 
        message.data[4] = 0x00;
        message.data[5] = 0xE4; //formatted in HEX
        message.data[6] = 0x00;
        message.data[7] = 0x00;

mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
mcp2515_send_message(&message);
delay(90); }
   }
  }
}

setze ich die 2te Bedingung mit && gehts nicht mehr

if((message.id == 0x084 and message.data[1] <= 0x04)&&(message.id == 0x010 and message.data[5] < 0xEC)) 
             {
               
        message.id = 0x011; //formatted in HEX
        message.header.rtr = 0;
        message.header.length = 8; //formatted in DEC
        message.data[0] = 0x00;
        message.data[1] = 0x00;
        message.data[2] = 0x00;
        message.data[3] = 0x00; 
        message.data[4] = 0x00;
        message.data[5] = 0xE4; //formatted in HEX
        message.data[6] = 0x00;
        message.data[7] = 0x00;

mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
mcp2515_send_message(&message);
delay(90); }
   }
  }
}

keine ahnung wo das problem liegt
vl am original can-bus?
id 084 wird mit 100ms gesendet
id 010 wird mit 50ms gesendet

ich weis auch das es schönere arten gibt das um zu setzen aber ich bin blutiger anfänger gggg

Ich wundere mich schon darüber, dass die erste Version funktionieren soll:

message.id == 0x084 and message.data[] <= 0x04
  1. "and" ist kein mir bekannter C++ Operator
  2. Welches Byte aus der Nachricht soll kleiner 4 sein? Momentan prüfst Du nur die Adresse des Arrays.

Meist klammere ich ganz altmodisch alle Bedingungen sauber ein - dann muss ich mir auch keine Gedanken über Vorrangregeln machen.

(message.id == 0x084) && (message.data[0] <= 0x04)

and" ist kein mir bekannter C++ Operator

Doch. Das ist Standard C/C++

https://en.cppreference.com/w/cpp/keyword

wno158:
Ich wundere mich schon darüber, dass die erste Version funktionieren soll:

message.id == 0x084 and message.data[] <= 0x04
  1. "and" ist kein mir bekannter C++ Operator
  2. Welches Byte aus der Nachricht soll kleiner 4 sein? Momentan prüfst Du nur die Adresse des Arrays.

Meist klammere ich ganz altmodisch alle Bedingungen sauber ein - dann muss ich mir auch keine Gedanken über Vorrangregeln machen.

(message.id == 0x084) && (message.data[0] <= 0x04)

das wären ja wieder 2 bedinungen

and und && sind absolut 2 verschiedene dinge so wie ich es rausgelesen habe
aber wie gesagt blutiger anfänger

so wie ich es geschrieben habe mit id and data passt schon funktioniert auch

wie gesagt setze ich ich 2 bedienungen geht gar nichts mehr

das ist mein problem

kangool001:
and und && sind absolut 2 verschiedene dinge so wie ich es rausgelesen habe

Logisch machen sie das Gleiche. Das ist nur eine alternative Schreibweise

siehste wieder was dazu gelernt :slight_smile:

and und && sind absolut 2 verschiedene dinge so wie ich es rausgelesen habe

Nöö...
Das ist exakt das gleiche.

so wie ich es geschrieben habe mit id and data passt schon funktioniert auch

Dieses halte ich auch für Unsinn:

message.data[]

error: expected primary-expression before ']' token

sorry tippfehler hier im forum

message.data[1]

Das kann doch niemals wahr werden:

(message.id == 0x084 and message.data[1] <= 0x04)&&(message.id == 0x010 and message.data[5] < 0xEC)

message.id kann doch nicht gleichzeitig 0x084 und 0x010 sein. Da geht immer nur entweder - oder.
Gehört da nicht eher eine oder-Verknüpfung dazwischen?

aber es geht ja darum das wenn ich nur eine bedingung stelle es funktioniert

schreibe ich aber if ((1te cannachricht) && (2te cannachricht andere id))

dann gehts nichtmehr....

dann bekomme ich keine antwort mehr vom can shield

ok kann ich also nicht auf 2 ids zuhören zur seben zeit

1x id 010 und 1x id 084

also die 2 bedinungen müssen erfüllt sein

sendet id 10 eine gewisse nachricht und zur gleichen zeit die id 84 eine gewisse nachricht dann soll der arduino auf id 11 etwas senden....kann dauernd sein solange diese bedinungen erfüllt sind oder eben nur 5x oder 6x
das spiellt dann keine rolle da entsprechendes gerät ab der 4ten oder 5 ten nachricht darauf reagiert

ist fürs auto
quasi ist schalterstellung d und geschwindigkeit xx dann sende id11 message xxx

kangool001:
aber es geht ja darum das wenn ich nur eine bedingung stelle es funktioniert

schreibe ich aber if ((1te cannachricht) && (2te cannachricht andere id))

dann gehts nichtmehr....

dann bekomme ich keine antwort mehr vom can shield

Dann muss Du das eben 'oder' verknüpfen: Wenn die eine ODER die andere Nachricht ankommt, dann tu was. Es können ja nicht beide Nachrichten gleichzeitig ankommen :wink:
also if ((1te cannachricht) || (2te cannachricht andere id))

Wenn Du auf beide abfragen willst, können die ja nur nacheinander kommen. Dann musst Du dir merken, dass die erste gekommen ist, und das dann bei der 2. abfragen ( also ob die 1. vorher schon da war ). Das geht dann nicht mehr in einer Abfrage.

ok dann muss ich nach einer lösung suchen....denn es müssen beide nachrichten wahr sein um die aktion aus zu lösen...da ist dan 'oder' nicht die richtige lösung un meinem fall

Wie willst Du auf dem CAN gleichzeitig 2 verschiedene Nachrichten bekommen?

Gruß Tommy

MicroBahner:
Das kann doch niemals wahr werden
[...]
message.id kann doch nicht gleichzeitig 0x084 und 0x010 sein.

Klarer kann man es nicht sagen, fürchte ich ...

Gehört da nicht eher eine oder-Verknüpfung dazwischen?

Auch mit dieser Vermutung hat MicroBahner wahrscheinlich recht.

Das Problem hat nichts mit CAN Bus zu tun, sondern mit deinem Verständnis von [color=blue]&&[/color] und [color=blue]||[/color].

Oder mach doch für die beiden Ereignisse zwei Aktionen:

void loop() {
   tCAN message;
   if (mcp2515_get_message(&message))
   {
           if(message.id == 0x084 && message.data[0] <= 0x04) sendMessage();
           if(message.id == 0x010 && message.data[5] <  0xEC) sendMessage();
  }
}
void sendMessage() {
  tCAN msg; // ein eigener Datenblock zum senden
  ... 
  mcp2515_send_message(&msg);

}

Falls das evtl. leichter verständlich ist ?

gut werd ich dann versuchen....danke erstmals für den tipp...

werd euch wahrscheinlich später weiternerven ggg
wenns dann um die " pause" geht....

herzlichen dank für die regen antworten...top

kangool001:
ok dann muss ich nach einer lösung suchen....denn es müssen beide nachrichten wahr sein um die aktion aus zu lösen...da ist dan 'oder' nicht die richtige lösung un meinem fall

Dann wird es eben etwas komplizierter, denn die können ja nicht gleichzeitig kommen. Da wirst Du - wie schon geschrieben - mit Merkern arbeiten müssen.
Kommen die beiden Messages denn unmittelbar hintereinander? Ich denke, wenn da beliebig viel anderes dazwischen kommt, soll es doch sicher auch nicht auslösen, oder?

id 10 kommen nur 4 verschidene nachrichten E0 E4 E8 EC (schalterrposition automatik PRND)
und id 84 ändert sich je nach geschwindigkeit
und später kommt noch eine dritte id dazu 131 sind die parksensoren/steuergerät

ich möchte mit dem arduino eben das parkmodul an und ausschalten indem ich die abfrage vom steuergrät (signalconfig) von id10 auf id11 geändert habe

um eben zu realisieren das pdc nicht nur bei R angeht sondern auch vorwärtsfahren bei geschwindigkeit xx (ca 10kmh)

beim original geht pdc eben nur an wenn auf id10 E4 (R) gesendet wird

id 11 ist nicht belegt somit gibts auch keine kollision mit irgendeiner anderen nachricht bzw id auf dem can-bus

so wie es aussieht muss ich vielleicht doch mit buffer arbeiten und die id´s mit den datugehörigen nachrichten dort rausholen

zusätzlich muss ich einen Filter setzen um nicht immer den ganzen Id´s zuhören zu müssen sondern nur den dreien die ich brauch

wird schon irgendwie klappen bin da zuversichtlich

Hi

Sorry - aber Deine Posts lesen sich echt ermüdend.
Bitte benutze große Buchstaben, auch Satzzeichen wurden nicht nur erfunden, um damit Schüler quälen zu können.

MfG