В общем при передаче в терминал обнаружилась ошибка. Делаю так:
Цитата
UART1_Init(9600);
Delay_ms(200);
UART1_Write_Text("Hello From Hell");
UART1_Write_Text("AAA");
В протеусе подключаю к МК два устройства:
1. Элемент VirtualTerminal
2. Элемент компорта COMPIM. Этот COMPIM связываю со встроенным виндовым терминалом.
Запускаю симуляцию и оба терминала отображают мне такие строки:
"ello From Hell"
"lAA"
Первый байт передачи исчез. Последний байт первой строки (l) был передан со второй строкой, а последний байт второй строки остался непереданным.
Если после этого передать например "ВВВ" а затем "ССС", то в терминал придёт "АВВ" и "ВСС"
После ковыряние в дебаггере обнаружил, что регистр данных UDR непосредственно перед передачей содержит последний байт предыдущей передачи. И соответственно пуляет сначала его, а затем байты текущей передачи количеством n-1. Последний байт текущей передачи остается непереданным и сидит в UDR, ожидая своей очереди до следующей передачи.
Дальше сделал так: перед каждым UART1_Write принудительно стал обнулять UDR. И всё встало на свои места. В терминалах корректно отображается всё, что было передано.
Но нигде не видел, чтобы принудительно надо было обнулять UDR перед передачей.
Почему так, в чем проблема?