Si bien sería necesario un código basado en interrupciones o DMA más elaborado para lograr el mejor rendimiento, las mejoras relativamente menores en su código ya mejorarían la situación. Empezaría por transmitir muestras en binario en lugar de en texto. Esto requiere un poco más de trabajo en el extremo receptor, pero reducirá el ancho de banda de UART requerido en al menos 2-3x (2 bytes por muestra frente a 6 en el texto con separador). También puede aumentar fácilmente la velocidad en baudios a, por ejemplo, 921.6 kbps, que es estándar y debería estar bien apoyado en el extremo receptor. Suponiendo una arquitectura STM32F2 estándar, podría subir a 7,5 Mbps, pero tendría que verificar el soporte en el extremo receptor.
Con 2 bytes por muestra y 921.6 kbps, obtendría un rendimiento de aproximadamente 46'000 muestras / s. A 7.5Mbps, obtendrías 370'000 muestras / s. Si su aplicación lo permite, puede reducir la resolución a 8 bits y, por lo tanto, utilizar un solo byte por muestra, duplicando efectivamente el rendimiento en muestras / s.
Si bien 370ksamples / s no es malo, aún está bastante lejos de los 6Msamples / s teóricos (suponiendo STM32F2, conversión de 12 bits y uso de los 3 ADC en modo de triple intercalación). Esto se traduce en 12 MB / s de datos para transferir desde la MCU a la computadora, lo cual no es una cantidad trivial. UART no lo hará. SPI, a un máximo de 30Mbps (2-3MB / s) tampoco lo hará. Escribir en una tarjeta microSD a través de SDIO se acercaría. USB 2.0 lo haría, pero es mucho más complicado en cuanto a software y requiere componentes externos para el PHY. ETH también funcionaría bien, pero requeriría componentes adicionales y una pila de red para ser implementada en la MCU. Esta complejidad explica por qué, en la mayoría de las aplicaciones, las muestras se almacenan en la memoria y se transfieren de forma asíncrona.