Лучше сразу читать даташит на процессор Atmega328 - http://www.atmel.com/images/atmel-8...pa-168a-168pa-328-328p_datasheet_complete.pdf. Atmega8 - http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_summary.pdf. Для Atmega328. UART0 со страницы 170. Подробнее о регистре данных стр. 191. Регистр данных UDRn, по сути там 2 регистра (RXB, TXB). Когда мы читаем данные из регистра UDRn данные берутся из RXB, когда записываем в UDRn данные попадают в TXB. Получается 1 байт на прием и 1 байт на получение. В сумме 2 байта. Для Atmega8. UART со страницы 127. Подробнее о регистре данных стр. 148, там аналогично. Надеюсь ни чего не напутал, удачи!
Некоторое уточнение: один байт на передачу, два байта на приём. PS: в посте выше имел ввиду приёмные буферы.
То есть без прерывания на прием при выполнении других заданий поймать весь пакет практически нереально.
В контексте доки с оф.сайта atmel.com на мк ATmega328. Чёткой фразы о размере буферов нет, но есть несколько фраз в разделе 19.2 (общие сведения о USART): про передающий буфер и про приёмный буффер . Так же на диаграмме "Figure 19-1.USART Block Diagram" передающий буфер обозначен одним прямоугольником, а приёмный двумя. И наконец фраза из раздела 19.7.4 (ошибки USART) -- два символа == два байта. Правда символы могут быть 9ти битовыми, но про то как хранится старший бит у второго байта информации не нашёл. Но это не суть важно -- главное, что как то храниться. Смотря что подразумевать под пакетом...
Большое спасибо за разъяснение. Ни когда не знал о существовании 2 байта в буфере не прием, хотя работаю не первый день с UART когда-то разобрался и забыл. Меня это тоже смутило. Возможно без прерываний не получится, нужно понимать, что за пакет и какая загрузка. Если бы мне требовалась сделать что-то аналогичное, просто сделал на прерываниях. Можете оттолкнуться от этого примера - http://forum.amperka.ru/threads/Реализация-uart-rs-485.6791/, http://forum.amperka.ru/threads/Проблемы-с-кодировкой-uart-на-СИ-в-arduino-ide-1-6-7.7513/#post-66460 Если, что-то будет не понятно, постараюсь пояснить. Или посмотреть в сети, примеров и описаний в том числе на русском - тьма.
Ошибка 1 байт на передачу 1 байт на прием При этом если буфер приемника не пуст и пришел новый байт, пришедший байт теряется, но устанавливается флаг в регистре, сообщающий о потере байта. Так же флаг устанавливается при приеме 9 бит.
буфер на 1, просто пока идет прием последнего байта принятый хранится в UDR, и пока прием не закончился вынуть принимый байт, ясное дело, нельзя, но буфер для принимаемого есть. Так что в реале - 1.
Если верить оф.доке, Вы оба ошибаетесь. Приёмный буфер содержит два байта, а так же ещё есть сдвиговый регистр, который принимает следующий символ. Приёмный буфер организован по типу FIFO -- первый пришёл, первый вышел. При чтении регистра UDR считывается первый принятый байт. После чего данные в буфере сдвигаются и регистр UDR указывает уже на второй принятый байт. При приёме 9ти битных данных нужно сначала прочитать старший бит, а потом уже оставшиеся биты из UDR. Потому что после чтения регистра UDR данные в приёмном буфере сдвинуться, и старший бит уже будет для второго символа. В посте выше я привел цитаты из доки -- могли бы перепроверить прежде, чем вводить людей в заблуждения своими ложными утверждениями.
Теперь прочел. Согласен ошибся. Разъяснение написано о флаге переполнения DOR Флаг устанавливается в 1, если в момент обнаружения нового страт-бита в сдвиговом регистре приемника находится последнее принятое слово, а буфер приемника полон (содержит два байта). Флаг сбрасывается при пересылке принятых данных из сдвигового регистра приемника в буфер UDR.