Sobre el ejemplo anterior ,se añade un array desviosId ,en una funcion llamada en el setup() se rellena con 0 y en la tercera posicion ponemos manualmente una de las 4 id en la posicion 3.Cuando se encuentre una coincidencia en oldId ,se buscara tambien en el array desviosId y si hay un valor que no sea 0 ,se enviara tambien la trama a esa id,eso ocurrira cuando se reciba la id 0x15EFE413 que es la que esta en la tercera posicion de oldId i el contenido de esa trama se enviara tambien a 0x01800101
#include <SPI.h>
#include "mcp_can_Err.h"
const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);
#define NUM_ID 4
unsigned long oldId[] = {0x15EFE411,0x15EFE412,0x15EFE413,0x15EFE414};
unsigned long newId[] = {0x01800001,0x01800002,0x01800003,0x01800004};
unsigned long desviosId[NUM_ID]; // De momento 4 elementos ,luego seran los 20
void setArrayValues(){ // Se rellena el array con 0
for(byte cont = 0; cont < NUM_ID ; cont ++){
desviosId[cont] = 0;
}
desviosId[2] = 0x01800101; // Ahora añadimos la primera de las cuatro id de la pantalla nueva al tercer elemento del array,entonces cuando se reciba
//la oldId 0x15EFE413 que es el tercer elemento tambien,se enviara su trama a la id 0x01800101.Esto es fijo,luego se puede hacer por serial.
}
int getIdPosition(unsigned long Id){
for( int cont = 0; cont < NUM_ID; cont ++){
if(oldId[cont] == Id){
return cont;
}
}
return -1;
}
void setup(){
Serial.begin(115200);
setArrayValues();
START_INIT:
if(CAN_OK == CAN.begin(CAN_500KBPS)){
Serial.println("CAN BUS Shield init ok!");
}
else{
Serial.println("CAN BUS Shield init fail");
Serial.println("Init CAN BUS Shield again");
delay(100);
goto START_INIT;
}
}
void loop(){
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive()) { // check if data coming
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned long oldId = CAN.getCanId();
int idToFind = getIdPosition(oldId);
if(idToFind != -1){
CAN.sendMsgBuf(newId[idToFind], 1, len, buf); // Por cierto revisa aqui ,en ejemplos veo (newId[idToFind, 0, len, buf)
if(desviosId[idToFind] != 0){ // Si en el array desviosId hay un valor diferente de 0 es que hay una id nueva guardada y se envia la trama tambien.
CAN.sendMsgBuf(desviosId[idToFind], 1, len, buf);
}
}
// Serial.println("-----------------------------");
// Serial.print("get data from ID: ");
// Serial.println(canId, HEX);
//
// for(int i = 0; i<len; i++) // print the data
// {
// Serial.print(buf[i]);
// Serial.print("\t");
// }
// Serial.println();
}
}