[gelöst] 3 Bytes in ein longint hineinschieben

Ich bin untröstlich. :wink:

Irgendwie versagt bei mir gerade die Logik im Kopf. Ich bekomme 3 einzelne Bytes nacheinander von der seriellen Schnittstelle und möchte diese in eine Variable longint hineinschieben. Die Bytes kommen hervorragend an und werden auch verarbeitet. Diese Frage ist aufbauend auf die These meines letzten Threads: [gelöst] 32 Bit Zahl in 4 x 8 Bit (Byte) zerhacken - Deutsch - Arduino Forum

Rein von meiner Logik müsste dies doch funktionieren:

/*
    ... ;-)
*/

// Declarations for use SPI:

int latchPin = 8;                 // Pin connected to ST_CP of 74HC595
int clockPin = 12;                // Pin connected to SH_CP of 74HC595
int dataPin = 11;                 // Pin connected to DS of 74HC595
int bait = 0;                     // Byte from serial read
unsigned long datenmenge = 0;     // size of sent datablock
unsigned long adresszaehler = 0;  // the adress of the counter

void setup() {

  // initialize serial:
  Serial.begin(9600);

  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  // initial clear all 4 Shiftout Registers
  for (int i=0; i <= 3; i++)
  {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0);
  digitalWrite(latchPin, HIGH);
  } 
 
  // Welcome message:
  Serial.println(" "); 
  Serial.println(" "); 
  Serial.println("Uploadserver V.1.2"); 
  Serial.println(" "); 
  Serial.print("Startadresse: "); 
}

void loop() {
  // if there's any serial available, read it:
    while (Serial.available() > 0) {
    bait = Serial.read(); // bait means 'Byte' to write into shiftout Register ;)

    if (datenmenge > 2){

        // shift out DATA byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (bait));
      digitalWrite(latchPin, HIGH);
      // shift out highest byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (adresszaehler >> 16));
      digitalWrite(latchPin, HIGH);
      // shift out high byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, (adresszaehler >> 8));  
      digitalWrite(latchPin, HIGH);
      // shift out low byte
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, adresszaehler);
      digitalWrite(latchPin, HIGH);
      adresszaehler ++;
    }
    
    if (datenmenge <3){
      
    // hier sollen die ersten ankommenden 3 byte 
    // in einen longint(adresszaehler) geschoben werden  
    
    adresszaehler = bait << 8;  // <- Hier ist irgendwo das Problem !
              
    Serial.print(bait,HEX);
    Serial.print(" ");
   }
   datenmenge ++; 
 }
}

Funktioniert aber nicht. Egal welche 3 Bytes ich im Terminalprogramm sende werden falsch ausgegeben. Die nachfolgenden Bytes lassen die LED´s des Adresszählers wunderbar weiterzählen. Ich befürchte, daß diese Zeile

adresszaehler = bait << 8;  // <- Hier ist irgendwo das Problem !

fehlerhaft ist.

Komisch. Ich hätte erwartet, daß die 3 Bytes nach und nach in das Longint hineingeschoben werden. Nach 3 Bytes ist eh Schluss, dann soll die Variable adresszaehler pro Byte um eins nach oben zählen. Das tut sie auch ganz wunderbar. Aber ich bekomme die 3 ersten Byte nicht in das Longint.

Das schiebt dir das jeweilige Byte nach links und weist das Ergebnis der Variablen zu. Damit geht die alte Information verloren.

Du musst erst deine Variable nach links schieben und dann das Byte mit ODER verküpfen:

adresszaehler = (adresszahler << 8) | bait;

Oder sowas in der Richtung. Ob das genau ist was du willst bin ich mir nicht 100%ig sicher.

Danke @Serenifly,

das war genau das was ich gesucht habe. Das Programm funktioniert mit dieser Änderung perfekt. Super Forum, Super Leute hier!

Ich bin begeistert. Bald geht es an den echten SRAM Baustein. Wenn die Sache komplett funktioniert, dann stell ich das hier auch als Projekt vor.

:slight_smile: