[STM32] Die HAL-Bibliothek implementiert die Umleitung der seriellen Schnittstelle in drei Schritten (Codekopie verfügbar)

Inhaltsverzeichnis

Schritt 1: Standard-Eingabe- und Ausgabe-Headerdateien hinzufügen

Schritt 2: Schreiben Sie die Funktion fputc() neu

Schritt 3: Schreiben Sie die Funktion fgetc() neu

Codezusammenfassung (für direkte Kopierverwendung) – erforderlich für direktes Kopieren


Wenn wir ein C-Sprachprogramm auf einem PC entwickeln, können wir die formatierte Ausgabefunktion printf () der C-Sprache verwenden, um das laufende Ergebnis des Programms zur Anzeige an den Bildschirm zu senden, oder die formatierte Eingabefunktion scanf () zum Lesen verwenden die Ergebnisse über die Tastatur. Eingegebene Informationen. Bei der Entwicklung eingebetteter Systeme hoffen wir auch, die laufenden Ergebnisse oder Debugging-Informationen des Programms zur Anzeige an den PC senden zu können und die über die Tastatur eingegebenen Informationen zu lesen, um eine gute Mensch-Computer-Interaktion zu erreichen.

Die von der HAL-Bibliothek bereitgestellte Transceiver-Funktion für die serielle Schnittstelle verfügt über relativ einfache Funktionen und kann keine formatierte Ein- und Ausgabe durchführen. Wenn Sie eine formatierte Eingabe- und Ausgabefunktion ähnlich der C-Sprache implementieren möchten, müssen Sie die Ausgabe der Funktion printf() und die Eingabe der Funktion scanf() an die serielle Schnittstelle umleiten.

Die spezifische Implementierungsmethode lautet wie folgt: Der Benutzer schreibt eine Funktion mit demselben Namen wie die Standardbibliotheksfunktion der C-Sprache. Wenn der Linker überprüft, ob der Benutzer eine Funktion mit demselben Namen wie die Standardbibliotheksfunktion geschrieben hat, wird diese verwendet Die vom Benutzer zuerst geschriebene Funktion dient zur indirekten Änderung der Standardbibliotheksfunktion (die gleichnamige Funktion in der Standardbibliotheksfunktion wird mit dem schwachen Attribut definiert).

Da die Funktion printf() die Datenausgabe durch Aufrufen der Funktion fputc() realisiert und die Funktion scanf() die Dateneingabe durch Aufrufen der Funktion fgetc() realisiert, muss der Benutzer diese beiden Funktionen neu schreiben, um die Umleitung zu realisieren die serielle Schnittstelle.

Vor der Umleitung müssen Sie die serielle Schnittstelle konfigurieren und den Abfragemodus der seriellen Schnittstelle verwenden.

Hinweis: Da es sich bei der Funktion printf() und der Funktion scan() um von der MDK-Software bereitgestellte Standardbibliotheksfunktionen der C-Sprache handelt, muss der Benutzer nach Abschluss des Programmschreibens auch die Registerkarte „Ziel“ im Projekteinstellungsfenster des MDK auswählen Software. Die darin enthaltene Option „MicroLIB verwenden“. Wenn die Option „MicroLIB verwenden“ nicht aktiviert ist, kann sie nicht verwendet werden.

Schritt 1: Da die Funktionen printf() und scanf() im Hauptprogramm aufgerufen werden, muss die Standard-Eingabe- und Ausgabe-Header-Datei stdio.h hinzugefügt werden.

/* USER CODE BEGIN Includes*/

#include <stdio.h>// 包含标准输入输出头文件

/* USER CODE END Includes*/

Schritt 2: Schreiben Sie die Funktion fputc() neu

int fputc(int ch,FILE *f)

{

//采用轮询方式发送1字节数据,超时时间设置为无限等待

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);

return ch;

}

Hinweis: Da der Eingabeparameter ch eine ganzzahlige Variable ist und der Eingabeparameter pdata der Funktion HAL_UART_Transmit() ein Zeiger auf einen vorzeichenlosen Zeichentyp ist, ist eine erzwungene Typkonvertierung erforderlich, um int in uint8_t* zu konvertieren.

HAL_MAX_DELAY bedeutet unendliches Warten, das beispielsweise auf 1000 geändert werden kann.

Schritt 3: Schreiben Sie die Funktion fgetc() neu

int fgetc(FILE *f)

{

uint8_t ch;

// 采用轮询方式接收 1字节数据,超时时间设置为无限等待

HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );

return ch;

}

Hinweis: Beim Aufrufen der Funktion scanf() zum Lesen von Daten der seriellen Schnittstelle muss am Ende der Eingabe ein Leerzeichen verwendet werden. Wenn Sie Daten in den Debugging-Assistenten für die serielle Schnittstelle eingeben, müssen Sie daher mit einem Leerzeichen enden und dann auf die Schaltfläche „Senden“ klicken, da die Daten sonst nicht korrekt empfangen werden können.

Die Funktion scanf() kann nur Zeichenfolgen ohne Leerzeichen akzeptieren. Wenn der Benutzer eine Zeichenfolge mit Leerzeichen empfangen muss, muss er zuerst Byte für Byte empfangen. Während des Empfangsprozesses wird kontinuierlich beurteilt, ob die Zeichen „\r“ und „\n“ vorhanden sind, um festzustellen, ob die Zeichenfolge empfangen wurde erhalten. Nachdem Sie zu diesem Zeitpunkt eine vollständige Zeichenfolge in den Sendebereich des Debugging-Assistenten für die serielle Schnittstelle eingegeben haben, drücken Sie zum Abschluss die Taste „ENTER“ auf der Tastatur

Codezusammenfassung (kopieren und direkt verwenden):

#include <stdio.h>// 包含标准输入输出头文件

int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

Guess you like

Origin blog.csdn.net/weixin_45015121/article/details/129718556