Uart - послідовний інтерфейс передачі даних

Uart - послідовний інтерфейс передачі даних

Серйозні середовища розробки, типу IAR або ATMEL Studio, як правило, містять в собі або програмний симулятор цільового мікроконтролера, або мають програмні засоби для роботи з апаратними отладчиками.

Середа Arduino IDE не має ні того, ні іншого, що значно ускладнює пошук помилок в програмі. Компілятор виявляє тільки синтаксичні помилки, поряд з якими існують ще й логічні (написано щось правильно, тільки не те робить), не кажучи вже про підрахунок різних коефіцієнтів ... Програми не пишуться без помилок!

Існує безліч методів налагодження, але практично для всіх необхідно фізичне з'єднання з комп'ютером. Всі плати Arduino (крім Pro і Pro Mini) мають «на борту» USB-роз'єм і спеціальну мікросхему, яка перетворює інтерфейс UART в USB. Тож не будемо вигадувати нічого зайвого і зробимо найпростішу налагодження за допомогою інтерфейсу, який у нас вже є!

Середовище розробки ArduinoIDE вже має в своєму складі монітор послідовного порту, який дозволяє переглядати дані, що проходять через порт, а також відправити свої дані. Таким чином, ми завжди можемо передати дані з нашого пристрою прямо в комп'ютер і вивести на екран.

Монітор Arduino IDE - не єдиний засіб для роботи з портом, в мережі можна знайти безліч програм-моніторів, які дозволяють не тільки приймати дані, але і коштувати графіки на їх основі, записувати дані в таблицю і багато іншого! Це значно спростить налагодження програми.

Так як інтерфейс UART виведений не тільки до перетворювача інтерфейсів, його можна використовувати і для зв'язку між платами Arduino або, наприклад, платою і датчиком, але це вже тема для іншої статті.

Теорія роботи інтерфейсу

UART в перекладі з англійської звучить як «Універсальний Асинхронний приймач». Існує ще його синхронна версія з додатковою лінією тактового сигналу, але вона не цікава нам в рамках статті.

Uart - послідовний інтерфейс передачі даних

Кожен біт кожного байта передається в рівний відведений проміжок часу (фактично, тайм-слот). Стандартним розміром даних в посилці є 8 байт, але крім даних кожен пакет несе і службову інформацію, а саме:

  • стартовий біт (Обов'язковий)
  • стоповий біт (Також обов'язковий, можливе використання 1, 1.5, 2 степових бітів)
  • біт парності (Необов'язковий. Буває типів Odd, Even)

Коротко параметри сигналу, що передається записуються так:

[Кол-во біт даних] [тип парності] [кол-во стоп-бітів], тобто запис 8N1 характеризує сигнал з 8 бітами даних, без біта парності (N - Not) з 1 стоп-бітом.

Так як інтерфейс асинхронний, то більшої значущості має швидкість передачі даних - і у приймача, і у передавача вона повинна бути однаковою.

Швидкість вимірюється в бітах в секунду, або коротко - в бодах. Стандарт RS232 має на увазі швидкості від 1200 до 115200 бод, хоча по факту існують швидкості і нижче, і вище, причому до десятків мегабод!

Зрозуміло, точність всюди відносна і швидкість ніколи не буде дорівнювати 9600 бодам з точністю до одиниць. Стандарт передбачає можливу помилку в швидкості до 5% (не більше 3% для впевненого прийому).

Далі зведені основні відомості про сигнал:

  • в неактивному (IDLE) режимі обидві лінії даних підтягнуті вгору
  • передачу починає стартовий біт (логічний нуль)
  • передачу закінчує стоп-біт (логічна одиниця)
  • дані передаються в режимі LSB (молодшим бітом вперед)
  • для передачі байта потрібно мінімум 10 біт

4800, 9600, 19200, 38400, 57600, 115200 бод.

UART може бути запущений як в напівдуплексному (тільки прийом або тільки передача) режимі, так і в повнодуплексному режимі, так як лінії прийому і передачі розділені. Лінія TXD відповідає за передачу, RXD - за прийом, відповідно, лінії від приймача до передавача перехрещуються (TX-RX, RX-TX).

Реалізація в Arduino

Всі плати Arduino, побудовані на основі оригінальних, мають мінімум один інтерфейс UART, просунуті же плати, типу Arduino Mega 2560 Або Arduino Due, маю одразу 4 апаратних інтерфейсу! Вони не завантажують контролер, так як вони відокремлені від ядра; все, що необхідно - це конфігурувати порт і запхати дані в буфер, після чого операції передачі підуть незалежно від вас.

Звичайно, існують і програмні реалізації UART, але вони навантажують процесор. У будь-якому випадку, краще використовувати спочатку апаратні інтерфейси, а потім вже починати придумувати щось програмне.

Контролери Arduino використовують логічні рівні такі ж, яким є харчування, тобто для найпопулярнішою плати Arduino UNO рівні дорівнюватимуть - нуль = 0В, 1 = 5В.

Висновки підключені до перетворювача інтерфейсів через резистори з опором 1Ком, а до Гребінка з боків плати - безпосередньо, тому сигнали з гребінок матимуть більший пріоритет. Періодично це заважає прошивати плати з підключеним датчиком по UART, так як для прошивки теж використовується UART.

Мікросхема перетворювача інтерфейсів не робить з себе ще один COM-інтерфейс для комп'ютера, вона лише емулює його. Незважаючи на це, всі програми, які працюють з COM-портом за допомогою Windows API (Win32 API), які не відрізнять порт від фізичного порту комп'ютера.

Клас Serial - RS232 в кращих традиціях Arduino

Uart - послідовний інтерфейс передачі даних

Для зручної роботи з послідовним портом розробники Arduino написали цілу бібліотеку, яка значно спрощує роботу з портом, абстрагуючись кінцевого користувача від простої, «залізної» роботи з регістрами. Клас має безліч функцій, які будуть розглянуті нами далі. Але спочатку треба зрозуміти, як же комп'ютер прийме і обробить, а точніше покаже те, що ми йому передали.

Вся справа в тому, що кожен символ розкладки клавіатури - це теж байт. І якщо просто взяти і відправити в порт число 65, він не виведе дві цифри 6 і 5, а виведе заголовну латинську букву А. Чому так? Тому що в таблиці кодування буква А має код 65. Клас дозволяє вибрати між текстовим і бінарним методом передачі даних, тобто ми зможемо відправити число 65 і як букву, і як число.

Функції класу Serial

Serialx.begin (speed)

Налагодження програм за допомогою Serial

Ось ми і підібралися до самого сакрального таїнства - тепер у нас вистачить знань і навичок, щоб нарешті приступити до налагодження.

Розіб'ємо нашу роботу на три етапи:

  1. Передача даних з програми комп'ютер. Цим ми вже оволоділи, використовувати будемо клас String.
  2. За допомогою будь-якої програми-монітора спостерігаємо наші дані
  3. Осмислюємо помилки, правимо, ре-тестуємо програму

Давайте спробуємо налагодити найпростішу програму взаємодії контролера Arduino з кнопками.

У простій скетч додамо пару блоків, які будуть виводити стан кнопок в послідовний порт:

Налагодження програм за допомогою класу Serial