This the code on Sender side of the CAN, which sends the GPS data
#include <SoftwareSerial.h>
#include <CAN.h>
#include<math.h>
SoftwareSerial GPSModule(2,3); // RX, TX
int updates;
int failedUpdates;
int pos;
int stringplace = 0;
unsigned long c;
unsigned long d;
String lati,longi;
char sData[10];
char ASCIINULL = '0' ;
byte pGPSData[8];
byte pGPStime[8];
int nPos = 0;
unsigned long lLatitude;
unsigned long lLongitude;
float fLatitude = 0;
float fLongitude = 0;
unsigned long ltime;
unsigned long ldate;
String nmea[15];
String labels[12] {"Time: ", "Status: ", "Latitude: ", "Hemisphere: ", "Longitude: ", "Hemisphere: ", "Speed: ", "Track Angle: ", "Date: "};
void setup() {
Serial.begin(9600);
GPSModule.begin(9600);
while (!Serial);
Serial.println("CAN Sender");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
}
void loop() {
Serial.flush();
GPSModule.flush();
while (GPSModule.available() > 0)
{
GPSModule.read();
}
if (GPSModule.find("$GPRMC,")) {
String tempMsg = GPSModule.readStringUntil('\n');
for (int i = 0; i < tempMsg.length(); i++) {
if (tempMsg.substring(i, i + 1) == ",") {
nmea[pos] = tempMsg.substring(stringplace, i);
stringplace = i + 1;
pos++;
}
if (i == tempMsg.length() - 1) {
nmea[pos] = tempMsg.substring(stringplace, i);
}
}
updates++;
nmea[2] = ConvertLat();
nmea[4] = ConvertLng();
nPos = ConvertLat().length();
ConvertLat().toCharArray(sData,nPos); //latitude into CAN message
fLatitude= ((float)(sData[nPos] - ASCIINULL)*10)+((float)(sData[nPos+1] - ASCIINULL))+((float)(sData[nPos+3] - ASCIINULL)/ 10)+
((float)(sData[nPos+4] - ASCIINULL)/ 100)+((float)(sData[nPos+5] - ASCIINULL)/ 1000)+((float)(sData[nPos+6] - ASCIINULL) / 10000)+
((float)(sData[nPos+7] - ASCIINULL) / 100000)+((float)(sData[nPos+8] - ASCIINULL) / 1000000);
fLatitude = fLatitude + 210;
lLatitude = (unsigned long)(fLatitude * 10000000);
pGPSData[0] = ((unsigned char)(lLatitude & 0x000000FF));
pGPSData[1] = ((unsigned char)((lLatitude & 0x0000FF00) >> 8));
pGPSData[2] = ((unsigned char)((lLatitude & 0x00FF0000) >> 16));
pGPSData[3] = ((unsigned char)((lLatitude & 0xFF000000) >> 24));
nPos = ConvertLng().length();
ConvertLng().toCharArray(sData,nPos);
fLongitude = ((float)(sData[nPos] - ASCIINULL)*100)+((float)(sData[nPos+1] - ASCIINULL)*10)+((float)(sData[nPos+2] - ASCIINULL))
+((float)(sData[nPos+4] - ASCIINULL)/ 10)+((float)(sData[nPos+5] - ASCIINULL)/ 100)+((float)(sData[nPos+6] - ASCIINULL)/ 1000)
+((float)(sData[nPos+7] - ASCIINULL) / 10000)+((float)(sData[nPos+8] - ASCIINULL) / 100000)+((float)(sData[nPos+9] - ASCIINULL) / 1000000);
fLongitude = fLongitude + 210;
lLongitude = (unsigned long)(fLongitude * 10000000);
pGPSData[4] = ((unsigned char)(lLongitude & 0x000000FF));
pGPSData[5] = ((unsigned char)((lLongitude & 0x0000FF00) >> 8));
pGPSData[6] = ((unsigned char)((lLongitude & 0x00FF0000) >> 16));
pGPSData[7] = ((unsigned char)((lLongitude & 0xFF000000) >> 24));
Serial.print("Sending extended packet ... ");
//CAN.write(buf,9);
CAN.beginExtendedPacket(0x18FEF31C);
CAN.write(pGPSData[0]);
CAN.write(pGPSData[1]);
CAN.write(pGPSData[2]);
CAN.write(pGPSData[3]);
CAN.write(pGPSData[4]);
CAN.write(pGPSData[5]);
CAN.write(pGPSData[6]);
CAN.write(pGPSData[7]);
CAN.endPacket();
// time into CAN message
nmea[0].toCharArray(sData,10);
ltime = (unsigned long)(((float)(sData[nPos+4] - ASCIINULL)*10)+(float)(sData[nPos+5] - ASCIINULL));
pGPStime[0] = ((unsigned char)((ltime* 4) & 0xFF));
ltime = (unsigned long)(((float)(sData[nPos+2] - ASCIINULL)*10)+(float)(sData[nPos+3] - ASCIINULL));
pGPStime[1] = (unsigned char)(ltime & 0xFF);
ltime = (unsigned long)(((float)(sData[nPos] - ASCIINULL)*10)+(float)(sData[nPos+1] - ASCIINULL));
pGPStime[2] = ((unsigned char)(ltime & 0xFF));
nmea[8].toCharArray(sData,10);
ldate = (unsigned long)(((float)(sData[nPos+2] - ASCIINULL)*10)+(float)(sData[nPos+3] - ASCIINULL));
pGPStime[3] = ((unsigned char)(ldate & 0xFF));
ldate = (unsigned long)(((float)(sData[nPos] - ASCIINULL)*10)+(float)(sData[nPos+1] - ASCIINULL));
pGPStime[4] = ((unsigned char)((ldate *4) & 0xFF));
ldate = (unsigned long)((float)(sData[nPos+4] - ASCIINULL)*10)+(float)(sData[nPos+5] - ASCIINULL);
pGPStime[5] = ((unsigned char)(ldate & 0xFF));
pGPStime[6] = 0x00 ;
pGPStime[7] = 0x00 ;
Serial.print("Sending extended packet ... ");
//CAN.write(buf,9);
CAN.beginExtendedPacket(0x18FEE61C);
CAN.write(pGPStime[0]);
CAN.write(pGPStime[1]);
CAN.write(pGPStime[2]);
CAN.write(pGPStime[3]);
CAN.write(pGPStime[4]);
CAN.write(pGPStime[5]);
CAN.write(pGPStime[6]);
CAN.write(pGPStime[7]);
CAN.endPacket();
for (int i = 0; i < 9; i++) {
Serial.print(labels[i]);
Serial.print(nmea[i]);
Serial.println("");
}
}
else {
failedUpdates++;
}
stringplace = 0;
pos = 0;
}
String ConvertLat() {
String posneg = "";
if (nmea[3] == "S") {
posneg = "-";
}
String latfirst;
float latsecond;
for (int i = 0; i < nmea[2].length(); i++) {
if (nmea[2].substring(i, i + 1) == ".") {
latfirst = nmea[2].substring(0, i - 2);
latsecond = nmea[2].substring(i - 2).toFloat();
}
}
latsecond = latsecond / 60;
String CalcLat = "";
char charVal[9];
dtostrf(latsecond, 4, 6, charVal);
for (int i = 0; i < sizeof(charVal); i++)
{
CalcLat += charVal[i];
}
latfirst += CalcLat.substring(1);
latfirst = posneg += latfirst;
//a = latfirst.toFloat();
//lati = (a+c)*d;
//latfirst = lati;
return latfirst;
}
String ConvertLng() {
String posneg = "";
if (nmea[5] == "W") {
posneg = "-";
}
String lngfirst;
float lngsecond;
for (int i = 0; i < nmea[4].length(); i++) {
if (nmea[4].substring(i, i + 1) == ".") {
lngfirst = nmea[4].substring(0, i - 2);
//Serial.println(lngfirst);
lngsecond = nmea[4].substring(i - 2).toFloat();
//Serial.println(lngsecond);
}
}
lngsecond = lngsecond / 60;
String CalcLng = "";
char charVal[9];
dtostrf(lngsecond, 4, 6, charVal);
for (int i = 0; i < sizeof(charVal); i++)
{
CalcLng += charVal[i];
}
lngfirst += CalcLng.substring(1);
lngfirst = posneg += lngfirst;
//b = lngfirst.toFloat();
//longi = (b+c)*d;
//lngfirst= longi;
return lngfirst;
}
How to I display the data in HEX decimal form on the receiver side.
Below is the code on the receiver side
// Copyright (c) Sandeep Mistry. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
#include <CAN.h>
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("CAN Receiver");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
}
void loop() {
// try to parse packet
int packetSize = CAN.parsePacket();
if (packetSize) {
// received a packet
Serial.print("Received ");
if (CAN.packetExtended()) {
Serial.print("extended ");
}
if (CAN.packetRtr()) {
// Remote transmission request, packet contains no data
Serial.print("RTR ");
}
Serial.print("packet with id 0x");
Serial.print(CAN.packetId(), HEX);
if (CAN.packetRtr()) {
Serial.print(" and requested length ");
Serial.println(CAN.packetDlc());
} else {
Serial.print(" and length ");
Serial.println(packetSize);
// only print packet data for non-RTR packets
while (CAN.available()) {
Serial.print((char)CAN.read());
}
Serial.println();
}
Serial.println();
}
}