Ну вот, есть кусок кода, и сразу видно где косяк :-) Ты вычитываешь "последний байт эха" по флагу TXE. Это неправильно. Ибо когда этот флаг установлен (регистр передатчика пуст), происходит выдача НАСТОЯЩЕГО последнего байта из сдвигового регистра передатчика. Последний байт эха надо вычитывать по прерыванию TC. Точнее - по прерыванию TC надо разрешить прерывание RXNE, и первым принятым байтом будет как раз последний байт эха.