Arduino Forum

International => Español => Software => Topic started by: JoseGD on May 06, 2020, 06:15 pm

Title: [Solucionado] Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 06, 2020, 06:15 pm
Buenas a todos

Estoy estudiando un poco la comunicación CAN con arduino, estoy usando este ejemplo de las librerias,
En en cual veo todas las tramas que leo desde una maquina.

Pero me surge una duda haber si ustedes me la pueden resolver, viendo el código creo que las tramas que lee las guarda en las variable unsigned char len y buf.


Entonces como puede hacer que me guarde las tramas de cada ID en diferentes bufer, para después gestionarlas a mi manera:


Gracias

Las tramas que capturo son estas:


ID            Len    data

14EFE100   8     03 0A 17 00 20 00 10 00

14EFE101   8     01 53 12 00 20 05 00 0A

14EFE102   8     01 51 12 00 BA 00 03 00

14EFE103   8     01 53 12 00 2B 00 00 01

Code: [Select]

#include <SPI.h>
#include "mcp_can_Err.h"


const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);                                  

unsigned char len = 0;
unsigned char buf[8];

void setup()
{
    Serial.begin(115200);

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()
{
    

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();
        
        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();
    }
}

Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 06, 2020, 07:17 pm
Una forma rápida y sencilla sería crear una matriz doble (n,3) posiciones donde n es un contador de señales entrantes y los 3 datos a guardar de cada posición sería ID, LEN y DATA, recomiendo exportar a un SD si los datos son importantes o desbordarás rápido la memoria.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 06, 2020, 08:06 pm
Gracias arkarash por la rápida respuesta, voy a intentar buscar un ejemplo de lo que me dice para entenderlo.

En principio solo me haría falta guardar los datos del DATA, pero de una manera ordenada.

Por ejemplo esta trama:

14EFE100   8     03 0A 17 00 20 00 10 00

Yo lo que quiero hacer es. Si la ID es 14EFE100 los datos de esta ID se guarden el la variable Nº1

Por que a la hora de enviarlos otra vez por CAN, seria asín :

CAN.sendMsgBuf (0xID, 0, 8, variable Nº1)

Con lo cual solo me hace falta guardar los datos, la ID y el LEN ya se lo puedo poner manualmente.




Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 06, 2020, 08:51 pm
Lo primero es saber si vas a querer guardar 4 o 4000 líneas de datos en la base de datos. Es importante para saber si lo guardas en un fichero externo o en una variable.

Si es en una variable te aconsejo crear una estructura:

Code: [Select]
struct DATACAN
   { unsigned long ID ; // ID del CAN
      unsigned char len ;       // Longitud
      unsigned char buf[8] data ;       // Data
   } ;


Luego accederías crearías una variable

Code: [Select]
DATACAN variable [10];

Y luego para acceder a los datos

Code: [Select]
Serial.println(variable [1].ID) ;

Más o menos y sin mirar si me he equivocado en algo, estudia un poco más del tema y si tienes alguna duda pregunta.

Enlace para consulta (https://www.prometec.net/struct/)
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 06, 2020, 09:11 pm
La idea es la siguiente. La maquina genera 20 tramas can, las cuales las quiero guardar  y después  enviar a mi gusto cambiado la ID de la trama.

Por eso me hace falta saber  los Datos guardados en una variable a que ID corresponden.

Porque luego yo mandare eso datos cambiando la ID

EJ:

Esta trama

14EFE101   8     01 53 12 00 20 05 00 0A

Yo ahora la quiero mandar con la ID 15FFF201, pero eso mismos datos de esa ID lo mismo dentro de un dia los tengo que mandar con la IDXXXXXX

Voy ha estudiar lo que me mandas

Gracias



Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 07, 2020, 06:10 pm
Buenas, he estado leyendo lo de las estructuras y no parece difícil, pero quería ver como puedo guardar los datos leído dependiendo de la ID de la trama, así que hice este codigo para probar antes de liarme con la estructura.

Pero no me funciona, no logro guardar los datos de la trama, use switch para saber que ID esta leyendo.

Alguna sugerencia.

Gracias

Code: [Select]


#include <SPI.h>
#include "mcp_can_Err.h"

const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);


unsigned char len1 = 0;
unsigned char buf1[8];
unsigned char len2 = 0;
unsigned char buf2[8];
unsigned char len3 = 0;
unsigned char buf3[8];

void setup()
{
  Serial.begin(9600);

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    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() {

  CAN_MSGAVAIL == CAN.checkReceive();

  switch (CAN.getCanId()) {
    case 0x14EFE100:
      CAN.readMsgBuf(&len1, buf1);
      for (int i = 0; i < len1; i++)
      {
        Serial.print(buf1[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE101:
      CAN.readMsgBuf(&len2, buf1);
      for (int i = 0; i < len2; i++)
      {
        Serial.print(buf2[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE102:
      CAN.readMsgBuf(&len3, buf3);
      for (int i = 0; i < len3; i++)
      {
        Serial.print(buf3[i]);
        Serial.print("\t");
      }
      break;
  }
}

Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 07, 2020, 07:07 pm
El codigo que pones no tiene nada que ver con el que tu mismo posteaste mas arriba,que supongo es el ejemplo de la libreria y es el "bueno".Esto:
Code: [Select]
CAN_MSGAVAIL == CAN.checkReceive();
no es lo mismo que esto:
Code: [Select]
if(CAN_MSGAVAIL == CAN.checkReceive())
La lectura de una trama debe estar condicionada a que haya algo que leer.
Aqui y segun el ejemplo ,getCanId() devuelve un unsigned long:
Code: [Select]
unsigned long canId = CAN.getCanId();
Sin embargo tu comparas con un hexadecimal:
Code: [Select]
case 0x14EFE100:
y esto no se si es correcto.
Edito porque acabo de hacer la prueba y se puede comparar.
Mira de poner Serial.println a modo de logs para ver los valores que recoges,por ejemplo una vez que compruebes que hay datos disponibles:
Code: [Select]
unsigned long canId = CAN.getCanId();
Serial.println(canId,HEX);
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 07, 2020, 07:12 pm
No estas usando las estructuras por ningún sitio en el código pero bueno, si este código funcionase sólo guardarías el último dato de cada ID, los demás se machacarían.

Aparte de eso, comprueba que el switch case funciona bien que, creo que no con el 0x14EFE100 como condición, tu que has ejecutado el programa ¿entra en el case? ¿imprime por el puerto serial lo que debe? Si no imprime en el serial es que no entra en el case y podría ser por la condicion.

Edit: Como te han dicho más arriba el problema es que no entra en los case por la condicion
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 07, 2020, 07:23 pm
Quote
Edit: Como te han dicho más arriba el problema es que no entra en los case por la condicion
No,lo acabo de comprobar y si que se puede comparar.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 07, 2020, 10:02 pm
arkarash no usado aun las estructuras por que quería primero saber como guardar los dato según la ID, pero las usare cuando resuelva este problema y te agradezco mucho tu ayuda.

Mira _jose_ si este comando lo saco del  switch

Code: [Select]


CAN.readMsgBuf(&len, buf);



Y solo creo una variable para LEN y DATA, si funciona y veo los datos por el puerto serie

Code: [Select]

unsigned char len = 0;
unsigned char buf[8];


El codigo quedaria asin, mas o menos asin:

Code: [Select]


unsigned char len = 0;
unsigned char buf[8];


void loop() {

  CAN_MSGAVAIL == CAN.checkReceive();

  CAN.readMsgBuf(&len, buf);

  switch (CAN.getCanId()) {
    case 0x14EFE100:
 
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE101:
   
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE102:
     
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;
  }
}





Pero no es lo que yo pretendo hacer, yo lo que quiero hacer es esto, mas o menos.
En este ejemplo lo que hago es capturar una trama con una ID y lanzar esa misma trama con una ID diferente y funciona perfectamente.

Code: [Select]

case 0x14EFE101:
     for (int i = 0; i < len; i++) {
     Serial.print(buf[i], HEX);
     Serial.print("\t");
     CAN.sendMsgBuf(0x15FEE103, 1, 8, buf);
     }
     Serial.println();
     break;


El problema esta en que no se como meter en cada variable los datos da cada ID para luego mandarlos con otra ID que yo quiera.
Por eso hice la prueba del post de arriba, y pensé si leo La IDXXXXXX que me guarde los datos en una Variable "Y" y después poder lanzarla con este comando:

Code: [Select]


CAN.sendMsgBuf(0x15FEE103, 1, 8, Variable Y);



Gracias a los dos por la ayuda.





Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 08, 2020, 12:18 am
Desconozco esa libreria y que tipo de parametros hay que pasar,deduzco que son arrays de bytes.si sabes cuales son los 20 Id y las 20 tramas ,podrias probar algo como esto ,pero no se si funcionara:
Code: [Select]

#define ID1 0x15FEE103
#define ID2 0x14EFE101
// Asi hasta los 20
#define TRAMA1 0x015312002005000A
#define TRAMA2 0x0153180F2006000A
// Asi hasta los 20
void setup(){ // Codigo que sea....}
void loop(){
// Quiero enviar ID1 con TRAMA2
  CAN.sendMsgBuf(ID1, 1, 8, TRAMA2);
}
 
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 08, 2020, 08:07 am
arkarash no usado aun las estructuras por que quería primero saber como guardar los dato según la ID, pero las usare cuando resuelva este problema y te agradezco mucho tu ayuda.

Mira _jose_ si este comando lo saco del  switch

Code: [Select]


CAN.readMsgBuf(&len, buf);



Y solo creo una variable para LEN y DATA, si funciona y veo los datos por el puerto serie

Code: [Select]

unsigned char len = 0;
unsigned char buf[8];


El codigo quedaria asin, mas o menos asin:

Code: [Select]


unsigned char len = 0;
unsigned char buf[8];


void loop() {

  CAN_MSGAVAIL == CAN.checkReceive();

  CAN.readMsgBuf(&len, buf);

  switch (CAN.getCanId()) {
    case 0x14EFE100:
 
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE101:
   
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;

    case 0x14EFE102:
     
      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
      break;
  }
}





Pero no es lo que yo pretendo hacer, yo lo que quiero hacer es esto, mas o menos.
En este ejemplo lo que hago es capturar una trama con una ID y lanzar esa misma trama con una ID diferente y funciona perfectamente.

Code: [Select]

case 0x14EFE101:
     for (int i = 0; i < len; i++) {
     Serial.print(buf[i], HEX);
     Serial.print("\t");
     CAN.sendMsgBuf(0x15FEE103, 1, 8, buf);
     }
     Serial.println();
     break;


El problema esta en que no se como meter en cada variable los datos da cada ID para luego mandarlos con otra ID que yo quiera.
Por eso hice la prueba del post de arriba, y pensé si leo La IDXXXXXX que me guarde los datos en una Variable "Y" y después poder lanzarla con este comando:

Code: [Select]


CAN.sendMsgBuf(0x15FEE103, 1, 8, Variable Y);



Gracias a los dos por la ayuda.






A ver, creo que _Jose_ no te ha entendido o no te he entendido yo.

Si funciona con el CAN.Receive fuera del switch déjalo fuera, de hecho es donde debería estar, guardas en variables "temporales" ID, len y buf[8], creas la estructura y haces el switch case para almacenarla. Yo es que lo veo claro así, pero es un enfoque diferente del que le da _Jose_
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 08, 2020, 10:36 am
Quote
Desconozco esa libreria y que tipo de parametros hay que pasar,deduzco que son arrays de bytes.si sabes cuales son los 20 Id y las 20 tramas ,podrias probar algo como esto ,pero no se si funcionara:
Code: [Select]


#define ID1 0x15FEE103
#define ID2 0x14EFE101
// Asi hasta los 20
#define TRAMA1 0x015312002005000A
#define TRAMA2 0x0153180F2006000A
// Asi hasta los 20
void setup(){ // Codigo que sea....}
void loop(){
// Quiero enviar ID1 con TRAMA2
  CAN.sendMsgBuf(ID1, 1, 8, TRAMA2);
}
 
Esto no funcionaria _jose_ ya que simpre mandaria en caso de la trama 1 015312002005000A y no seria correcto, pues la trama va cambiando, me explico la que yo capturo de la maquina son esos valores, pero en van variando constantemente y si yo solo mando es array no funcionara, por eso lo de guardarla con sus respectivos cambio, no se si m he explicado,
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 08, 2020, 10:42 am
Quote
A ver, creo que _Jose_ no te ha entendido o no te he entendido yo.

Si funciona con el CAN.Receive fuera del switch déjalo fuera, de hecho es donde debería estar, guardas en variables "temporales" ID, len y buf[8], creas la estructura y haces el switch case para almacenarla. Yo es que lo veo claro así, pero es un enfoque diferente del que le da _Jose_

arkarash entiendo lo que dices, pero no entiendo como hago para guardar en variables los Datos de cada ID, ya que este comado
Code: [Select]

CAN.readMsgBuf(&len, buf);


Lee todo a la vez y guarda los datos en

Code: [Select]

unsigned char len = 0;
unsigned char buf[8];


No entiendo o no lo veo como hago para separa los datos de cada ID en una variable.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 08, 2020, 12:28 pm
Buenas, no te había aclarado esa parte porque me habías dicho que controlabas las estructuras.

Creas la estructura:

Code: [Select]
typedef struct
   { unsigned long ID ; // ID del CAN
      unsigned char len ;       // Longitud
      unsigned char [8] data ;       // Data
   } DATACAN;


Luego lees como ya sabes y se almacena en las variables, y después se almacena en la estructura:

Code: [Select]
DATACAN Datos [20] ;
Datos[a].ID = ID ;
Datos[a].len = len ;
For ....{
Datos[a].data [i]= buf[i] };
a++ ;


Espero que esto resuelva tus dudas
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 08, 2020, 01:57 pm
Bueno,espero que saques conclusiones ,cuanto mas preciso seas explicando tu proyecto ,menos mataremos moscas a cañonazos...De hecho sigo sin acabar de comprenderlo ,asi que hasta que no lo tenga claro yo me bajo aqui.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 08, 2020, 03:36 pm
Bueno,espero que saques conclusiones ,cuanto mas preciso seas explicando tu proyecto ,menos mataremos moscas a cañonazos...De hecho sigo sin acabar de comprenderlo ,asi que hasta que no lo tenga claro yo me bajo aqui.
_jose_ creí que en el mensaje nº 4 lo explique, te pido disculpas si no lo hice bien, y agradezco muchísimo tu ayuda.

El proyecto es el siguiente, tengo una maquina industrial la cual genera 20 tramas CAN de 8 bytes cada una, estos bytes tiene información de temperatura, humedad, etc... e iran cambiado a medida que lanza la trama.

EL objetivo es leer y guardar los datos de cada ID y después lanzarlos a otra maquina modificando solo la ID de cada trama.

Los lanzare pulsando un teclado por ejemplo:

La ID 14FEE101 con sus datos, si pulso la tecla 'A' mando eso datos que estoy leyendo de esa ID pero cambiamos la direccion ID, lo mandaríamos ahora con 15FEE201 por ejemplo.

Te pido disculpas _jose_si te sentó mal que no me explicara bien.

Un Saludo
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 08, 2020, 04:08 pm
Y mi respuesta te sirve o no?
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 08, 2020, 04:29 pm
Y mi respuesta te sirve o no?
Gracias arkarash por tu repuesta, la estaba estudiando ahora,  voy a hacer una pruebas y si no te importa, si me surge algun problema o duda te lo digo.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 08, 2020, 04:50 pm
Quote
estos bytes tiene información de temperatura, humedad, etc... e iran cambiado a medida que lanza la trama.
Este era un detalle importante ,porque lo que yo entendi hasta ahora es que la maquina trabaja con 20 tramas iguales.En ese caso ya te han dado una solucion.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 08, 2020, 09:45 pm
Buenas arkarash, llevo toda la tarde leyendo para entender bien las estructuras, pero no consigo implantarlo en el codigo.

He vito este video, que te lo eplica y el enlace que me mandaste, mas tu ejemplo.

https://www.youtube.com/watch?v=Qzq-lnO9dAc

Me comentabas que hiciera

 
Quote
guardas en variables "temporales" ID, len y buf[8], creas la estructura y haces el switch case para almacenarla. Yo es que lo veo claro así
No entiendo esto:
Code: [Select]


DATACAN Datos [20] ;
Datos[a].ID = ID ;
Datos[a].len = len ;
For ....{
Datos[a].data [i]= buf[i] };
a++ ;


Y por mas que he leído no veo como hacer el switch case para almacenarla en la estructura.

Voy a seguir estudiando, haber si llego a comprenderlo.

Gracias

Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 09, 2020, 09:01 pm
Bueno he conseguido entenderlo un poco e hice este que en principio funciona
Code: [Select]

#include <SPI.h>
#include "mcp_can_Err.h"
const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN);

typedef struct
{ unsigned long ID ;           // ID del CAN
  unsigned char len1;       // Longitud
  unsigned char data[8];       // Data
} DATACAN;

DATACAN Datos[20];

unsigned long canId;
unsigned char len = 0;
unsigned char buf[8];

void setup() {
  Serial.begin(9600);


START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    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() {

 Datos[8].ID = canId;
 Datos[2].len1 = len;
 Datos[8].data[8] = buf;


 if(CAN_MSGAVAIL == CAN.checkReceive())
 {

  CAN.readMsgBuf(&len, buf);
  canId = CAN.getCanId();

  Serial.println("-----------------------------");
  Serial.print("get data from ID: ");
  Serial.println(Datos[8].ID, HEX);

  for (int i = 0; i < len; i++)
  {
    Datos[8].data[i] = buf[i];
    Serial.print(Datos[8].data[i], HEX);
    Serial.print("\t");
  }
  Serial.println();
}
}



Supongo que tendré que crear mas comando como este, tantos como ID tengo, que serian 20, no?
Code: [Select]

DATACAN Datos[20];
DATACAN Datos1[20];
DATACAN Datos2[20];



Ahora me surge la duda de como hago con switch case para guardar cada trama con su ID.

No se si lo he echo bien o no.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 10, 2020, 02:05 am
La idea es que Datos [1] sea una trama, Datos [2] otra...

Datos[1].ID
Datos[2].len
...
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 10, 2020, 10:51 am
Entonces quedaría asín
Code: [Select]

 typedef struct
{ unsigned long ID ;              // ID del CAN
  unsigned char len1;             // Longitud
  unsigned char data[8];        // Data
} DATACAN;

DATACAN Datos[20];


Luego separa cada trama
Code: [Select]


  Datos[1].ID = canId;
  Datos[1].len1 = len;
  Datos[1].data[8] = buf;

  Datos[2].ID = canId;
  Datos[2].len1 = len;
  Datos[2].data[8] = buf;


Y por ultimo el Switch quedaría algo asín, no?
Code: [Select]


 switch (CAN.getCanId()) {
  
        case 0x14EFE100:
            
            buf[8] = Datos[1].data[8];

      break;
  
        case 0x14EFE101:
            
            buf[8] = Datos[2].data[8];

      break;
}



No se si era asin o me echo un poco de lio

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: arkarash on May 10, 2020, 11:20 am
El switch no se para que lo quieres no lo acabo de entender, lo que si te digo que para saber qué datos coger tienes que hacer un recorrido por todos los Datos[a].ID comparándolo con él resultado que buscas y cuando encuentres él que buscas usar el Datos[a].data
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 10, 2020, 01:22 pm
Buenas arkarash, como me dijiste esto

Quote
Si funciona con el CAN.Receive fuera del switch déjalo fuera, de hecho es donde debería estar, guardas en variables "temporales" ID, len y buf[8], creas la estructura y haces el switch case para almacenarla
Pense que una vez creada la estructura, con el switch guardo cada buf y len con su ID, si no como hago para guardar cada trama en la variable.

Pense esto, que lo mismo esta mal asi:

Guardo con switch la trama en cada variable Dato y luego hago esto:
Code: [Select]

CAN.sendMsgBuf(0x15EFE105, 1, 8, Dato[a]);


Con este comando envió el buf guardado en Dato[a] con ID 14EFE100, pero le cambio la ID por 15EFE105, que es el objetivo mandar los datos de la trama cambiando la ID, que lo haría asin:
Code: [Select]


switch (teclado){

case '1':
 
CAN.sendMsgBuf(0x15EFE105, 1, 8, Dato[a]);

// aqui para que la trama no pare hare un false - true, eso lo tengo controlado

break;
}




Por favor, si ves que lo estoy haciéndolo mal, dímelo y explícame como lo puedo hacer y lo estudio, aunque ya con mi edad me cuesta entender las cosas, pero esfuerzo.

Muchas Gracias por la ayuda


Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 12, 2020, 08:27 pm
Buenas a todos, pues nada no consigo guardar las tramas en las variable, se guardan datos pero sin sentido, he hecho la prueba con solo dos tramas.

Creo la estructura y las variables temporales
Code: [Select]

typedef struct
{ unsigned long ID ;           
  unsigned char len1;     
  unsigned char data[8];       
} DATACAN;

DATACAN Trama1;
DATACAN Trama2;

// Variables temporales
unsigned long canId;
unsigned char len = 0;
unsigned char buf[8];


El el loop hago esto:
Code: [Select]

  Trama1.ID = canId;
  Trama1.len1 = len;
  Trama1.data[8] = buf;

  Trama2.ID = canId;
  Trama2.len1 = len;
  Trama2.data[8] = buf;


Y despues con el Swtch intento guardar los datos de las tramas segun la ID que llegue a leer
Code: [Select]

case 0x15EFE105:
      buf[8] = Trama1.data[8];
     
      Serial.println("-----------------------------");
      Serial.print("get data from ID: ");
      Serial.println(Trama1.ID, HEX);
      for (int i = 0; i < len; i++)
      {
        Serial.print(Trama1.data[i], HEX);
        Serial.print("\t");
      }
      Serial.println();

      break;

    case 0x15EFE106:
      buf[8] = Trama2.data[8];
     
      Serial.println("-----------------------------");
      Serial.print("get data from ID: ");
      Serial.println(Trama1.ID, HEX);
      for (int i = 0; i < len; i++)
      {
        Serial.print(Trama2.data[i], HEX);
        Serial.print("\t");
      }
      Serial.println();

      break;
  }



Pero no funciona nada, los datos que guarda no tiene sentidos o se me estan mezclando.

Este es el código completo.
Code: [Select]

#include <SPI.h>
#include "mcp_can_Err.h"
const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN);

typedef struct
{ unsigned long ID ;
  unsigned char len1;
  unsigned char data[8];
} DATACAN;

DATACAN Trama1;
DATACAN Trama2;

unsigned long canId;
unsigned char len = 0;
unsigned char buf[8];

void setup() {
  Serial.begin(9600);


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() {

  Trama1.ID = canId;
  Trama1.len1 = len;
  Trama1.data[8] = buf;

  Trama2.ID = canId;
  Trama2.len1 = len;
  Trama2.data[8] = buf;


  CAN_MSGAVAIL == CAN.checkReceive();

  CAN.readMsgBuf(&len, buf);
  canId = CAN.getCanId();

  switch (CAN.getCanId()) {

    case 0x15EFE105:
      buf[8] = Trama1.data[8];
     
      Serial.println("-----------------------------");
      Serial.print("get data from ID: ");
      Serial.println(Trama1.ID, HEX);
      for (int i = 0; i < len; i++)
      {
        Serial.print(Trama1.data[i], HEX);
        Serial.print("\t");
      }
      Serial.println();

      break;

    case 0x15EFE106:
      buf[8] = Trama2.data[8];
     
      Serial.println("-----------------------------");
      Serial.print("get data from ID: ");
      Serial.println(Trama1.ID, HEX);
      for (int i = 0; i < len; i++)
      {
        Serial.print(Trama2.data[i], HEX);
        Serial.print("\t");
      }
      Serial.println();

      break;
  }
}


Yo creo que estoy haciendo todo mal, pero no lo veo.


Básicamente lo único que quiero guardar es los datos de cada trama, que no es mas que un array de 8 bytes.
Pero sabiendo que trama que guarde corresponde a cada IDXXXXXX.

Necesito una ayudita.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 12, 2020, 11:37 pm
Puedes poner algun enlace a la maquina que estas usando o algun tipo de datasheet donde se pueda ver como funciona?Porque veo que haces cosas que no me cuadran ,pero no se decirte que haces mal porque desconozco su funcionamiento.
Por ejemplo:
Code: [Select]
void loop() {

  Trama1.ID = canId;
  Trama1.len1 = len;
  Trama1.data[8] = buf;

  Trama2.ID = canId;
  Trama2.len1 = len;
  Trama2.data[8] = buf;

¿Como estas asignado valores si la lectura se supone que la haces mas abajo?
Code: [Select]
CAN.readMsgBuf(&len, buf);
Ademas estas asignando el mismo valor a la variable Trama1 y  Trama2,¿Cuando cambian canId,len y buf???
¿Se solicita la informacion a la maquina con algun comando especifico o esta la envia cada determinado tiempo?
¿Envia las 20 tramas juntas?
En fin, informacion,informacion,informacion.......
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 13, 2020, 07:46 pm
Buenas _jose_ es que creo que no se hacer el código de las estructuras.

Mira te explico, es una maquina industrial la cual lleva una pantalla de telemetria (mañana intento hacerle una foto y te la pongo aquí), en esta pantalla vemos todos los datos, de varias temperaturas, posicionamiento de ejes, posición de la pieza donde esta situada, etc......lleva muchísimos sensores.

A la pantalla a parte de los cables de alimentación solo le llegan dos cables trenzados de CAN y esta pantalla solo admites las 20 ID que te muestro.

Para sacar esas tramas, he usado un arduino con un shield MCP2512  y el sketch que puse en el primer post, que es el ejemplo que viene en las libreas para capturas las tramas.

En estas tramas vemos una ID (extendida de 29 bits) y los datos que recibimos son 8 bytes, el LEN solo nos indica el numero de bytes de la trama, los datos de no paran de varias durante el funcionamiento de la maquina.

Code: [Select]

   ID    LEN           DATA
15EFE411  8   01 1C 20 00 1C 00 00 00
15EFE412  8   01 2C 1F 00 1C 00 00 00
15EFE413  8   01 21 1D 00 1D 00 00 00
15EFE414  8   01 21 1F 00 1D 00 00 00
15EFE415  8   01 53 12 00 20 00 00 00
15EFE416  8   01 AB 13 00 20 00 00 00
15EFE417  8   02 02 14 00 20 00 00 00
15EFE418  8   02 5A 15 00 20 00 00 00
15EFE419  8   02 B2 16 00 20 00 00 00
15EFE41A  8   03 0A 17 00 20 00 00 00
15EFE41B  8   03 62 18 00 20 00 00 00
15EFE41C  8   03 BA 19 00 20 00 00 00
15EFE41D  8   04 11 1A 00 20 00 00 00
15EFE41E  8   04 69 1B 00 20 00 00 00
15EFE41F  8   04 C1 1C 00 20 00 00 00
15EFE420  8   00 00 1D 00 20 00 00 00
15EFE421  8   00 4B 1E 00 20 00 00 00
15EFE422  8   00 A3 1F 00 20 00 00 00
15EFE423  8   00 FB 20 00 20 00 00 00
15EFE424  8   01 53 21 00 20 00 00 00



El problema, es que voy a cambiar la pantalla de telemetria por que esta está medio roto el display, y la pantalla nueva no admite esas ID ( lo que tiene las cosas chinas).
Esta pantalla admite solo de la 01800000 a  02000000.


Entonces el objetivo es leer esas 20 tramas y mandarlas a la nueva pantalla con las ID cambiadas.


Yo hice este Codigo para probar  mandar la trama cambiando la ID, lo que hice es mandar un dato por el puerto serie y al recibir el dato manda la trama  con la ID cambiada y funciona perfecto, pero claro si solo mando una trama en cuando hice la prueba mandando la segunda, se mezcla todo los datos, por que esta todo en el mismo bufer.

Code: [Select]

#include <SPI.h>
#include "mcp_can_Err.h"

const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);

unsigned char len = 0;
unsigned char buf[8];

boolean ejecutandoTrama1 = false;
boolean ejecutandoTrama2 = false;

char dato;

void setup()
{
  Serial.begin(9600);

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    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() {

  if (ejecutandoTrama1) {
    Trama1();
  }
  if (ejecutandoTrama2) {
    Trama2();
  }

  CAN_MSGAVAIL == CAN.checkReceive();          // check if data coming

  CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

  switch (dato) {
    case '0':
      if (CAN.getCanId() == 0x15EFE411) {
        ejecutandoTrama1 = true;
      }
      break;

    case '1':
      if (CAN.getCanId() == 0x15EFE412) {
        ejecutandoTrama2 = true;
      }
      break;
  }
}

  void Trama1() {
    CAN.sendMsgBuf(0x01800001, 1, 8, buf);
  }

  void Trama2() {
    CAN.sendMsgBuf(0x01800002, 1, 8, buf);
  }



Por eso quiero guardar los datos de cada trama en variables diferentes, pero no se hacerlo para que funcione.

Si no entiendes algo, por favor dímelo.

Muchas Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 13, 2020, 08:19 pm
Ok ,y un enlace a la libreria que usas?
Code: [Select]
#include "mcp_can_Err.h"
Esto no cuadra ,es como si solo importaras una parte,es un nombre raro para una libreria.
Quote
los datos de no paran de varias durante el funcionamiento de la maquina.
osea los datos llegan de la maquina ,no se solicitan?
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 13, 2020, 08:57 pm
Aquí tienes las librerías _jose_, son unas que me pasaron que por lo que se ve están modificadas y corregidos algunos errores.

Quote
osea los datos llegan de la maquina ,no se solicitan?
Eso es jose, los datos llegan todos a la vez a la pantalla y listo, no hay comunicación bidireccional entre ellos.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 13, 2020, 10:07 pm
Quote
Esta pantalla admite solo de la 01800000 a  02000000.
Entonces entiendo que a cada id de la pantalla rota se van a cambiar por otras 20 id diferentes compatibles con la pantalla nueva ,pero que siempre seran las mismas?Es decir ,cojo la idxxxxxxxxx y la envio como idzzzzzzzzzzz y siempre que reciba la idxxxxxxxx la mandare como idzzzzzzzzzz ?
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 13, 2020, 10:31 pm
Exacto _jose_ eso es lo que tengo que hacer.

Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 13, 2020, 11:37 pm
A ver ,primer intento usando el ejemplo de la libreria :
Code: [Select]
#include <SPI.h>
#include "mcp_can_Err.h"
const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
unsigned long oldId[] = {344443334,544333212,887669876,333322555};
unsigned long newId[] = {211004335,111134553,232444322,776589000};
#define NUM_ID 4
// Lo hago de 4 elementos para el ejemplo,si funciona añades restantes y con las id correctas en numero (no hexadecimal por si acaso)

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);
  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)
        }
//        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();
    }
}


Hago dos arrays uno de las id que te da la maquina(oldId) y otro con las que los substituyen(newId),tienen que ir en el mismo orden y tendras que rellenarlos con valores verdaderos ,mejor con valores decimales (no hexadecimal).
Si hay datos a leer ,se leen y se supone se guardan en buf y el numero de caracteres en len.Se recoge el id de la trama y se busca en array oldId.Si se encuentra ,buscamos en array newId con el mismo indice para obtener id que le toca y se envia el mensaje con esa otra id.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 14, 2020, 11:39 am
Muchas Gracias _jose_

Esta tarde lo pruebo y te voy comentando

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 14, 2020, 09:26 pm
Buenas _jose_, antes de nada te agradezco muchísimo tu ayuda.

He estado estudiando lo que me has mandado y mas o menos lo entiendo, ojala llegue algún dia a tener esa destreza programando.

Te comento esto:
En el ejemplo pone 0 por que usa ID no extendidas de 11bits (0x00) si pones un 1 son ID extendidas de 29 bits(0x0000000)
Code: [Select]

CAN.sendMsgBuf(newId[idToFind], 1, len, buf); // Por cierto revisa aqui,en ejemplos veo (newId[idToFind], 0, len, buf)


EL codigo funciona perfectamente,lo hice asin:
Code: [Select]

unsigned long oldId[] =   {0x15EFE411,0x15EFE412,0x15EFE413,0x15EFE414};
unsigned long newId[] = {0x01800001,0x01800002,0x01800003,0x01800004};


Pero al estar probando, me surge un gran problema, este código funciona perfectamente en las cuatro primeras paginas de la pantalla nueva.

Pero es las dos ultimas, que se usan para que la maquina ordene las piezas que ha cortado y monitorear todo, tengo que asignar a mi antojo la oldId a la newId, me explico, ahora mismo tal cual lo me los echo arriba estamos cambiando la ID 0x15EFE411 por la 0x01800001 y funciona perfectamente.

Pero ahora tengo estas cuatro ID:

Code: [Select]

0x01800101
0x01800102
0x01800103
0x01800103


y tengo que asignarlas  a las 20 oldID a mi antojo (bueno mas bien al antojo de la pantalla)

Se me ocurre hacer de momento usando el puerto serie ( ya le pondré algún teclado o alguna TFT para dejarlo acabado)

Si envió un dato '1' la ID 0x15EFE411 la mando por la 0x01800101, si es '2' la mando por la 0x01800102 y así con todas.....O sea tendría estas ultimas 4 ID que combinar con las 20 oldID.

Esto ya me parece mas complicado que se pueda hacer la verdad.

No se como agradecerte el tiempo empleado en ayudarme.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 14, 2020, 10:17 pm
Pero cuales son los criterios para mandar cualquiera de las 20 tramas a cualquiera de esas 4 id?Lo decides tu segun tus necesidades o se puede automatizar el envio de alguna manera? Ahora mismo esas tramas no se guardan,simplemente se reenvian con la id cambiadas tal cual van llegando.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 14, 2020, 10:44 pm
No se puede automatizar, la tengo que elegir, te explico.

La pantalla original lo hacia todo ella automatico, entonces cuando la maquina llega al ultimo proceso en esta pantalla nueva,tenemos que seleccionar la ID que queremos para ver los parámetros, pero solo me permite esas 4 ID.

Yo con este aparato ( que lo compre y después me di cuenta que con arduino se hacia igual) he averiguado lo siguiente:

https://es.rs-online.com/web/p/kits-de-desarrollo-de-interfaz/7154255/

La trama1, los dos primeros bytes son para la presión que ejercen unos pistones, y asi me pegue muchas horas para averiguar que era cada byte de cada trama, que te quiero decir con esto, lo siguiente:

La trama1 nos indica la presión de los pintones
Las tramas 2,3,4 ,5 las temperaturas de diferentes sensores
Y asi con todas.
Hay tres tramas que lo único que hacen es camiar de pagina en la pantalla,segun el proceso de la maquina.

Entonces en las dos ultimas tenemos que decirle a esta pantalla: quiere ver la presión de los sensores y tenemos que mandar la trama oldid 1 con la newId 8, quiero ver las temperatura en este ultimo proceso, tenemos que mandar la oldId 3 por la newid 9 por ejemplo.

Ya que esta pantalla en el ultimo proceso no nos permite ver todo a la vez,solo nos deja ver cuatro campos, que serian cuatro ID, entonces tenemos que seleccionar lo que queremos ver.

Espero que lo hayas entendido.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 15, 2020, 11:27 am
Se puede aprovechar la ñapa de los arrays para añadir un tercer array de desvios en el que se pueden guardar las 4 id alternativas ,cuando oldId coincide con newId ,se busca tambien con ese mismo indice en el array de desvios y si hay una id guardada esa trama se envia tambien a esa id alternativa,lo que pasa es que esto implica tambien recoger comandos del serial,introducir/modificar/borrar en ese array las 4 id a desviar ,verificar que no haya mas de 4 id en el array,etc.la cosa se va complicando.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 15, 2020, 07:33 pm
Pues si que se complica _jose_con lo contento que estaba cuando lo probé y funcionaba todo.
Voy a estudiar un poco, haber so soy capaz de hacer lo que me dices.

Me puedes por favor explicar esto
Code: [Select]

int getIdPosition(unsigned long Id){
  for( int cont = 0; cont < NUM_ID; cont ++){
    if(oldId[cont] == Id){
      return cont;
    }
  }
  return -1;
}



Haber si entendiendo esto puedo yo hacer otro array y hacer lo que me comentas.

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 15, 2020, 09:01 pm
Es una funcion a la que se le pasa como parametro Id que es del tipo unsigned long y devuelve un int ,que es la posicion del array donde se encontro que oldId y newId coinciden.Lo que hace es recorrer el array oldId y compara el contenido de cada posicion con el id que le pasamos,si es igual devuelve el valor de la variable cont en ese momento,que es del tipo int (recuerda que la funcion devuelve un int)
Si no encuentra ninguna coincidencia retorna -1,entonces antes de usar el indice se verifica con un if que el valor es diferente de -1 lo que quiere decir que hay una coincidencia.Luego se accede al array newId con el indice que nos devolvio la funcion para obtener el newId.
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 15, 2020, 09:48 pm
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
Code: [Select]
#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();
    }
}
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 16, 2020, 08:51 pm
Buenas tardes _jose_ he probado esta mañana el código y la verdad que me quito el sombrero, funciona perfectamente.

He echo esto y lo he introducido en el void loop, por que lo puse ne le void setArrayValues, pero no funcionaba
Code: [Select]

  if (Serial.available())
  {
    dato = Serial.read();
  }
  switch (dato) {
    case '1':
      desviosId[2] = 0x01800101;

      break;
    case '2':
      desviosId[3] = 0x01800102;
      break;
  }


Es correcto colocarlo en el Loop o lo estoy haciendo mal?

Gracias
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 16, 2020, 09:46 pm
Si ,debe ir en el loop para que en cualquier momento puedas introducir caracteres
 por serial.Mejor asi todo dentro delbloque if:
Code: [Select]

if (Serial.available())
  {
    dato = Serial.read();
    switch (dato) {
      case '1':
        desviosId[2] = 0x01800101;

      break;
      case '2':
        desviosId[3] = 0x01800102;
      break;
    }
 }

La idea es que desviosId contenga 20 elementos y un maximo de 4 id guardadas,entonces habra que controlar el numero porque si ya hay 4 guardadas lo logico es que borres una de las que ya no quieres mostrar para guardar otra(poniendo un 0 en su contenido).
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 16, 2020, 10:18 pm
Quote
La idea es que desviosId contenga 20 elementos y un maximo de 4 id guardadas,entonces habra que controlar el numero porque si ya hay 4 guardadas lo logico es que borres una de las que ya no quieres mostrar para guardar otra(poniendo un 0 en su contenido).
Es verdad no había pensado como borralo, para que desviosId contenga 20 elementos, solo tengo que hacer esto,no.
Code: [Select]

#define NUM_ID 20


Y para parar en envió de algunas de las 4 id hago esto, no
Code: [Select]

desviosId[2] = 0;
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 16, 2020, 11:09 pm
Quote
#define NUM_ID 20
Si ,recuerda ademas que oldId y newId tambien tienen que contener los 20 elementos para que todo vaya bien
Title: Re: Como puedo guardar una trama CAN en una variable
Post by: JoseGD on May 18, 2020, 07:59 pm
Buenas _jose_ pues hoy probé todo y funciona perfecto. Ya solo me queda añadir una TFT para que envié los datos parta switch case y listo.

Asín que voy lo doy por solucionado.

Te agradezco mucho tu gran ayuda.

Gracias
Title: Re: [Solucionado] Como puedo guardar una trama CAN en una variable
Post by: _jose_ on May 18, 2020, 08:15 pm
Perfecto,con la tft podras implementar varias cosas ,como que te muestre cuales son las id que estas desviando,borrar/añadir/modificar etc etc ya tu imaginacion.queda pendiente unas fotillos de la maquina...