1 Einführung in UARTs
UART ist eine zeichenorientierte universelle Datenverbindung, die die Kommunikation zwischen Geräten ermöglicht. Durch die asynchrone Übertragung ist es nicht erforderlich, den gesendeten Daten Taktinformationen hinzuzufügen. Dies erfordert auch, dass die Rate, das Stoppbit, das Paritätsbit usw. des sendenden Endes und des empfangenden Endes gleich sein müssen, damit die Kommunikation erfolgreich sein kann.
1.1 UART-Kommunikationsprotokoll
Ein typischer UART-Frame beginnt mit einem Startbit, gefolgt von gültigen Daten, dann Paritätsbits (optional) und schließlich Stoppbits.
Das Paketformat ist wie folgt
Startbit
UART-Datenübertragungsleitungen werden normalerweise auf einem hohen Spannungspegel gehalten, wenn keine Daten übertragen werden. Um mit der Datenübertragung zu beginnen, zieht der sendende UART die Übertragungsleitung für einen Taktzyklus von High auf Low. Wenn der empfangende UART einen Übergang von hoch nach niedrig erkennt, beginnt er, die Bits im Datenrahmen mit der Baudrate zu lesen.
Datenrahmen
Datenrahmen enthalten die tatsächlich übertragenen Daten. Wenn ein Paritätsbit verwendet wird, kann dieses 5 bis 8 Bit lang sein. Wenn kein Paritätsbit verwendet wird, kann der Datenrahmen 9 Bit lang sein.
Paritätsbits
Parität beschreibt, wie gerade oder ungerade eine Zahl ist. Mithilfe des Paritätsbits kann der empfangende UART feststellen, ob sich die Daten während der Übertragung geändert haben. Elektromagnetische Strahlung, nicht übereinstimmende Baudraten oder lange Datenübertragungen können Bits verändern.
Stopp-Bits
Um das Ende eines Pakets zu signalisieren, steuert der sendende UART die Datenleitung für eine Dauer von 1 bis 2 Bit von Low auf High.
Das Folgende ist die Wellenform der Baudrate: 115200, Datenbits: 8, Parität: Keine, Stoppbits: 1
2 Durchflusskontrolle
Streaming dient hauptsächlich dazu, das Problem der Geschwindigkeitsinkongruenz zwischen der sendenden und der empfangenden Partei zu lösen. Wenn die vom empfangenden Ende empfangenen Daten nicht verarbeitet werden können, sendet es ein Signal, das es nicht mehr an das sendende Ende empfängt. Nach dem Empfang dieses Signals stoppt das sendende Ende das Senden, bis es ein Signal empfängt, das weiterhin senden kann. Die Flusskontrolle kann den Fortschritt der Datenübertragung steuern und so Datenverlust verhindern.
2.1 Hardware-Flusskontrolle
Für die Hardware-Flusssteuerung sind neben RX und TX zwei zusätzliche Steuerleitungen erforderlich, eine heißt CTS (Clear To Send) und ist ein Eingangssignal; die andere heißt RTS (Require To Send) und ist ein Ausgangssignal. Eine dieser beiden Leitungen empfängt die Steuerung und die andere sendet die Steuerung. Ein niedriger Pegel zeigt an, dass Daten gesendet werden können, und ein hoher Pegel zeigt an, dass das sendende Ende warten muss.
2.2 Software-Flusskontrolle
Bei der Software-Flusskontrolle werden die Sonderzeichen XON(0x11) und XOFF(0x13) in die gesendeten Daten eingefügt, um die Übertragung zu steuern. Erzwingen Sie, dass der Sender mit dem Senden von Daten aufhört, indem Sie XOFF einfügen, und zwingen Sie den Sender, Daten zu senden, indem Sie XON einfügen.
2.3 Unterschiede
Hardware-Flusskontrolle | Software-Flusskontrolle |
---|---|
Die Hardware muss zwei zusätzliche Drähte hinzufügen | Hardware muss nicht geändert werden |
Kann Transfers schnell stoppen | Sie müssen warten, bis die vorherige Datenübertragung abgeschlossen ist, da es zu einer Verzögerung kommt |
kein Missbrauch | Möglicherweise liegt eine Fehlerkennung vor (die empfangenen Daten stimmen mit dem Steuerzeichen überein). |
Im Allgemeinen wird in einer Umgebung, in der es zu einem Überlauf kommen kann, die Hardware-Flusskontrolle bevorzugt.
2.4 Beziehung zwischen UART und TTL, RS232
UART achtet stärker auf Standards, die das Codierungsformat angeben, z. B. Baudrate, Rahmenformat und Baudratenfehler usw., was eher einem spezifizierten Protokoll ähnelt. Serielle Kommunikationsschnittstellen wie RS232, TTL und RS485 definieren unterschiedliche elektrische Eigenschaften der Schnittstelle. Beispielsweise ist RS-232 ein Single-Ended-Ein- und -Ausgang, während RS-485 ein differenzieller Ein- und Ausgang ist. Hardware.
TTL | RS232 | RS485 | |
---|---|---|---|
Pegelsignal | Das Pegelsignal beträgt 5 V oder 3,3 V | Der Signalpegel der Schnittstelle ist relativ hoch, plus oder minus 6-15 V sind akzeptabel | Hoher und niedriger Pegel werden durch die minimale Differenzspannung bestimmt |
Übertragungsmethode | Vollduplex | Vollduplex | Halbduplex |
Übertragungsentfernung | Theoretisch 10 Fuß (5 m), schlechte Störfestigkeit | Bis zu 15 m Kommunikationsentfernung | Differenzsignal, theoretische Kommunikationsentfernung bis zu 1200 Meter |
Der Chip-UART ist im Allgemeinen auf TTL-Ebene.
2,5 USB-zu-TTL-Seriell-Chip
Im tatsächlichen Gebrauch verwenden wir den USB-Anschluss des Computers, um auf die UART-Peripheriegeräte des ESP32 zuzugreifen. In der Mitte benötigen wir einen seriellen USB-zu-TTL-Port-Chip. Im Folgenden sind einige derzeit gängige Typen aufgeführt. In einer Tabelle werden ihre verschiedenen Eigenschaften verglichen:
CP2102/2103 | CH340-Serie | FT232R | PL2303HX | |
---|---|---|---|---|
Hersteller | Silizium | Nanjing Qinheng | FDTI | Produktiv |
Höchstsatz | 1 M | 2 M | 3 M | 12 M |
Bit | 5, 6, 7, 8 | 5, 6, 7, 8 | 7、8 | 5, 6, 7, 8 |
Prüfziffer | ungerade/gerade/1/0/keine | ungerade/gerade/1/0/keine | ungerade/gerade/1/0/keine | ungerade/gerade/1/0/keine |
Stoppbit | 1、1.5、2 | 1、2 | 1、2 | 1、1.5、2 |
Hardware-Flusskontrolle | haben | haben | haben | haben |
Stabilität | Gut | Gut | am meisten | Unterschied |
Preis | Mitte | Niedrig | hoch | Niedrig |
Die meisten aktuellen Entwicklungsboards der ESP32-Serie integrieren CP2102.
3 ESP32 UART-Hardware
Die aktuellen Chips der ESP32-Serie integrieren alle mehrere UART-Peripheriegeräte und unterstützen asynchrone Kommunikation (RS232 und RS485) sowie IrDA.
Im Folgenden sind die Unterschiede zwischen UARTs verschiedener Chips aufgeführt.
ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C3 | ESP32-C2 | |
---|---|---|---|---|---|
Anzahl der UARTs | 3 | 2 | 3 | 2 | 2 |
Maximale Kommunikationsrate | 5 Mbit/s | 5 Mbit/s | 5 Mbit/s | 5 Mbit/s | 2,5 Mbit/s |
Ob DMA unterstützt werden soll | Ja | Ja | Ja | Ja | NEIN |
Aus dem Test auf der AT-Seite geht hervor, dass die maximale tatsächliche UART-Kommunikationsrate mit dem Dupont-Kabel 2 Mbit/s erreichen kann. Bei Überschreitung sind die Daten falsch. Wenn eine höhere Kommunikationsrate erforderlich ist, ist es am besten, das Kabel von der Leiterplatte zu verlegen .
3.1 Gemeinsame Interrupts
Interrupt-Name | Einführung |
---|---|
UART_TX_DONE_INT | Dieser Interrupt wird ausgelöst, wenn der Sender alle Daten im FIFO gesendet hat |
UART_RXFIFO_TOUT_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger ein Byte empfängt, das länger als UART_RX_TOUT_THRHD ist |
UART_RXFIFO_OVF_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger mehr Daten empfangen hat, als der FIFO speichern kann |
UART_FRM_ERR_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger einen Datenrahmenfehler erkennt |
UART_PARITY_ERR_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger einen Paritätsfehler erkennt |
UART_TXFIFO_EMPTY_INT | Dieser Interrupt wird ausgelöst, wenn die Datenmenge im Sende-FIFO kleiner ist als der durch UART_TXFIFO_EMPTY_THRHD angegebene Wert |
UART_RXFIFO_FULL_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger mehr Daten empfangen hat, als durch UART_RXFIFO_FULL_THRHD angegeben |
UART_WAKEUP_INT | Dieser Interrupt wird generiert, wenn der UART aufgeweckt wird |
UART_BRK_DET_INT | Dieser Interrupt wird ausgelöst, wenn der Empfänger nach dem Stoppbit einen NULL-Wert erkennt |
Der UART-RF-FIFO und der TX-FIFO des ESP-Chips teilen sich einen Teil des RAM-Speicherplatzes. Bei der Implementierung von IDF sind der RX-FIFO und der TX-FIFO unabhängig voneinander und die Länge beträgt 128 Byte. Der Überlauf-Interrupt von OVF wird ausgelöst, nachdem der Empfang den Maximalwert von FIFO überschreitet.
3.2 Implementierung von ESP-IDF
Derzeit verwendet ESP-IDF UART RF FIFO zum internen Lesen und Schreiben und verwendet kein UART DMA. Aber im UART-Treiber werden TX-FIFO und RX-FIFO jeweils mit dem entsprechenden Ringpuffer verbunden.
- Nachdem der RX-FIFO die Daten empfangen hat, wirft er die Daten an den RX-Ringpuffer und löst das UART_DATA-Ereignis aus
- Der Ringpuffer von TX beginnt mit dem Senden von Daten an den TX-FIFO, nachdem er Daten der Anwendungsschicht empfangen hat
Während dieser Zeit wird der aktuelle Status durch UART-Ereignisse und die Entsprechung zwischen UART-Ereignissen und Interrupts identifiziert
Fall | Unterbrechen | Kommentar |
---|---|---|
UART_DATA | 1. UART_RXFIFO_TOUT_INT 2. UART_RXFIFO_FULL_INT |
1. Timeout: 10 Byte Übertragungszeit 2. Vollständiger Thresh: 120 Byte |
UART_FIFO_OVF | UART_RXFIFO_OVF_INT | Der FIFO-Überlaufschwellenwert beträgt 128 Byte |
UART_BUFFER_FULL | / | Der anfängliche UART-RX-Ringpufferwert ist voll |
UART_PATTERN_DET | UART_INTR_CMD_CHAR_DEF | Es wird eine bestimmte Anzahl von Sonderzeichen empfangen, z. B. „+++“ in AT |
UART_BREAK | UART_INTR_BRK_DEF | erhaltenBREAK |
UART_FRAME_ERR | UART_FRM_ERR_INT | |
UART_PARITY_ERR | UART_PARITY_ERR_INT | |
UART_DATA_BREAK | / | uart_write_bytes_with_break Senden Sie BREAK, nachdem die Daten gesendet wurden |
UART_WAKEUP | UART_WAKEUP_INT |
Hinweis: Das BREAK-Signal hat einen niedrigen Pegel, der für einen bestimmten Zeitraum anhält (länger als ein UART-Frame).
3.3 Häufige Problemanalyse
-
Die Länge der beim Aufruf
uart_read_bytes
der Schnittstelle gelesenen Daten ist kürzer als die tatsächlich gesendeten Daten- Chips der ESP32-Serie verwenden FIFO zum Lesen und Schreiben von UART-Daten. Standardmäßig wird bei 120 Byte ein Interrupt generiert, um den blockierten Zustand
uart_read_bytes
zu entfernen Wenn die Sendelänge mehr als 122 Byte beträgt, kann es erforderlich sein, die UART_READ-Schnittstelle mehrmals aufzurufen lesen
- Chips der ESP32-Serie verwenden FIFO zum Lesen und Schreiben von UART-Daten. Standardmäßig wird bei 120 Byte ein Interrupt generiert, um den blockierten Zustand
-
Die während der UART-Initialisierung konfigurierte rx_buffer_size ist offensichtlich sehr groß, es kommt jedoch zu Datenverlust
- Der Datenverlust wird dadurch verursacht, dass der FIFO voll ist. Zu diesem Zeitpunkt werden die Daten nicht rechtzeitig in den Empfangspuffer übertragen. Im Allgemeinen wird UART_FIFO_OVF ausgelöst. Zu diesem Zeitpunkt wird empfohlen, eine Flusskontrolle hinzuzufügen oder den Schwellenwert FULL_THRESH zu senken.
-
Nachdem der ESP32 die Schlafschnittstelle aufgerufen hat, ist die UART-Kommunikation abnormal
- ESP32 UART unterstützt zwei Taktquellen, 80 MHz APB_CLK und Referenztakt REF_TICK. APB_CLK wird standardmäßig verwendet und diese Taktquelle funktioniert im Ruhezustand nicht mehr. Wenn Sie den Ruhezustand unterstützen müssen, müssen Sie daher REF_TICK konfigurieren, wenn UART initialisiert wird. Beachten Sie, dass diese Taktquelle nur mit einer Baudrate ausgeführt werden kann von 115200.