Parität Bits Prüfen

Gast #3458510
Lesenswert?

Hallo, ich lese Daten (EM Tags) in Bytes ein, wobei nach jedem vierten 
Bit ein Paritätsbit übertragen wird. Die Paritätbits speichere ich und 
mache anschließend die Prüfung.
Speichern
1
    if (data_bit_counter > 40 && data_bit_counter <= 45) {
2
      if(bit) {
3
        tagData[4] |= (1 << (data_bit_counter -41));
4
      }
5
      else {
6
        tagData[4] &= ~(1 << (data_bit_counter -41));
7
      }
8
    }
9
    else // Parity Check
10
    if (data_bit_counter == 45) {
11
      if (bit) {
12
        paritybits |= (1 << 1);
13
      }
14
    }
15
    else
16
    if (data_bit_counter > 45 && data_bit_counter <= 49) {
17
      if(bit) {
18
        tagData[4] |= (1 << (data_bit_counter -42));
19
      }
20
      else {
21
        tagData[4] &= ~(1 << (data_bit_counter -42));
22
      }
23
    }
24
    else // Parity Check
25
    if (data_bit_counter == 50) {
26
      if (bit) {
27
        paritybits |= (1 << 0);
28
      }
29
    }

Prüfen
1
    tag_nibble = ((tagData[4] & 0b11110000) >> 4);
2
      parity = 0;
3
      for (i = 0; i < 4; i++) {
4
        
5
        if (tag_nibble & 0x8) {
6
          parity += 1;
7
        }
8
        tag_nibble <<=  1;
9
      }
10
      if ((parity & 0x01) != ((paritybits) & 0x01)) {
11
        ParityErrorFlag = true;
12
      }
13
      //  parity second nibble
14
      tag_nibble = (tagData[4] & 0b00001111);
15
      parity = 0;
16
      for (i = 0; i < 4; i++) {
17
        
18
        if (tag_nibble & 0x8) {
19
          parity += 1;
20
        }
21
        tag_nibble <<=  1;
22
      }
23
      if ((parity & 0x01) != ((paritybits >> 1) & 0x01)) {
24
        ParityErrorFlag = true;
25
      }

Leider wird ParityErrorFlag  immer auf "true" gesetzt. Sieht jemand 
einen Denkfehler?
#3458543
Lesenswert?

>speichern:
> if(bit) {
bit ist nicht definiert, also kann hier nur einer mit 'ner Glaskugel 
helfen.

prüfen:
im ersten Nibble ergibt
>if (tag_nibble & 0x8) {
spätestens nach dem ersten Schleifenduchlauf immer false :P

im zweiten Nibble ergibt
>if (tag_nibble & 0x8) {
für den ersten Durchlauf immer false
und das LSB wird nie geprüft
und über paritybits kann man hier keine Aussage machen, weil das ja 
schon unbestimmbar ist, weil beim SPEICHERN Variable bit unbekanntes 
Verhalten hat.
Gast #3458555
Lesenswert?

Detlef Kunz schrieb:
>> if(bit) {
> bit ist nicht definiert, also kann hier nur einer mit 'ner Glaskugel
> helfen
bit hat den Wert 0 oder 1 und spiegelt den Zustand der Leitung. Also 
soweit in Ordnung.

Detlef Kunz schrieb:
> im zweiten Nibble ergibt
>>if (tag_nibble & 0x8) {
> für den ersten Durchlauf immer false
> und das LSB wird nie geprüft
> und über paritybits kann man hier keine Aussage machen
Hier habe ich nicht verstanden, was du meinst.
#3458562
Lesenswert?

Anta schrieb:
> Detlef Kunz schrieb:
> Detlef Kunz schrieb:
>> im zweiten Nibble ergibt
>>>if (tag_nibble & 0x8) {
>> für den ersten Durchlauf immer false
>> und das LSB wird nie geprüft
>> und über paritybits kann man hier keine Aussage machen
> Hier habe ich nicht verstanden, was du meinst.

Ups, mein Fehler.
Neu: für das zweite Nibble ist das ok,

 aber für das erste wird
1
        if (tag_nibble & 0x8) {
immer false ergeben.
Richtig wäre:
1
        if (tag_nibble & 0x80) {
#3458671
Lesenswert?

Tja, dann musst Du da eben mal mit dem Debugger live den Daten auf die 
Finger sehen.
Vielleicht werden die Paritätsbits von Sender schon falsch gesetzt, oder 
die Auswertung am Schluß ist falsch. Erwartet wird da Even-Parity.
Also die Anzahl der Einsen (einschließlich des Paritätsbit) muss gerade 
sein.
Wenn ich das korrekt sehe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren