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.