Warum die Host-Schnittstelle der Flaschenhals ist
Ein Bluetooth-Modul arbeitet selten allein. Es sitzt hinter einem MCU, das ihm Daten gibt und Ereignisse liest. Die Qualitaet der Host-Schnittstelle — Framing, Flusskontrolle, Sleep-Handshake — entscheidet, ob das Produkt in einer Woche oder in drei Monaten shippt. Dieser Artikel behandelt ein Host-Protokoll in Produktionsqualitaet.
Physikalischer Layer
- UART 115200-921600 bps, 8N1. Bei 921600 sauberes Board und <30 cm Leitungen.
- Hardware-RTS/CTS ab 460800 Pflicht gegen Ueberlauf.
- Optional: ein `HOST_WAKE`-GPIO fuer Sleep-Koordination.
Zwei Stile
| Stil | Vorzuege | Nachteile |
|---|---|---|
| AT-Befehl (Text) | leicht zu debuggen, lesbar | gespraechig, Parserlast |
| Binaer (TLV/COBS) | kompakt, schnell | Werkzeug noetig |
AT fuer Config, Binaer fuer Bulk-Daten.
AT-Framing
<CR><LF>AT+NAME=Sensor01<CR><LF>
Antwort: <CR><LF>OK<CR><LF>
Fehler: <CR><LF>ERROR:code<CR><LF>
- Terminator: CRLF. Nie nur auf `\n` verlassen.
- Echo beim Boot an, in Produktion aus.
- Async-Events kommen ungefragt: `+EVENT:conn 1`.
Binaeres Framing (TLV)
[0xAA][Len:2][Cmd:1][TLV...][CRC:2]
- COBS entfernt 0x00-Escapes.
- CRC-16/CCITT; in jedem Frame neu berechnen.
Flusskontrolle
- CTS low = Modul beschaeftigt, Host muss pausieren.
- Bei Bulk-Send Fenstergroesse 4-8 Frames; `OK` abwarten vor naechstem Burst.
Sleep-Handshake
Das Modul schlaeft zum Sparen. Der Host muss es vor dem Senden wecken.
HOST: HOST_WAKE assert (oder Break senden)
MODULE: RTS innerhalb 2 ms hoch
HOST: wartet auf RTS, dann transmit
Ohne das gehen Bytes still verloren.
Durchsatz-Mathematik
Bei 115200 bps, 8N1 Effizienz ≈ 11 Bit/Byte → ~10.4 KB/s roh. Overhead Protokoll+ACK ≈ 30% → ~7 KB/s nutzbar. Fuer 1 KB/s Sensorstream reicht es; fuer Audio 921600 oder SDIO.
Haeufige Fallen
- CTS vergessen → zufaellige Verluste bei hoher Speed.
- Kein Watchdog im Host-Parser → haengt an fehlerhaftem Frame.
- Modul ohne Wake-Leitung schlafen → „es hat aufgehoert“.
- `\n` und `\r\n` zwischen SDKs mischen.
Minimale Host-State-Machine
IDLE → SEND → WAIT_ACK → (RETRY|OK) → IDLE, ACK-Timeout 500 ms, 3 Retries.
Ein sauberes Host-Protokoll eines Bluetooth-Moduls ist bewusst langweilig — und genau das laesst den Rest der Firmware interessant sein.