Andreas schrieb:
> fehlendeDatensaetze &= ~(1 << message_sequence_counter);
"1" als Konstante hat bei C immer den Typ "int", der bei dir offenbar 16 
Bit hat, wovon eines das Sign-Bit ist. Die Berechnung der Bitmaske 
erfolgt komplett mit dem Typ "int", deshalb kommt es ab 15 für 
message_sequence_counter zu undefiniertem Verhalten.
Um den Compiler zu zwingen, einen anderen Datentyp zu verwenden, musst 
du der Konstanten den entsprechenden Typ verpassen, entweder über Cast:
| 1 | fehlendeDatensaetze &= ~((uint32_t)1 << message_sequence_counter);
 | 
oder durch einen Suffix an der Konstanten:
| 1 | fehlendeDatensaetze &= ~(1UL << message_sequence_counter);
 | 
Welchen der Wege du wählst bleibt deinem Gusto überlassen.
Was du noch vielleicht noch wissen solltest: ein Shift um einen 
variablen Wert kann z.B. bei AVR eine ziemlich teure Operation werden, 
insbesondere mit 32Bit-Werten wie hier. Im Extremfall (bei 
message_sequence_counter=31) braucht der Shift auf AVR mehr als 200 
Takte! Wenn es also eng wird mit der Rechenleistung, dann kann sowas im 
C-Code harmlos aussehendes durchaus zum Problem werden.
Andreas