Estoy usando STM32F4 (bare metal con biblioteca HAL) como servidor HTTP. No implemento la capa TCP, porque eso lo hace el módulo WiFi232 D2: todo lo que recibo en el uC a través de UART es una cadena con una solicitud HTML pura (y todo lo que envío es una cadena con una respuesta HTML pura). El requisito de la aplicación es enviar una respuesta grande con la página web SPA (casi 300k caracteres) y varias respuestas pequeñas como AJAX (~200 caracteres). Con 57600 bps todo funciona bien, pero la gran respuesta tarda 50 s en cargarse en el cliente, por lo que obviamente tengo que aumentar la velocidad en baudios.
Esa fue la introducción del escenario, ahora la jugada principal, donde comienza el problema: con todo por encima de 57600bps, pierdo caracteres de mensaje en el camino al navegador. Los pierdo al azar, generalmente es una fila de caracteres contiguos; a veces varios, a veces más de cien de ellos. Inicialmente jugué con el bloqueo del transceptor UART. Cuando noté el problema, cambié por DMA y no hizo absolutamente ningún cambio. Probé ambos casos enviando a través de UART a FTDA -> USB -> Termite terminal en lugar del módulo WiFi y vi los mismos síntomas. Dado que cada simulación conduce a las secuelas de la pérdida de datos, llegué al extremo de incluso cruzar STM Tx con Rx y verificar si todo funciona bien en el circuito más corto posible y... por supuesto, funcionó perfectamente :) Así que el uC se excluye de los sospechosos.
Entonces, ¿es posible lograr una transmisión UART confiable? ¿Tiene alguna pista sobre cómo enviar mensajes HTTP por UART a altas velocidades de transmisión? Siento que agoté todas las posibilidades, pero parece poco probable que 115kbps sea demasiado, sin mencionar los Mbps... ¿Quizás me estoy perdiendo algo simple? La aplicación de control de flujo de hardware corrige la transmisión solo un poco, todavía obtengo errores en 115 kbps (aunque con menos frecuencia que sin él).
* Tenga en cuenta que sigo hablando de mensajes HTTP, debido a su naturaleza particular: no puedo implementar ningún algoritmo de control de flujo de software o marcos, porque no tengo poder en el lado del navegador de esta cadena de comunicación.
EDITAR: Algunas observaciones más:
De acuerdo con esas observaciones, prefiero no usar hwfc y simplemente agregar algo de retraso en los puntos conocidos (después de cada 8191 o 4095 caracteres, dependiendo de la velocidad en baudios). Sin embargo, esto es muy complicado , odio esta solución y espero que todavía haya una mejor manera de resolver ese problema.
Suena como un problema de control de flujo para mí. Un módulo Wifi requiere esto a velocidades de transmisión más altas, porque no puede enviar paquetes a toda velocidad: los búferes internos se llenan. Si su MCU lo admite, debe usar un UART con señales de control de flujo de hardware (generalmente llamadas RTS y CTS).
huart3.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS
, verifico los indicadores TC y TXE antes de que comience cada transmisión, siempre espero en un bucle cuando HAL_BUSY
no obtengo ningún error durante la transmisión y se supone que el módulo receptor funciona incluso con 460800... ¿Debería hacerse algo más?
Adán
CL.
Arsenal
jalooc