C++ - Hilfe Interpretieren der Anweisungen einer CRC-Fehlerprüfungs-Programmieraufgabe

Das ist unkonventionell, basierend auf dem, was ich gesehen habe, aber ich kann die Assistenten meines Professors nicht erreichen, um diese Aufgabe zu klären. Ich hoffe es ist noch ok hier zu posten.

Ich würde mich sehr über etwas Hilfe von Ihnen bei der Interpretation der Anweisungen für eine Programmieraufgabe freuen, die ich erhalten habe und die sich auf Paritätsbits und CRC-Fehlerprüfung bezieht. Ich hätte gerne Hilfe bei der Logik hinter den Anweisungen und eine Anleitung dazu, was die in den Anweisungen genannten Prozesse tun sollen. Sobald ich die Logik verstanden habe, plane ich (zumindest hoffe ich), mich von dort aus selbst um den eigentlichen Programmierteil kümmern zu können.

Ich finde, die Anweisungen sind nicht sehr prägnant (obwohl sie für diejenigen, die mit dem Material vertraut sind, in Ordnung sein können). Sätze, die mich besonders verblüffen, werden fett + kursiv dargestellt :

Fehlererkennung und Codierung: Parität, CRC & FEC

Teil 1:

a) Schreiben Sie ein Programm (in einer beliebigen Sprache wie C, C++, Java, Javascript oder Python), das ein Paritätsbit ( gerade oder ungerade – Sie wählen ) für jedes Datenbyte generiert, und überprüfen Sie seine korrekte Funktion.

b) Schreiben Sie ein anderes Programm, um korrekte Daten basierend auf der von Ihnen definierten Parität zu erkennen. Verwenden Sie dann das Programm, um ein Datenbyte zusammen mit dem Paritätsbit (insgesamt 9 Bits) zu generieren, und beobachten Sie, was passiert, wenn in einem bestimmten Byte 0, 1, 2 oder 3 Bits fehlerhaft sind . Fügen Sie einen Screenshot der Ergebnisse (Befehlszeile oder andere) bei und besprechen Sie die Wahrscheinlichkeit, dass ein unerkannter Fehler auftritt.

Teil 2:

a) Schreiben Sie ein Programm, das eine 8-Bit-CRC-Prüfsumme für einen Datenstrom generiert . Es folgt ein Beispiel dieses Programms in Pseudocode. Dasselbe Programm kann verwendet werden, um den korrekten Empfang des Datenstroms zu überprüfen. Der einfachste Datenstrom, für den dies verwendet werden kann, sind zwei Bytes; Simulieren Sie mindestens 5 verschiedene 2-Byte-Datenströme sowohl mit als auch ohne Fehler und protokollieren Sie die Ergebnisse. Besonders interessant sind Fehlerdatenströme, die sich nur um 1 Bit von den korrekten Daten unterscheiden.

b) Simulieren Sie außerdem mindestens einen 32-Byte-Datenstrom mit mindestens einem Fehler und protokollieren Sie die Ergebnisse. Fügen Sie einen Screenshot der Ergebnisse bei und diskutieren Sie die Wahrscheinlichkeit, dass ein unerkannter Fehler auftritt.

Pseudocode des CRC-Programms

Initialize counter and data stream
Loop for each bit in data stream
Define next states for each bit
Next Bit 1 = next bit of Data In
Next Bit 2 = Present Bit 1
Next Bit 3 = Present Bit 2 XOR
present Bit 8
Next Bit 4 = Present Bit 3 XOR
present Bit 8
Next Bit 5 = Present Bit 4 XOR
present Bit 8
Next Bit 6 = Present Bit 5
Next Bit 7 = Present Bit 6
Next Bit 8 = Present Bit 7
Move next states into present states
Present Bit 1 = Next Bit 1
Present Bit 2 = Next Bit 2
Present Bit 3 = Next Bit 3
Present Bit 4 = Next Bit 4
Present Bit 5 = Next Bit 5
Present Bit 6 = Next Bit 6
Present Bit 7 = Next Bit 7
Present Bit 8 = Next Bit 8
Output CRC encoder byte to screen
End loop
Output final CRC checksum byte

Teile in Fett- und Kursivschrift :

1a)

  • Ich erstelle eine Funktion, durch die ich manuell ein Byte eintippe, um mein Programm zu testen. Richtig?

  • " gerade oder ungerade - Sie wählen " - Ich weiß, dass ein Byte eine Kette von 8 Bits ist, von denen jedes entweder eine 1 oder eine 0 ist . Ich weiß, dass ein Paritätsbit ein "9. Bit" ist, das am Ende der Bitfolge angehängt wird. Ich denke, "gerade oder ungerade - Sie wählen" bedeutet, dass ich entscheiden sollte, ob ein 1- Paritätsbit anzeigt, dass das Byte eine gerade Anzahl von Einsen enthält oder dass das Byte eine ungerade Anzahl von Einsen enthält. Richtig?

1b)

  • Ich erstelle jetzt einen Byte-Generator, der – basierend darauf, ob es eine gerade oder ungerade Anzahl von Einsen in den generierten Bytes gibt – ein Paritätsbit anheftet , das eine 1 oder eine 0 ist . (Lassen Sie uns jetzt einfach entscheiden, dass eine gerade Anzahl von 1 bedeutet, dass das Paritätsbit 1 ist und umgekehrt) . Ist das richtig?

  • " Korrekte Daten basierend auf der Parität erkennen " - Also ... Bestätigen Sie einfach, dass ich die richtige Anzahl von 1 in meinem Byte habe, basierend auf dem Wert des Paritätsbits? Ist das nicht dasselbe wie "seine korrekte Funktion überprüfen" aus Schritt a) ? Welche Bytes verwenden wir für diesen Schritt? Wir haben unseren Byte-Generator noch nicht erstellt. Wir wurden bereits in Schritt a) gebeten, "die korrekte Funktion [des Paritätsbits] zu überprüfen" , also ist dieser Schritt überflüssig?

  • " Was passiert, wenn 0, 1, 2 oder 3 Bits fehlerhaft sind " - Warte. Soll ich also absichtlich einen Byte-Generator erstellen, der Fehler in einigen der generierten Bytes enthält? Wie würde ich überhaupt wissen, dass ein generiertes Byte einen Fehler enthält ? Ich habe keinen "Basisfall" oder "korrekte Version des Bytes", um jedes Byte zu vergleichen. Wer sagt, dass da ein Fehler drin ist?

  • Wahrscheinlichkeit eines unerkannten Fehlers - Wir haben es mit 1 Byte oder 8 Bits zu tun. Ich habe diese Seite gefunden , die die Wahrscheinlichkeit eines unerkannten Fehlers in 8-Bit-Systemen angibt P u e = 1 ( 1 Q ) 8 . Ist das die richtige Standardgleichung, die verwendet wird? Wäre die Wahrscheinlichkeit in einem 16-Bit-System genau so groß P u e = 1 ( 1 Q ) 16 ?

2a)

8-Bit-CRC-Prüfsumme - Also muss ich eine Funktion schreiben, die eine Folge von XOR-Gattern an zufälligen Positionen in der 8-Bit-Folge generiert? Basierend auf dem Bild unten?:

Geben Sie hier die Bildbeschreibung ein

Ich nehme an, es kann keine 0 XOR-Gatter geben und es kann keine XOR-Gatter mit allen 8 Bits geben. Gibt es weitere Einschränkungen beim Generieren einer CRC-Prüfsumme? Wenn also der 8-Bit-Encoder wie oben aussehen würde, wäre die Prüfsumme 01110000 ? Was mache ich mit der Prüfsumme?

2-Byte-Datenströme sowohl mit als auch ohne Fehler - 2 Bytes sind 16 Bits. Verwenden wir in diesem Schritt den Prüfsummengenerator? Soll ich den Prüfsummengenerator so programmieren, dass er gelegentlich Fehler macht? In diesem Fall wäre ein "Fehler" ein Byte, das den CRC-Encoder passiert und mit einer 1 endet, wo eine 0 sein sollteoder umgekehrt. Richtig? Ich soll es so programmieren, dass die XOR-Gatter/CRC-Encoder nicht immer ihre Arbeit machen?

Ich hoffe, Ihr Lehrer lässt Sie auch wissen, dass Paritätsprüfungen eine schreckliche, unprofessionelle Methode sind, um nach Fehlern jeglicher Art zu suchen, und dass Sie solchen Mist niemals in realen Anwendungen verwenden sollten. Insbesondere nicht im Rahmen der UART-Kommunikation.

Antworten (1)

Der Reihe nach durchgehen und nicht speziell für Hausaufgaben beantworten.

1a Ich würde einen Bytestream nicht manuell eingeben, aber es ist einfach, ein Skript zu schreiben, um eine schöne Auswahl bekannter Werte zu generieren. Grüße ein Paritätsbit, ja, Sie haben Recht.

1b Sie haben richtig angefangen. Es ist nicht überflüssig, da 1a ein Skript schreiben sollte, das ein Paritätsbit generiert, und 1b ein Skript schreiben soll, das das Paritätsbit überprüft. Sie müssen einen bekannten Bytestrom erstellen, der korrekt ist, und dann können Sie zufällig einige Bits umdrehen und sehen, ob der Paritätsprüfer einen Fehler anzeigt. Offensichtlich müssen Sie nachverfolgen, ob Sie ein wenig umgedreht sind. Sie können die Fragenteile bearbeiten.

2 Sie müssen ein bisschen mehr über Prüfsummen lesen, aber wieder sind Sie auf den richtigen Zeilen. Die Fehler im Bytestrom beziehen sich auf beschädigte Übertragungen, nicht auf Fehler im CRC-System.