Hola
Necesito pasar unos valores grandes por can bus y recibirlos. Ambos en arduino.
Estoy utilizando la libreria de Seed Studio
Son valores que paso son en formato int32_t
Por ejemplo, la altitud dada por un gps en pies es de 18000.45 ft, yo tendría que pasar 1800045, o unas coordenadas gps, por ejemplo -83.481029, 179.950935 que tendría que pasar como -83481029, 179950935
Mi duda es como meter en un array de char de 8 bytes y como leerlo. He hecho unas pruebas, pero no logro entender como hacerlo, me cuesta entender los operadores bitwise << >>, he leido documentación, tutoriales, pero no acabo de entenderlo ni como aplicarlo a mi problema.
Valores pequeños los logro mandar y recibir, son los valores de hasta 255, no así los grandes.
Adjunto los códigos de pruebas para mandar y recibir.
//Send Code
#include <mcp_can.h>
#include <SPI.h>
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN);
unsigned char canMsgAlt[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int32_t altData = 1800045;
void setup() {
Serial.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS)) { // init can bus : baudrate = 500k
Serial.println("CAN BUS Shield init fail");
Serial.println(" Init CAN BUS Shield again");
delay(100);
}
Serial.println("CAN BUS Shield init ok!");
}
void loop() {
canMsgAlt[0] = altData;
canMsgAlt[1] = altData >> 8;
canMsgAlt[2] = altData >> 16;
CAN.sendMsgBuf(321, 0, 3, canMsgAlt);
Serial.println(altData);//Print for debug
}
//Receive and print code
#include <SPI.h>
#include "mcp_can.h"
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
void setup() {
Serial.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS)) { // init can bus : baudrate = 500k
Serial.println("CAN BUS Shield init fail");
Serial.println(" Init CAN BUS Shield again");
delay(100);
}
Serial.println("CAN BUS Shield init ok!");
}
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
if (CAN.getCanId()== 321){
float altitude = (buf[0])|(buf[1]<<8)|(buf[2]<<16);
Serial.print("Altitude: ");
Serial.println(altitude/100);
}
}
}