Ich bin untröstlich.
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.