Arduino: Serielle Kommunikation
📁 Dateistruktur
UART_Voice/
├── UART_Voice.ino # Hauptprogramm
├── bsp_uart.hpp # Header-Datei (Protokollframe- und Funktionsdeklarationen)
├── bsp_uart.cpp # Implementierungsdatei
└── README.md # Dieses Tutorial🔌 Hardwareanschluss
Verbindung mit dem Sprachmodul
💡 Hinweis: RX und TX müssen überkreuz verbunden werden!

🔧 Kompilieren und Hochladen
Erster Schritt: Arduino IDE öffnen
Öffnen Sie die Datei
UART_Voice.inoWählen Sie Ihr Entwicklungsboard-Modell (z. B. Arduino Uno)
Wählen Sie die entsprechende serielle Schnittstelle
Zweiter Schritt: Kompilieren und Hochladen
Klicken Sie auf die Schaltfläche ✔️, um zu kompilieren
Klicken Sie auf die Schaltfläche ➡️, um auf das Board hochzuladen
📡 Serieller Test
Seriellen Monitor in der Arduino IDE öffnen
Baudrate: 115200
Abschlusszeichen: Keine
Erwartete Ausgabe
Nach dem Einschalten sollte Folgendes zu sehen sein:
UART Voice Module InitializedWenn Sie das Weckwort und das Befehlswort zum Modul sprechen, wird die entsprechende ID ausgegeben:
ID: 1
ID: 2
ID: 10📚 Format des Protokollrahmens
Beispiel: Befehl mit ID=10 gelesen
FE EF 00 0A EEBeispiel: Befehlswort-Ansage senden
FE EF D3 00 EE📚 BSP-Schnittstellenbeschreibung
UART_Init()
void UART_Init(void);Funktion: Initialisiert die serielle Schnittstelle (Baudrate 115200)
Beispiel:
void setup() {
UART_Init();
}UART_ReadCommand()
int UART_ReadCommand(void);
Funktion: Liest die von dem Sprachmodul erkannte Befehls-ID
Rückgabewert:
0- kein Befehl erkannt1~254- Befehls-ID-1- keine neuen Daten
Beispiel:
int id = UART_ReadCommand();
if (id > 0) {
Serial.print("识别到命令: ");
Serial.println(id);
}UART_SetPassiveVoice()
void UART_SetPassiveVoice(uint8_t voiceID);Funktion: Legt die Ansagephrase für die passive Wiedergabe fest
Parameter:
0x00- Typ der passiven Ansagephrase
Beispiel:
UART_SetPassiveVoice(0x00);
delay(200);UART_SetFunctionVoice()
void UART_SetFunctionVoice(uint8_t voiceID);Funktion: Legt die Ansagephrase für die Funktionswort-Wiedergabe fest
Parameter:
0x00- Typ der Funktionswort-Ansagephrase
Beispiel:
UART_SetFunctionVoice(0x00);
delay(200);UART_SetCommandVoice()
void UART_SetCommandVoice(uint8_t voiceID);Funktion: Legt die Ansagephrase für die Befehlswort-Wiedergabe fest
Parameter:
0x00- Typ der Befehlswort-Ansagephrase
Beispiel:
UART_SetCommandVoice(0x00);
delay(200);🎯 Beschreibung der Hauptprogrammlogik
void setup() {
Serial.begin(115200);
UART_Init();
Serial.println("UART Voice Module Initialized");
UART_SetCommandVoice(0x00); // Beim Einschalten Befehlswort ansagen
delay(200);
}
void loop() {
int commandId = UART_ReadCommand();
if (commandId >= 0) {
// Ungültige Werte filtern, um doppelte Ausgaben zu verhindern
if (commandId != 0 && commandId != 255 && commandId != lastCommandId) {
Serial.print("ID: ");
Serial.println(commandId);
lastCommandId = commandId;
// Beispiel: Ansage anhand des erkannten Befehls steuern
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Befehl 1 erkannt, Befehlswort ansagen
} else if (commandId == 2) {
UART_SetCommandVoice(0x00); // Befehl 2 erkannt, Befehlswort ansagen
}
} else if (commandId == 0 || commandId == 255) {
if (lastCommandId != 0) {
lastCommandId = 0; // Status zurücksetzen
}
}
}
delay(50);
}🔍 Häufig gestellte Fragen
Q1: Keine Ausgabe
Mögliche Ursachen:
RX/TX vertauscht
GND nicht gemeinsam verbunden
Modul nicht mit Strom versorgt
Falsche Baudrate
Lösung:
Vergewissern Sie sich, dass D10 mit dem TX des Moduls und D11 mit dem RX des Moduls verbunden ist (überkreuzte Verbindung)
Vergewissern Sie sich, dass GND verbunden ist
Vergewissern Sie sich, dass die 5V-Stromversorgung in Ordnung ist
Vergewissern Sie sich, dass die Baudrate der seriellen Schnittstelle 115200 beträgt
Q2: Die serielle Ausgabe zeigt nur unlesbare Zeichen
Mögliche Ursachen:
Baudrate stimmt nicht überein
Modul wird nicht korrekt mit Strom versorgt
Lösung:
Vergewissern Sie sich, dass die Baudrate des seriellen Monitors 115200 beträgt
Drücken Sie die Reset-Taste des Moduls
Q3: Ausgabe "ID: 255" oder "ID: 0"
Erläuterung: Dies ist ein normales Phänomen
0= kein Befehl erkannt255= keine neuen Daten
Diese Werte werden im Code bereits herausgefiltert und normalerweise nicht ausgegeben. Wenn Sie eine Ausgabe sehen, bedeutet das, dass der Code nicht wirksam ist.
💡 Vorteile der BSP-Architektur
Klare Codeschichtung
bsp_uart.hpp - nur Deklarationen ansehen, nicht die Implementierung
bsp_uart.cpp - konkrete Implementierungsdetails
UART_Voice.ino - nur die Geschäftslogik betreffen
Einfache Portierung
Wenn Sie auf eine andere Plattform wechseln (z. B. STM32, ESP32), müssen Sie nur die Implementierung in bsp_uart.cpp ändern; das Hauptprogramm muss nicht geändert werden.
Einfache Wartung
Änderungen am UART-bezogenen Code erfolgen nur in bsp_uart.cpp – eine Änderung wirkt überall.
🚀 Beispiele für Erweiterungsfunktionen
Beispiel 1: Unterschiedliche Ansagen je nach Befehl auslösen
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Befehlswort-Ansage
} else if (commandId == 2) {
UART_SetFunctionVoice(0x00); // Funktionswort-Ansage
} else if (commandId == 3) {
UART_SetPassiveVoice(0x00); // Passive Ansage
}Beispiel 2: LED steuern
if (commandId == 10) {
digitalWrite(LED_PIN, LOW); // Licht aus
UART_SetCommandVoice(0x00); // Bestätigungsansage
}Beispiel 3: Motor steuern
if (commandId == 11) {
motor_stop();
UART_SetCommandVoice(0x00); // Bestätigungsansage
}
