Для цих та багатьох інших цілей придумують протоколи зв'язку - угоди про спеціальні наборах даних, якими обмінюються обидві обчислювальні системи для успішного виконання завдання щодо встановлення зв'язку і передачі основних даних. Алгоритми протоколів залежать від завдань які поставлені перед системою і особливостей фізичного рівня UART. Алгоритм протоколу зазвичай реалізуються програмно, а не апаратно.
Існує велика кількість різноманітних протоколів зв'язку, перед-призначених для використання з UART. Найбільш відомі:
MODBUS. Сімейство протоколів типу «запит-відповідь», популярне в промисловій автоматиці. Орієнтовані на управління обладнанням короткими командами;
AT-команди телефонних модемів. Набір текстових команд, що дозволяють управляти роботою модему при встановленні з'єднання.
PPP - протокол широко використовувався при підключеннях до інтернету через модем. Дозволяв виконувати аутентифікацію користувача у провайдера, шифрувати дані;
IrDA - сімейство протоколів для оптичного бездротового фізичного рівня.
Прийом сигналу по UART RS - 232 показаний на малюнку 2.12.
Малюнок 2.12 - Прийом сигналу по UART RS - 232
Стандартна посилка займає 10 біт. Але правило це поширюється тільки на стандартні настройки СОМ-порту. В принципі, його можна переналаштувати так, щоб він навіть інтерфейс One-Wire розумів. У режимі простою, коли по лінії нічого не передається, вона перебуває в стані логічної одиниці, або - 12 вольт. Початок передачі позначають передачею стартового біта, який завжди дорівнює нулю. Потім йде передача восьми біт даних. Завершує посилку біт парності і стоповий біт. Біт парності здійснює перевірку пере-даних даних. Стартовий біт говорить нам, що пересилання даних завершена. Треба відзначити, що STOP-біт може займати 1, 1.5, і 2 біта. Не варто думати, що це дробові біти, це число свідчить тільки про його тривалості. Стоповий біт, як і стартовий, дорівнює нулю.
У AVR є регістр UDR це UART Data Register (у деяких контролерах він може зватися UDR0 або ще як-небудь схоже). Насправді це два різних регістра, але мають одну адресу. Просто на запис потрапляє в один (регістр передавача), а на читання бере з іншого (регістр приймача). Таким об-разом досить просто пхати дані в цей регістр і вони полетять приймачу, і, навпаки, зчитувати їх звідти по приходу.
Про те, що байт прийшов в регістр UDR нам скаже переривання по завершенню прийому, яке викликається відразу ж, як приймач засмокче в себе всі біти (зазвичай 8, але може бути і 9, залежно від настройки ).
Оскільки передача йде досить повільно, то бездумно пхати дані в регістр UDR не можна - потрібно дочекатися закінчення передачі попереднього байта. Про те, що UDR порожній і готовий до прийому нового байта сигналізує біт UDRE, він же викличе апаратне переривання по спустошенню буфера.
Так що постійно стежити за UART вручну не потрібно, все обслуговування можна повісити на переривання і він сам буде все робити. Можна в пам'яті організувати буфер і туди тупо пхати дані, а на перериванні по спустошенню UDR стежити за тим чи є що в буфері і якщо є - відправляти.
А по прийому, що не тупити, а також, по перериванню, пхати дані в ОЗУ, але вже в буфер прийому, звідки їх вважає вже програма.
Налаштування UART.
Всі налаштування прийомопередавача зберігаються в регістра конфігурації. Це UCSRA, UCSRB і UCSRС. А швидкість задається в парі UBBRH: UBBRL.
Регістр UCSRA
Тут нам цікаві тільки біти RXC і TXC це прапори завершення прийому та передачі, відповідно. RXC встане коли непрочитаний байт вилізе в регістр UDR, а TXC встає коли останній стоп-біт пройшов, а нове значення в UDR ні надійшло. Тобто після проходу усіх байтів.
Також одночасно з цими прапорами викликається переривання (якщо воно було дозволено). Скидаються вони апаратно - приймаюче після читання з регістра UDR, передавальний при переході на переривання, або програмно (щоб скинути прапор програмно в нього треба записати 1)
Біти UDRE сигналізує про те, що регістр UDR приймача порожній і в нього можна пхати новий байт. Скидається він апаратно після засилання в UDR якого або байта. Також генерується переривання «Регістр порожній»
Біт U2X - це біт подвоєння швидкості при роботі в асинхронному режимі. Його треба враховувати при розрахунку значення в UBBRH: UBBRL
Регістр UCSRB
Тут в першу чергу це біти RXEN і TXEN - дозвіл прийому і передачі. Варто їх скинути як висновки UART тут же стають звичайними ніжками ...