Forum: Mikrocontroller und Digitale Elektronik Can Bus Daten filtern


von Tm123 (Gast)


Lesenswert?

Hallo zusammen,

bin gerade dabei Can Bus Daten auszulesen.

Bekomme mit folgendem Programm alle ID's des Fahrzeuges angezeigt:

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);                               // Set CS to pin 10


void setup()
{
  Serial.begin(115200);
  CAN0.begin(CAN_250KBPS);                       // init can bus :
  pinMode(2, INPUT);                            // Setting pin 2 for 
/INT
  Serial.println("MCP2515 Library Receive Example...");
}

void loop()
{
    if(!digitalRead(2))                         // If pin 2 is low, read
    {
      CAN0.readMsgBuf(&len, rxBuf);              // Read data: len = 
data
      rxId = CAN0.getCanId();                    // Get message ID
      Serial.print("ID: ");
      Serial.print(rxId, HEX);
      Serial.print("  Data: ");
      for(int i = 0; i<len; i++)                // Print each byte of 
the data
      {
        if(rxBuf[i] < 0x10)                     // If data byte is less
        {
          Serial.print("0");
        }
        Serial.print(rxBuf[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
}


zum Beispiel werden Id's mit folgendem HEX Wert angezeigt:

ID:1   Data: 16 00 00 00 00 00 00 00
ID 44C Data: 01 02 03 04 05 06 07 08

möchte dieses nun auf nur EINE ID filtern aber bekommen keine passendes 
Programm geschrieben. Das mit zum Beispiel nur die ID 44C angezeigt 
wird.

Kann mir da jemand weiterhelfen??

VIelen Dank im Voraus

von H.Joachim S. (crazyhorse)


Lesenswert?

CAN0.readMsgBuf(&len, rxBuf);              // Read data: len = data
rxId = CAN0.getCanId();                    // Get message ID
if (rxID==xxx)
    {  Serial.print("ID: ");
      Serial.print(rxId, HEX);
      Serial.print("  Data: ");
      for(int i = 0; i<len; i++)
     }

von Tom (Gast)


Lesenswert?

Du kannst auch Hardwarefilter im MCP2515 setzen. Dann erfährt der 
Arduino von den Messages mit anderen IDs gar nichts.

Die CAN_BUS_Shield-Library abstrahiert so dünn und ist so wenig 
dokumentiert, dass du selbst ins Datenblatt UND in den Code sehen musst, 
um die Filter zu benutzen.

von Tm123 (Gast)


Lesenswert?

Dankeschön für die schnelle Antwort.

habe jetzt meine Programm wie folgt umgschrieben:

void loop()
{
    if(!digitalRead(2))                         // If pin 2 is low, read
    {
      CAN0.readMsgBuf(&len, rxBuf);              // Read data: len =
      rxId = CAN0.getCanId();                    // Get message ID
      if (rxId==xxx)
          {
            Serial.print("ID: ");
            Serial.print(rxId, HEX);
            Serial.print("  Data: ");
            for(int i = 0; i<len; i++)            // Print each byte of

      {
        if(rxBuf[i] < 0x10)                     // If data byte is less
        {
          Serial.print("0");
        }
        Serial.print(rxBuf[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
}
}

Bei xxx habe ich meine ID hineingeschrieben.
Nun bekomme ich leider gar keine Daten mehr angezeigt.

Habe ich etwas falsch programmiert oder muss ich den unteren Teil 
weglassen?

mfg
Tm

von dummschwaetzer (Gast)


Lesenswert?

long unsigned int rxId;
was nun unsigned ling oder unsigned int?

von Tm123 (Gast)


Lesenswert?

long unsigned int ist ja für einen 29bit Identifier
und
unsigned int für einen 11bit Identifier oder liege ich da falsch??

von Tm123 (Gast)


Lesenswert?

so es funktioniert jetzt doch ;-)

Vielen dank an Joachim Seifert..

Problem war das ich den Identifier in HEX eingegeben habe und nicht in 
DEZ.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.