Convert a decimal value in char to hex and store in the char

Hello,
I want to convert a decimal value in a char to Hexadecimal and store it in the same char.
For example;
byte pGPSData[8];
unsigned long lLatitude = 2268365056; // the value gets updated frequently
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));

I was getting decimal values perfectly as below,
pGPSData[0] = 0
pGPSData[1] = 129
pGPSData[2] = 52
pGPSData[3] = 135

but I want the value of the pGPSData[ ] as HEX value to transfer as CAN message
pGPSData[0] = 00
pGPSData[1] = 81
pGPSData[2] = 34
pGPSData[3] = 87

Any suggestions please..

Would you mind posting your code within code tags (</> icon)?

Your array byte pGPSData[8] stores 8-bit unsigned integers, and it stores them in binary. Whether that is represented in decimal or hexadecimal in code makes no difference at all, that's only for human readability.

By the way;

129 == 0x81; 
129 !=   81;

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

You already know how to do that. You solved this very problem here:

Thanks for your reply
In the sender code the arrays pGPSData[8] and pGPStime[8] were not updating in the loop. I think i am missing something there. Can you help me find out

lot of repetitious code

and

consider using more sub-functions and arrays which may make your code more readable and easier to find bugs

char s [80];

struct Can_s {
    void beginExtendedPacket (unsigned long id) {
        sprintf (s, " %08lx", id);
        Serial.print (s);
    }
    void write (byte b)  {
        sprintf (s, " %02x", b);
        Serial.print (s);
    }
    void endPacket (void)  { Serial.println (); };
} CAN;

// -----------------------------------------------------------------------------
void
canSend (
    long  id,
    byte *buf,
    int   nByte )
{
    CAN.beginExtendedPacket(id);

    for (int i = 0; i < nByte; i++)
        CAN.write (buf [i]);

    CAN.endPacket();
}

// -----------------------------------------------------------------------------
void
longToByte (
    unsigned long  val,
    byte          *buf,
    int            offset )
{
    for (unsigned i = 0; i < sizeof(long); i++)  {
        buf [i]   = val & 0xFF;
        val     >>= 8;
    }
}

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

    byte gpsData [8];

    longToByte (2268365056, gpsData, 0);
    longToByte (0x12345678, gpsData, 4);
    canSend (0x18fef31c, gpsData, sizeof(gpsData));
}

void loop() {
}

You mean code from post #3? Can you make sense of it? I totally agree with @gcjr: there's a lot of duplicated code there. Other than being a mess to follow visually and to debug, it makes it hard to test individual parts. If you split it into small subroutines, you can test them individually and use them as building blocks for other, bigger building blocks for other... get the idea?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.