Sebastian Z. schrieb:
> Hat einer von euch eine Idee, wo hier das Problem liegen könnte.
Dein Hauptproblem ist deine scheusliche Codeformatierung
Wenn ich das mal etwas umformatiere
1 | case 0x08:
|
2 | switch (*(data_ptr+3))
|
3 | {
|
4 | i=6;
|
5 |
|
6 | case 0x0E:
|
7 | //send[0] = 0x11; Problem trotzdem vorhanden
|
8 | //send[1] = 0x08;
|
9 | send[2] = 0x00,
|
10 | send[3] = 0x0E;
|
11 | send[4] = cpt_4 >> 8;
|
12 | send[5] = cpt_4;
|
13 | break;
|
14 | };
|
15 | break;
|
16 |
|
17 | };
|
dann sieht man, dass das i=6 an einer Stelle steht, an der es nie
ausgeführt wird.
Der Wert von i ist aber kritisch, weil er danach noch gebraucht wird. Er
sollte eigentlich 6 sein, ist aber tatsächlich noch 0. Zu allem
Überfluss überprüfst du auch nicht ob i einen vernünftigen Wert (!=0)
hat, ehe du dann mit der CRC weitermachst, ob also überhaupt einer der
switch-cases genommen wurde oder ob die Funktion ungültige Daten
bekommen hat. Mit einer derartigen Prüfung wäre es dir eventuell sogar
aufgefallen, dass im Falle 0x08 0x0E überhaupt nichts gesendet wird,
weil i immer noch 0 ist.
Und durch deine Codeformatierung hast du das alles so angeordnet, dass
es nicht auf den ersten Blick auffällt. Ich habs auch erst gemerkt,
nachdem ich den Code in Gedanken umformatiert habe, weil ich es hasse, 2
Anweisungen in einer Zeile zu haben.
PS: Hinter deinen ganzen } brauchst du keinen ;
Der verwirrt mehr als er nützt. Und an bestimmten STellen würde dieser ;
sogar für Ärger sorgen. ALso gewöhn ihn dir besser gleich wieder ab.