Hello guys,
I've faced the same problem. I want to read some messages from a CAN bus, but there are so many messages, so my Arduinos (i have Leonardo and Uno) cannot handle them all. Maximum - 3-4 messages.
Could you please help me with code optimization:
// demo: CAN-BUS Shield, receive data
#include <mcp_can.h>
#include <SPI.h>
unsigned char Flag_Recv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
String message;
int errMessage;
int count=0;
void setup()
{
Serial.begin(115200);
delay(3000);
pinMode (10, OUTPUT);
digitalWrite (10, LOW);
if(CAN.begin(CAN_500KBPS)) {
Serial.println("CAN Init ok"); // init can bus : baudrate = 500k
}
else {
// Serial.println("CAN Init ERROR"); // init can bus : baudrate = 500k
}
//CAN.init_Filt(0,0,1665);
attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt
Serial.println("Init finished");
}
void MCP2515_ISR()
{
Serial.println("1");
Flag_Recv = 1;
if (Flag_Recv == 1) {
message = "";
Flag_Recv = 0; // clear flag
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
errMessage = 0;
errMessage = CAN.checkError();
if (errMessage != 0) {
Serial.print ("Error = ");
Serial.println(errMessage);
}
//Serial.println("t");
/*Serial.println(CAN.getCanId());
delay(1);*/
count++;
Serial.println(count);
if (count>9) {
count = 0;
}
//Serial.println("interrupt");
message += CAN.getCanId();
if (message == "1665") {
message += " ";
message += len;
message += + " ";
//Serial.print("data len = ");
//Serial.print(len);
for(int i = 0; i<len; i++) // print the data
{
//Serial.print(buf[i]);
//Serial.print("\t");
message += buf[i];//+ " ";
message += " ";
}
//Serial.println(message.length());
//delay(10);
Serial.print(message);
Serial.println();
}
//delay(100);
}
}
void loop()
{
/*if(Flag_Recv) // check if get data
{
message = "";
Flag_Recv = 0; // clear flag
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
errMessage = 0;
errMessage = CAN.checkError();
if (errMessage != 0) {
Serial.print ("Error = ");
Serial.println(errMessage);
}
//Serial.println("t");
//Serial.println(CAN.getCanId());
//Serial.println("interrupt");
message += CAN.getCanId();
if (message == "1665") {
message += " ";
message += len;
message += + " ";
//Serial.print("data len = ");
//Serial.print(len);
for(int i = 0; i<len; i++) // print the data
{
//Serial.print(buf[i]);
//Serial.print("\t");
message += buf[i];//+ " ";
message += " ";
}
//Serial.println(message.length());
//delay(10);
//Serial.print(message);
//Serial.println();
}
delay(100);
}
*/
//delay(100);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
This is a standard example from MCP CAN library.
I know, that I want to filter only messages came from CAN ID: 1665 (or 0x681)
Then I have a lot of non useful messages that starts from 0xF0
And I'm only interested in those who start from 0x04
So I tried to do a lot with code:
// demo: CAN-BUS Shield, receive data
#include <mcp_can.h>
#include <SPI.h>
unsigned char Flag_Recv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
String message;
int errMessage;
int count=0;
void setup()
{
Serial.begin(115200);
delay(3000);
pinMode (10, OUTPUT);
digitalWrite (10, LOW);
if(CAN.begin(CAN_500KBPS)) {
Serial.println("CAN Init ok"); // init can bus : baudrate = 500k
}
else {
// Serial.println("CAN Init ERROR"); // init can bus : baudrate = 500k
}
//CAN.init_Filt(0,0,1665);
attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt
Serial.println("Init finished");
}
void MCP2515_ISR()
{
Serial.println("1");
Flag_Recv = 1;
if (Flag_Recv == 1) {
message = "";
Flag_Recv = 0; // clear flag
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
errMessage = 0;
errMessage = CAN.checkError();
if (errMessage != 0) {
Serial.print ("Error = ");
Serial.println(errMessage);
}
//Serial.println("t");
/*Serial.println(CAN.getCanId());
delay(1);*/
count++;
Serial.println(count);
if (count>9) {
count = 0;
}
//Serial.println("interrupt");
message += CAN.getCanId();
if (message == "1665") {
message += " ";
message += len;
message += + " ";
//Serial.print("data len = ");
//Serial.print(len);
for(int i = 0; i<len; i++) // print the data
{
//Serial.print(buf[i]);
//Serial.print("\t");
message += buf[i];//+ " ";
message += " ";
}
//Serial.println(message.length());
//delay(10);
Serial.print(message);
Serial.println();
}
//delay(100);
}
}
void loop()
{
/*if(Flag_Recv) // check if get data
{
message = "";
Flag_Recv = 0; // clear flag
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
errMessage = 0;
errMessage = CAN.checkError();
if (errMessage != 0) {
Serial.print ("Error = ");
Serial.println(errMessage);
}
//Serial.println("t");
//Serial.println(CAN.getCanId());
//Serial.println("interrupt");
message += CAN.getCanId();
if (message == "1665") {
message += " ";
message += len;
message += + " ";
//Serial.print("data len = ");
//Serial.print(len);
for(int i = 0; i<len; i++) // print the data
{
//Serial.print(buf[i]);
//Serial.print("\t");
message += buf[i];//+ " ";
message += " ";
}
//Serial.println(message.length());
//delay(10);
//Serial.print(message);
//Serial.println();
}
delay(100);
}
*/
//delay(100);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
sorry for lots of comments, but I'm trying to find out the fastest solution.
Here I'm using Strings. May my problem be due to this?
With best regards,
Alexander