У микроконтроллера есть прерывания (или события) на прием данных по UART. Это прерываение срабатывет, когда UART принял какой то байт. Тоесть вы организовываете буффер прием, заполняете его через это прерывание (событие), а в основном цикле (или по таймеру) проверяете, пустой ли буффер или там уже что то похожее на нужные данные. Если да, то данные обрабатываются и буффер очищается.
Точно такая же структура и по отправке. Так же организуете буффер, также делаете прерывание(событие). Только оно срабатывает, когда байт уже передан и нужно продолжать передач следеющего байта.
В основном цикле заполняется только буффер отправки какими то данными и посылается первый байт.
Cам stm32 не знаком, но почитайте
тут и
тут.
Кроме того найдите даташит своего контроллера — там обычно все расжевано с примерами кода.