Bytes naar long

Dag allemaal,

Ik probeer in een Arduino project een getal uit te lezen dmv RS232, dit gaat allemaal prima. Het getal heb ik opgeslagen in 3 variabelen, elk 1 hex byte.
Deze 3 variabelen moeten alleen nog bij elkaar opgeteld worden, samen moet het 2.475.000 worden (ruim 2 miljoen dus), omdat dit niet meer in een int past heb ik voor een long gekozen.
Ik heb de oplossing gevolgd zoals deze hier staat: how to convert long int to byte* - #3 by system - Syntax & Programs - Arduino Forum
Op de een of andere manier maakt hij er alleen ffff van in het begin.
Dit is mijn (eenvoudige) code:

byte a[] = {
  0x00, 0x00, 0x00
};

unsigned long b = 0UL;

void setup() {
  Serial.begin(9600);
  a[0] = 0x25; 
  a[1] = 0xc3; 
  a[2] = 0xf8; 
}

void loop() {
  Serial.println("Deze 3 hebben we: ");
  Serial.println(String(a[0], HEX));
  Serial.println(String(a[1], HEX));
  Serial.println(String(a[2], HEX));

  b = (unsigned long)(a[0] << 16) | (a[1] << 8) | a[2];
  Serial.print("dit is het getal: ");
  Serial.println(String(b, HEX));
  
  delay(20000);

}

Ik heb het idee dat ik al aardig in de buurt zit, maar het lukt nog niet!

Alvast bedankt voor het meedenken!
Mvg, Robert-Jan

probeer dit eens

byte a[] = {
  0x00, 0x00, 0x00
};

unsigned long b = 0UL;

void setup() {
  Serial.begin(9600);
  a[0] = 0x25; 
  a[1] = 0xc3; 
  a[2] = 0xf8; 
}

void loop() {
  Serial.println("Deze 3 hebben we: ");
  Serial.println(String(a[0], HEX));
  Serial.println(String(a[1], HEX));
  Serial.println(String(a[2], HEX));

  b = (unsigned long)((unsigned long)a[0] << 16) | ((unsigned long)a[1] << 8) | a[2];
  Serial.print("dit is het getal: ");
  Serial.println(String(b, HEX));
  
  delay(20000);

}

Als dit je probleem oplost heb je een probleem met overflow. a[0] is een byte. Als je die 16 of 8 keer shift is die leeg.
Met vriendelijke groet
Jantje

Bedankt voor je antwoord Jantje.

Dit werkt inderdaad wel.
a[0] is inderdaad een byte, en die shift ik 16 bits naar links en sla deze op in b. Dan verandert er toch niks aan a[0]?
Stel dat ik het volgende heb:
a[0] = B0000 0100;
a[1] = B0000 0010;
a[2] = B0000 0001;

Dan doe ik toch het volgende?

  1. a[0] 16 plaatsen naar links shiften --> 0000 0100 0000 0000 0000 0000
  2. a[1] 8 plaatsen naar links shiften --> 0000 0010 0000 0000
  3. a[2] zo laten 0000 0001
    En dan 1+2+3 toch? Dan wordt het
    0000 0100 0000 0010 0000 0001

Wat is precies een overflow probleem? Ik heb met mijn vorige code wel wat lompe dingen gedaan met veel String variabelen, en variabelen meerdere malen gedeclareerd, dat leidde onder andere tot een automatische reboot (of crash) van de Arduino Uno.

Alvast bedankt voor je antwoord!

als je 16 plaatsen naar links of rechts schijft en je hebt er maar 8, zit je dan wel goed?
Ik denk dat je dan een probleem hebt.
Door de (unsigned long) er bij te voegen maak ik van de 8 zitplaatsen er 32. Dan kan je gerust een beetje schuiven.
Met vriendelijke groet
Jantje

Is het niet eenvoudiger op deze manier?

// Do not remove the include below unless using the Arduino IDE
#include "test.h"
//
// overlay om een long als byte array te benaderen
//
union {
	long b;		// long getal wat we nodig hebben
	byte a[4];	// bytes als overlay
} x;

void setup()
{
	Serial.begin (9600);
	//
	//
	x.b 	= 0;		// resultaat op 0 zetten
	x.a[2] 	= 0x25;		// ff vaste waarden er in  zetten
	x.a[1] 	= 0xc3;
	x.a[0] 	= 0xf8;
	//
	// ff laten zien ter controle
	//
	Serial.println("Deze 3 hebben we: ");
	Serial.println(String(x.a[0], HEX));
	Serial.println(String(x.a[1], HEX));
	Serial.println(String(x.a[2], HEX));
	//
	// en dan rechtstreeks de overlay gebruiken
	//
	Serial.print("dit is het getal: ");
	Serial.println(String(x.b));
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
}

Met als resultaat

Deze 3 hebben we: 
f8
c3
25
dit is het getal: 2475000

zeker is dat eenvoudiger als je goed in c bent. Maar waarschijnlijk een stuk moeilijker te begrijpen voor een beginneling.
Daarom dat ik deze methode niet aangehaald heb.
Met vriendelijke groet
Jantje