Größe des FIFO-Ringpuffers in über UART

Ich versuche, ein UART-Protokoll zu implementieren, um die Kommunikation zwischen zwei Karten herzustellen. Daten sind ASCII-kodiert und Nachrichtenlängen sind variabel. Ich habe mich entschieden, ein Paket zu implementieren, um Informationen zu "kapseln".

Paket: {STX, DATA, ETX}.

STX ist "Start of text" in der ASCII-Tabelle. Sein Hex-Code ist 0x02, ETX ist "Textende". Sein Hex-Code 0x03. Jedes Byte im DATA-Feld kann jeden Wert von 0x00bis 0x7Faußer 0x02und annehmen 0x03.

Problem 1: Datenlänge
Wie sendet man variable Datenlängen über UART?
Beispiel: {STX, Hallo\0, RTX} und {STX, Dies ist ein langer Text\0, RTX}

Ich habe im Internet gegraben und festgestellt, dass der beste Ansatz darin besteht, einen FIFO-Ringpuffer zu verwenden. Das Problem ist, wie in diesem Fall zu beheben BUFFER_SIZE? Nehmen wir an, ich habe etwas nachgerechnet und herausgefunden, dass die längste Nachricht, die ich über UART übertragen werde, 90 Bytes und die kürzeste 4 Bytes beträgt. sollte ich #define BUFFER_SIZE 90oder muss ich einen größeren Puffer nehmen?

Wie funktioniert FIFO in beiden Fällen in diesen Fällen:
Fall 1: DATA length < BUFFER_SIZE.
Beispiel: {STX, ABCD, ETX} und BUFFER_SIZE = 90 Bytes.

Fall 2: Puffer ist voll, aber es kommen noch Daten an.
Beispiel: BUFFER_SIZE = 13

Paket: {STX, READ_X, ETX}{STX, REMOVE_Y,ETX}.

In HEX lauten diese Nachrichten
0x02 0x52 0x45 0x41 0x44 0x5f 0x58 0x00 0x03 0X02 0x52 0x45 0x4d 0x4f 0x56 0x45 0x5f 0x59 0x00 0x03

Puffer ist voll, wenn wir erreichen 0x4d(kursiv). Wie geht es mit dieser Situation um?

In der Frage sagten Sie: " Puffer ist voll, wenn wir ankommen0x04 ". Meinen Sie nicht - Puffer ist voll, wenn wir ankommen0x4d ?
@SamGibson Ja! Mein Fehler

Antworten (2)

Offensichtlich müssen Sie einen Prozess haben, der Daten aus dem FIFO nimmt, wenn er feststellt, dass er nicht leer ist. Der FIFO muss dann tief genug sein, um sich um die ungünstigste Fehlanpassung zwischen der Einzahlungsrate und der Entnahmerate zu kümmern.

Im Allgemeinen sind UARTs normalerweise langsam genug, dass die anderen CPU-Aktivitäten mithalten können, was bedeutet, dass der FIFO relativ flach sein kann, aber wenn Ihre Anwendung ausreichend komplex ist, stellen Sie möglicherweise fest, dass ein größerer Puffer benötigt wird.

Wenn Sie beispielsweise wissen, dass der verbrauchende Prozess für einige Zeit blockiert werden kann, muss der FIFO tief genug sein, um mindestens die Anzahl von Zeichen aufzunehmen, die in dieser Zeit ankommen können.

Die Routine, die den uart liest und Zeichen in den FIFO (normalerweise ein Interrupt) schreibt, sollte das DATA_AVAILABLE-Flag prüfen, bevor sie ihn verlässt (und bei Daten erneut ausgeführt wird). UART RXs sind normalerweise doppelt gepuffert und können 2 Bytes verfügbar haben - insbesondere wenn der Fifo-Push-Code beendet ist

Als Erster rein, als erster raus. Welche Daten auch immer hereinkommen, sie werden sequentiell im FIFO gespeichert, beginnend bei einer Speicherstelle. Angenommen, die FIFO-Datenbreite beträgt ein Byte und die Gesamtspeichergröße beträgt 90 Bytes, bedeutet dies, dass sie 90 Speicherplätze hat und jedes eingehende Byte sequentiell in den Speicherplätzen speichert. Sie lesen Bytes davon in der Art "First Written First Read". Wenn Sie ein Byte lesen, ist diese Stelle jetzt "frei", um überschrieben zu werden. FIFO wird als voll bezeichnet, wenn Sie Bytes bis zu seiner vollen Kapazität geschrieben, aber noch kein Byte gelesen haben. Angenommen, der FIFO ist voll und die Daten kommen immer noch, was passiert, ist, dass neue Bytes die ältesten Daten (von der ersten Stelle) nacheinander überschreiben. Daher tritt Datenverlust auf. Sie müssen also den Puffer lesen, bevor er voll wird. Angenommen, 90 Bytes gehen mit einer Baudrate in den FIFO des UART-Empfängers ein. Abhängig von der Baudrate wird es in einer bestimmten Zeit voll, bevor die gesamte Nachricht empfangen wird. Wenn Sie FIFO mit einer Größe < 90 Bytes verwenden, müssen Sie sicherstellen, dass Sie die Bytes lesen, bevor sie voll werden. Wenn die FIFO-Größe größer als 90 Bytes ist und keine weiteren Bytes eingehen, bleiben die Daten dort im FIFO, und Sie können diese Bytes jederzeit lesen.