Hallo Zusammen !
Ich möchte serielle Daten meiner Heizung (hier Ebus) in ein struct schreiben.
Problem: Die empfangenen Daten haben immer eine dynamische Länge.
Wie kann ich das Array (dat) im Struct dynamisch vergrößern und verkleinern ?
Hier mein bisheriger Code:
#define RXD2 16
#define TXD2 17
#define SYN 0xAA;
bool paketRec = false;
int i;
int j;
int k;
struct eBus
{
uint8_t qq;
uint8_t zz;
uint8_t pb;
uint8_t sb;
uint8_t nn;
uint8_t dat[9]; // Maximale Anzahl der Bytes habe ich erstmal fest vergeben
uint8_t crc;
} eData;
void setup()
{
Serial.begin(9600);
Serial2.begin(2400, SERIAL_8N1, RXD2, TXD2);
}
void loop()
{
// Empfangene Daten in struct einlesen
bytes2Struct();
if(paketRec)
{
Serial.print("Quelle:");
printHex(eData.qq);
Serial.print("-");
Serial.print("Ziel:");
printHex(eData.zz);
Serial.print("-");
Serial.print("Befehl:");
printHex(eData.pb);
printHex(eData.sb);
Serial.print("-");
Serial.print("Bytes:");
Serial.print(eData.nn);
Serial.print("-");
Serial.print("Data:");
for(k=0; k< sizeof eData.dat / sizeof *eData.dat; k++) // Daten können hier dynamisch ausgegeben werden
{
printHex(eData.dat[k]);
}
Serial.print("-");
Serial.print("CRC:");
printHex(eData.crc);
Serial.println("");
}
}
void bytes2Struct()
{
struct eBus *p_eBus;
p_eBus = &eData;
uint8_t sBuffer;
paketRec = false;
if(Serial2.available())
{
sBuffer = Serial2.read();
if(sBuffer != SYN)
{
printHex(sBuffer);
switch(i)
{
case 0 :
p_eBus->qq = sBuffer;
i++;
break;
case 1 :
p_eBus->zz = sBuffer;
i++;
break;
case 2 :
p_eBus->pb = sBuffer;
i++;
break;
case 3 :
p_eBus->sb = sBuffer;
i++;
break;
case 4 :
p_eBus->nn = (int) sBuffer; // Anzahl der nachfolgenden Bytes (Größe die das Feld "eBus.dat" haben müsste)
i++;
break;
case 5 : // Hier werden die Daten gesammelt
if(j < (p_eBus->nn - 1))
{
if(j == 0)
{
memset(p_eBus->dat, 0, sizeof(p_eBus->dat)); // Array leeren
}
p_eBus->dat[j] = sBuffer;
j++;
}
else
{
p_eBus->dat[j] = sBuffer;
j = 0;
i++;
}
break;
case 6 :
p_eBus->crc = sBuffer;
i++;
break;
}
}
else
{
if(i > 0) // data finish
{
paketRec = true;
Serial.println("");
}
i = 0;
}
}
}
void printHex(uint8_t x) {
if (x <= 0x0F) Serial.print("0");
Serial.print(x,HEX);
}