02 - Korrigiertes UART-/USART-Beispiel (Kap. 15)

In Kapitel 15 meines STM32-Buches hatte ich ein Beispielprojekt zum Einsatz der UART-/USART-Schnittstelle entwickelt, das zu dem Zeitpunkt, als dieser Abschnitt entstand, nicht völlig korrekt funktionierte: Hierauf hatte ich in der ersten Hinweisbox auf Seite 275 auch hingewiesen und versprochen, eine Lösung nachzureichen: Dieses Versprechen will ich nun einlösen.

Fehlerursache

Der wesentliche Grund für das geschilderte Problem — die vom Terminalprogramm HTerm zum STM32 gesendeten Zeichen wurden nur teilweise wieder an HTerm zurückgesendet — lag in der unzureichenden Abfrage des Status und der Konfiguration der seriellen Schnittstelle innerhalb der Interrupt-Service-Routine (ISR). Vielen Dank an den Leser Herrn Buchmann, der mich bei der Lösung des Problems hervorragend unterstützt hat.

Die einfache Abfrage des TXE-Statusbits — eingebettet in die Abfrage if (USART2->SR & USART_SR_TXE) — reicht alleine nicht aus, da diese Bedingung sofort erfüllt ist: Wenn der Sendepuffer leer ist, so versucht HTerm Daten zum STM32 zu senden, die zu verschiedenen Zeitpunkten gar nicht vorhanden sind! Die Bedingung, die zusätzlich erfüllt sein muss, ist, dass der TX-Interrupt aktiviert sein muss. Der TX-Interrupt soll aber standardmäßig nur aktiviert werden, wenn Daten für den Sendevorgang zur Verfügung stehen: Stehen keine Daten zur Verfügung, so muss der TX-Interrupt deaktiviert sein!

Wenn Sie die Bedingung also folgendermaßen (if ((USART2->SR & USART_SR_TXE) && (USART2->CR1 & USART_CR1_TXEIE))) erweitern, kann der Sendeteil nur aktiv werden, wenn der zweite Teil der Bedingung ebenfalls erfüllt ist. Diese Bedingung wird dann gesetzt, wenn im "Empfangsteil" der ISR erkannt wurde, dass das Zeichen 'c' empfangen wurde.

Nun bietet HTerm zusätzlich die Möglichkeit, auch ganze Textdateien zu senden (dies geschieht über die Schaltfläche Send file von HTerm). Wenn Sie nur die Bedingung erweitern, wie ich es weiter oben gezeigt haben, werden 'normale' Textdateien im Regelfall auch nicht vollständig übertragen, da ich ausschließlich Großbuchstaben und das Enter-Zeichen als zulässige Zeichen vorgesehen hatte. Dieser Bereich muss also ebenfalls modifiziert werden. Achtung: Ziffern werden durch diese Modifikation weiterhin nicht unterstützt: Sollen diese ebenfalls "gespiegelt" werden, so müssen Sie den Filter entsprechend zusätzlich erweitern (siehe Kommentar /* Filter fuer zulaessige Zeichen */).

Nachfolgend finden Sie zum Download zwei Varianten von main.c:

  1. Die erste Variante (main_1.c) können Sie einsetzen, wenn Textdateien NICHT gesendet werden sollen! Sie hat aber den Nachteil, dass aufgrund der Erweiterung der zulässigen Zeichen, bei der Ausgabe des Textes "The quick brown fox...", der durch die Betätigung der Taste 'c' ausgelöst wird, diesem Text der Buchstabe 'c' vorangestellt wird. Dies ist hier nicht weiter schlimm, da Sie den Zeichenbereich ja sowieso an die eigene Anwendung anpassen müssen: Dieses Beispiel soll ja schließlich auch nur die korrekte Vorgehensweise demonstrieren.
  2. Die zweite Variante (main_2.c) unterstützt die Ausgabe von "The quick brown fox..." nicht mehr, da dieser Text (mitsamt der Pointer-Variablen outString) nicht mehr vorhanden ist: Diese Variante funktioniert aber für die Ausgabe von Textdateien! Geben Sie hier ein Zeichen ein, so wird auch nur dieses Zeichen an HTerm "gespiegelt".