Pages: [1]   Go Down
Author Topic: Bytes naar long  (Read 4105 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:  http://forum.arduino.cc/index.php?topic=42158.msg305744#msg305744
Op de een of andere manier maakt hij er alleen ffff van in het begin.
Dit is mijn (eenvoudige) code:

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
Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1893
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

probeer dit eens

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

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1893
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Heemskerk, Netherlands
Offline Offline
Sr. Member
****
Karma: 10
Posts: 355
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Is het niet eenvoudiger op deze manier?
Code:
// 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

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

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1893
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Pages: [1]   Go Up
Jump to: