Ich benutze einen Arduino MKR1000 (ARM 48MHz), um über UART von einem GSM-Modul SparqEE Cell Daten zu lesen. Irgendwie kriege ich das nicht zuverlässig gebacken, auch der SParqEE-Support weiß bisher nichts Erhellendes.
Zunächst mal läuft die Verbindung nur bei 115200 Baud halbwegs stabil, aber auch da nicht immer. Niedrigere Baudraten verstärken den Effekt (s.u.) eher, als dass es besser würde.
Bei größeren Datenmengen gehen Daten verloren. Ich benutze als Test immer den Befehl AT+COPN, der die Liste der möglichen Provider ausgibt. Wenn ich das vom PC aus über USB an dem Modul mache, kommen >1400 Zeilen als Ergebnis. Da die Liste intern aus dem Modul ausgelesen wird, ist die Geschwindigkeit wohl maximal.
Bei 115200 Baud kommen von den 1400 so 250 Zeilen an. Ich schreibe einlaufende Zeichen immer nur in einen Puffer, um keine Zeit zu verlieren, muss den aber ab und an ausgeben, wenn er vollläuft. Am Output ist zu sehen, dass die größten Datenverluste da passieren - klar, der Arduino ist ja momentan anderweitig beschäftigt.
Bei niedrigeren Baudraten werden die Datenverluste größer, obwohl der Arduino da ja mehr Zyklen pro Zeichen zur Verfügung haben sollte.
Überschlagsrechnung: 115200 Baud bei 8N1 sind etwa 10KB/s, der Arduino hat zwischen 1 und 4 Takte pro Befehl, bei 48MHz also 24 Mio. Instruktionen pro Sekunde, wenn man von im Mittel 2 Takten pro Befehl ausgeht. Sagen wir, die Hälfte geht für interne Abläufe drauf - bleiben immer noch 10 Mio./s. Das heißt, ich habe mindestens 1.000 Instruktionen pro einlaufendes Byte zur Verfügung - da kann doch nichts überlaufen?!?
Es sieht fast so aus, als würden die Zeichen gar nicht im UART-Puffer des Arduino verloren gehen, sondern auf der anderen Seite, im Modul. Wie kann ich das sicher herausfinden?