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?