Ich verwende STM32F4 (Bare Metal mit HAL-Bibliothek) als HTTP-Server. Ich implementiere keine TCP-Schicht, da dies vom WiFi232 D2-Modul für mich erledigt wird - alles, was ich im uC über UART erhalte, ist eine Zeichenfolge mit reiner HTML-Anforderung (und alles, was ich sende, ist eine Zeichenfolge mit reiner HTML-Antwort). Die Anforderung der Anwendung besteht darin, eine große Antwort mit SPA-Webseite (fast 300.000 Zeichen) und mehrere kleine Antworten als AJAX (~ 200 Zeichen) zu senden. Mit 57600 bps funktioniert alles gut, aber die große Antwort dauert 50 Sekunden, um auf dem Client geladen zu werden, also muss ich natürlich die Baudrate erhöhen.
Das war die Kulisseneinführung, jetzt das Hauptspiel, wo das Problem beginnt: Bei allem über 57600bps verliere ich Nachrichtenzeichen auf dem Weg zum Browser. Ich verliere sie nach dem Zufallsprinzip - es ist normalerweise eine Reihe zusammenhängender Zeichen; manchmal mehrere, manchmal über hundert von ihnen. Anfangs habe ich mit dem Blockieren von UART-Transceiving gespielt. Als ich das Problem bemerkte, wechselte ich zu DMA und es änderte sich absolut nichts. Ich habe beide Fälle getestet, indem ich über UART an FTDA -> USB -> Termite-Terminal anstelle des WiFi-Moduls gesendet habe, und habe die gleichen Symptome gesehen. Da jede einzelne Simulation zu den Folgen von Datenverlusten führte, ging ich so weit, dass ich sogar STM Tx mit Rx kreuzte und überprüfte, ob auf den kürzestmöglichen Schaltungen alles in Ordnung ist, und ... es funktionierte natürlich perfekt :) Also der uC wird von den Verdächtigen ausgeschlossen.
Ist eine zuverlässige UART-Übertragung also überhaupt möglich? Haben Sie eine Ahnung, wie Sie HTTP-Nachrichten per UART mit hohen Baudraten senden können? Ich habe das Gefühl, dass ich alle Möglichkeiten ausgeschöpft habe, aber es scheint unwahrscheinlich, dass 115 kbps zu viel sind, ganz zu schweigen von Mbps ... Vielleicht übersehe ich etwas Einfaches? Die Anwendung der Hardware-Flusskontrolle korrigiert die Übertragung nur geringfügig, ich bekomme immer noch Fehler bei 115 kbps (wenn auch seltener als ohne).
*Beachten Sie, dass ich aufgrund ihrer besonderen Natur immer wieder über HTTP-Nachrichten spreche - ich kann weder Framing- noch Software-Flusskontrollalgorithmen implementieren, da ich auf der Browserseite dieser Kommunikationskette keine Macht habe.
EDIT: Einige weitere Beobachtungen:
In Übereinstimmung mit diesen Beobachtungen verwende ich lieber kein hwfc und füge einfach etwas Verzögerung an den bekannten Stellen hinzu (je nach Baudrate nach jedem 8191. oder 4095. Zeichen). Dies ist jedoch sehr hackisch , ich hasse diese Lösung und hoffe, dass es immer noch einen besseren Weg gibt, dieses Problem zu lösen.
Klingt für mich nach einem Problem mit der Flusskontrolle. Ein WLAN-Modul benötigt dies bei höheren Baudraten, da es Pakete nicht mit voller Geschwindigkeit versenden kann – die internen Puffer laufen voll. Wenn Ihre MCU dies unterstützt, sollten Sie einen UART mit Hardware-Flusssteuerungssignalen (normalerweise als RTS und CTS bezeichnet) verwenden.
huart3.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS
eingestellt, ich überprüfe TC & TXE Flags vor jedem Sendestart, ich warte immer in einer Schleife wenn HAL_BUSY
, ich bekomme keine Fehler beim Senden und das Empfangsmodul soll funktionieren sogar mit 460800... Sollte da noch was gemacht werden?
Adam
CL.
Arsenal
jalooc