Ардуино работа с uart

Содержание

Работа с последовательным портом UART (serial) на Arduino

Последовательный интерфейс (serial) предназначен передачи данных через универсальный асинхронный порт UART. Порт UART очень часто используется для передачи данных с Ардуино на компьютер, и обратно, а также для связи нескольких плат ардуин между собой.

Для многопортовых DUE/MEGA см. здесь.

Основные функций для работы с последовательным портом (Serial)

Serial.begin(rate) — Открывает последовательный порт и задаёт скорость для последовательной передачи данных. Типичная скорость обмена для компьютерной коммуникации — 9600.

Очевидно, когда задействован последовательный порт, выводы 0 (RX) и 1 (TX) не могут использоваться для других целей.

Serial.println(data) — Передаёт данные в последовательный порт, сопровождая автоматическим возвратом каретки и переходом на новую строку.

Serial.print(data) — тоже самое без возврата каретки и перехода на новую строку.

Serial.begin(скорость_передачи); — Инициализация порта. Задает скорость передачи в битах в секунду. Нормированные скорости: 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, или 115200.

count = Serial.available(); — Принимаемые по последовательному порту байты попадают в буфер микроконтроллера, откуда Ваша программа может их считать. Функция возвращает количество накопленных в буфере байт. Последовательный буфер может хранить до 128 байт.

char = Serial.read(); — Считывает следующий байт из буфера последовательного порта. возвращает -1 если нет входящих данных

Serial.flush(); — Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения)..

Разные варианты функции print:

Serial.print(b, DEC); — выводит ASCII-строку — десятичное представление числа b.

Serial.print(b, BYTE) — выводит младший байт числа b.

(аналогично HEX, OCT, BIN).

Serial.print(str) // если str — строка или массив символов, побайтно передает str на COM-порт.

Serial.println(); — отличие заключается в том, что после данных дополнительно выводятся два символа – символ возврата каретки (ASCII 13, или ‘\r’) и символ новой линии (ASCII 10, или ‘\n’).

Функция write:

Serial.write(uint8_t c); — Записывает данные в последовательный порт. Данные посылаются как байт или последовательность байт.

Serial.write(val); // где val — переменная для передачи, как единственный байт

Serial.write(str); // где str — строка для передачи, как последовательность байт

Serial.write(buf, len); // где buf — массив для передачи, как последовательность байт; len — длина массива.

Пример 1. Передача данных по Serial-порту с Arduino на компьютер

Инициализация порта со скоростью 9600 бот и передача данных (от Arduino на внешние устройства, например на компьютер):

Пример 2. Передача данных по Serial-порту с компьютера на Arduino

serialEvent() — функция вызывается автоматически, когда поступают данные.

Serial.setTimeout() — задает максимальное время (в мс) для работы Serial.readBytesUntil();

Возможные проблемы

1) auto-reboot DTR : возможна автоперезагрузка МК при передаче на него данных по serial-пору. Чтобы отключить это, надо поставить конденсатор 10мкФ между RES и GND. Я ставил электролитический кондер (естественно, + на RES).

Как соединить две ардуины по UART (serial) порту

Схема соединения двух ардуин:

Длина провода и скорость: RS-232 (англ. Recommended Standard 232) — стандарт физического уровня для асинхронного интерфейса (UART).

Расстояние связи по RS232 максимум 15 метров.

Но всё зависит от скорости.

Работа Arduino MEGA/DUE с несколькими последовательными serial портами

Многопортовые ардуино.

Как вы уже заметили, на ардуиновских платах Mega и Due имеется по 4 последовательных порта, а именно:

Serial — выводы 0 (RX) and 1 (TX);

Serial1 — выводы 19 (RX) and 18 (TX);

Serial2 — выводы 17 (RX) and 16 (TX);

Serial3 — выводы 15 (RX) and 14 (TX).

Естественно, что на Due используется напряжение 3.3 В (на MEGA как обычно 5 В).

Как с ними работать?

Здесь синим цветом выделены собственно имена объектов ( Serial , Serial1 , Serial2 , Serial3 ), которые используются в коде программы для работы с их методами. Всё просто! Например,

Пример вывода на дисплей LCD1602 через последовательный порт UART Arduino из-под Linux средствами языка Python

Короче говоря, есть комп с линуксом, к которому подключена Arduino через USB, а к арудине подключен дисплей LCD1602, и мы хотим на него выводить инфу.

Сначала привожу полный код программы для Arduino UNO, к которой подключен дисплей LCD1602:

Я сделал здесь решетку ‘#’ в качестве символа завершения передачи пакета данных. Как только в потоке данных встречается символ #, данные выводятся на дисплей, и буфер обнуляется, при этом сам символ ‘#’ не выводится. Конечно, можно было бы использовать ‘\n’ или др.

Далее мы напишем скрипт на Python, который будет выводить инфу на дисплей. Я выбрал Python, потому что это прикладной язык и он лучше всего подходит для подобных задач. С такими языками как C++/C# и т.п. больше возни с библиотеками, а здесь всё просто, особенно если это дело происходит под линуксом.

Первым делом устанавливаем необходимые библиотеки (для 2-ой или 3-ей версии python)

$sudo apt-get install python-serial

$sudo apt-get install python3-serial

Далее в интерпретаторе python пишем:

Здесь ардуина у меня подключена к порту /dev/ttyUSB0 — это я узнавал из Arduino IDE. Обычно она всегда на этом порту сидит, если других устройств на последовательный порт не подключено.

Как вы уже догадались, и в первой, и во второй программы должна быть указано одинаковая скорость в бодах. В моем случае это 9600 — стандартная, хотя и маленькая скрость. Может быть и больше (читай выше).

Источник

Serial

Description

Used for communication between the Arduino board and a computer or other devices. All Arduino boards have at least one serial port (also known as a UART or USART), and some have several.

Leonardo, Micro, YГєn

Connected to USB

Connected to NINA

SerialUSB (Native USB Port only)

Connected to Programming Port

SerialUSB (Native USB Port only)

On Uno, Nano, Mini, and Mega, pins 0 and 1 are used for communication with the computer. Connecting anything to these pins can interfere with that communication, including causing failed uploads to the board.

You can use the Arduino environment’s built-in serial monitor to communicate with an Arduino board. Click the serial monitor button in the toolbar and select the same baud rate used in the call to begin() .

Serial communication on pins TX/RX uses TTL logic levels (5V or 3.3V depending on the board). Don’t connect these pins directly to an RS232 serial port; they operate at +/- 12V and can damage your Arduino board.

To use these extra serial ports to communicate with your personal computer, you will need an additional USB-to-serial adaptor, as they are not connected to the Mega’s USB-to-serial adaptor. To use them to communicate with an external TTL serial device, connect the TX pin to your device’s RX pin, the RX to your device’s TX pin, and the ground of your Mega to your device’s ground.

Источник

Ардуино работа с uart

Интерфейс взаимодействия UART, двоичное, десятеричное, шестнадцатеричное преставления чисел

Содержание

Теоретическая часть лекции

Теоретическая часть отлично изложена в исходной видеолекции:

Ссылки, приведенные в видео:

  • http://yadi.sk/d/v6Ab3fUTP_rb-Q — проект Algorithm Builder
  • http://yadi.sk/i/X7lFKhASSTuTcg — замечательная книга Евстифеева (если ссылка не открывается, эту книгу можно скачать в разделе Библиотека моего сайта)

Практика на языке Си

Начнем, как и в исходной лекции, с инициализации модуля USART. Конечно, в Atmel Studio 6.2, которую я использую при разработке алгоритмов на языке Си, нет такого конфигуратора, как в AB, но даташит или книга Евстифеева с лихвой компенсируют этот недостаток.

Отмечу, что перечислять все биты регистра совершенно не обязательно. Можно просто вписать шестнадцатеричное значение или десятичное, например:

Отправка одного байта осуществляется крайне просто: мы записываем нужный байт в регистр UDR0 (регистр данных модуля USART), а модуль делает все остальное сам. Итого, алгоритм отправки одного байта выглядит так:

Оформим его в виду процедуры (подпрограммы), чтобы вызывать одной строкой.

Теперь отправка байта в порт занимает всего одну строку.

Теперь отправим число и строку. Если у тебя нет желания разбираться, как работают эти алгоритмы, просто скопируй следующие процедуры в свою программу перед объявлением основной процедуры main:

Теперь ты можешь использовать их в своей программе так:

Теперь подробнее о принципе работы этих процедур.

Для начала, самая простая — UART_send_BK(). Суть этой процедуры в том, что она отправляет два байта: 0x0D и 0x0A, которые являются служебными в стандартной таблице символов ASCII и отвечают за перенос курсора на новую строку.

Следующая по сложности процедура — UART_send_int(). Суть ее работы основана на том, что арабские цифры в стандартной таблице символов ASCII расположены друг за другом, начиная с адреса 0x30. То есть, если «откусывать» от числа по одной цифре и прибавлять ее к адресу 0x30, мы получим адрес нужной цифры в стандартной таблице символов ASCII. Остается лишь отправить его. А с выделением цифр справятся два стандартных оператора языка Си: a / b — целая часть от деления числа a на число b и a % b — дробная часть от деления числа a на число b.

И самая непонятная на первый взгляд процедура — UART_send_string(). На вход она получает строку, от которой ей требуется только адрес первого символа. Так повелось, что в конце каждой строки должен обязательно стоять байт 0х00, обозначающий конец строки. Цикл while (пока (условие) делать < команды; >) отправляет все байты по очереди, пока не дойдет до последнего — нулевого.

Думаю, для одной лекции этого более, чем достаточно. Я искренне надеюсь, что эта статья тебе понравилась и была полезной. До новых встреч! До новой дискриминации языка Си в лекциях! (шутка)

Источник

UART — Универсальный Асинхронный Приёмопередатчик

Общие сведения:

Универсальный асинхронный приёмопередатчик (Univsersal Asynchronos Reciever-Transmitter) — это физическое устройство приёма и передачи данных по двум проводам. Оно позволяет двум устройствам обмениваться данными на различных скоростях. В спецификацию UART не входят аналоговые уровни на которых ведётся общение между устройствами, UART это протокол передачи единиц и нулей, электрическую спецификацию на себя берут другие стандарты, такие как TTL (transistor-transistor logic — транзисторно-транзисторная логика), RS-232, RS-422, RS-485 и другие (RS [англ.recommended standard] — рекомендованный стандарт). На данный момент в микроконтроллерах используется в основном TTL (или точнее CMOS) UART для соединения не более двух устройств. В наших примерах мы часто называем его последовательным портом.

Подключение:

У каждого устройства, поддерживающего UART обычно обозначены два вывода: RX и TX. TX — означает transmit (передаю), RX — receive (принимаю). Отсюда становится понятно что RX одного устройства нужно подключать к TX другого. Если Вы подключите RX одного устройства к RX другого, то оба устройства будут слушать друг друга, вы соединили их входы. Если соединить TX и TX — это уже более опасно, это выходы низкого сопротивления устройств и если на одном будет логическая единица, а на втором ноль — по проводу пойдёт ток короткого замыкания (это зависит от конкретной программной или аппаратной реализации). Хотя в современных чипах от этого есть защита, на всякий случай, не стоит на неё ориентироваться. Так же необходимо объединить референсные уровни двух устройств (GNDGND), если не подразумевается гальваническая развязка.

Пример соединения двух UNO:

UART на Arduino:

На Arduino и Arduino-совместимых платах аппаратный UART обозначается символами RX и TX рядом с соответствующими выводами. На Arduino UNO/Piranha UNO это 0 и 1 цифровые выводы:

Arduino UNO/Piranha UNO

В скетче инициализируется функцией begin() в коде функции setup():

Пример:

Piranha ULTRA

На Piranha ULTRA присутствуют два аппаратных UART. Один на тех же выводах, что и UNO, второй на 8 (RX) и 9 (TX) выводах:

В Arduino IDE второй аппаратный UART называется Serial1 (Сериал один), и инициализируется так же как и первый:

Простой пример для копирования буфера первого UART’а во второй и наоборот:

Arduino MEGA

У Arduino MEGA, помимо UART’a на цифровых выводах 0 и 1 как и у UNO, присутствуют ещё три аппаратных UART. На плате это выводы 19 (RX1), 18 (TX1), 17 (RX2), 16 (TX2) и 15 (RX3), 14 (TX3) соответственно. UART совместимый по расположению с UNO обозначен RX0, TX0:

На заметку: На многих Arduino и Arduino-совместимых платах UART0 используется для загрузки скетчей, так что если Ваш скетч не загружается, проверьте эти выводы. Во время загрузки скетча к ним ничего не должно быть подключено.

Отладка проектов при помощи UART

В совокупности с монитором последовательного порта UART может быть очень полезен для отладки кода. Например, если не понятно доходит ли Ваш код до определённого места или какие значения принимает переменная, можно вызвать функцию println() и вывести значение переменной или какое-нибудь сообщение в монитор порта. В Arduino IDE монитор порта находится в меню Инструменты -> Монитор порта, так же его можно вызвать нажав пиктограмму лупы в правом верхнем углу главного окна Arduino IDE или вызвать с клавиатуры комбинацией клавиш Ctrl+Shift+M. Перед вызовом монитора порта необходимо выбрать порт с которым Вы хотите работать. Сделать это можно в меню Инструменты -> Порт.

Для удобства отладки можно указать директивы препроцессора языка Си #define , #ifdef , #ifndef

Пример:

Программный UART на Arduino

Помимо аппаратного UART в Arduino можно использовать программный. Программный порт хорошо подходит для простых проектов, не критичных к времени работы кода или для отладки проектов, позволяя не отключать модули использующие UART во время загрузки сетчей. При его использовании нужно лишь помнить что никакой другой код не может выполняться пока программа занимается считыванием данных из него и передача может осуществляться только в полудуплексном или симплексном режимах. Так же на программный RX можно назначать только те выводы, которые поддерживают прерывание по смене уровней. На UNO, например, это все цифровые выводы, кроме 13-го. Прежде чем собирать свой проект, проконсультируйтесь с инструкцией к конкретной плате.

Пример использования программного порта:

Далее к программному порту нужно обращаться через объект mySerial . Например: mySerial.write(data); .

UART на Raspberry Pi:

На Raspberry Pi UART находится на выводах колодки 8 — TX (GPIO14) и 10 — RX (GPIO15)

Перед работой с последовательным портом необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> Serial Port

Пример работы с последовательным портом на Python:

Данный пример выводит строку «iArduino.ru» в последовательный порт Raspberry и ждёт данных из последовательного порта.

Подробнее о UART:

Параметры

При обозначении параметров UART принято использовать короткую запись ЦИФРАБУКВАЦИФРА

  • ЦИФРА — количество бит в кадре
    • от 5 до 9 бит. Обычно 8.
  • БУКВА — наличие и тип бита чётности
    • N — None (Отсутствует) без бита чётности
    • E — Even (Чётный). Проверка данных на чётность. Перед стоп-битом в кадр добавляется бит: 0 если в кадре было нечётное количество единиц, 1 — если чётное.
    • O — Odd (Нечётный). Проверка данных на нечётность. Перед стоп-битом в кадр добавляется бит: 1 если в кадре было нечётное количество единиц, 0 — если чётное.
  • ЦИФРА — длительность стоп-бита
    • 1, 1.5, 2. Продолжительность стоп-бита (1, 1.5 или 2 битовых интервала)

Таким образом, стандартные настройки в Arduino: 8-N-1

Кадрирование данных

При приёме-передаче данных каждое устройство ориентируется на своё внутреннее тактирование. Обычно это тактирование от 8 до 16 раз быстрее скорости передачи данных и обычно отсчитывается от стартового бита. Именно поэтому необходимо чтобы оба устройства были настроены на одну и ту же скорость передачи.

Так же при передаче данных присутствуют синхронизирующие биты, именуемые старт-бит и стоп-бит. Старт-бит сигнализирует о начале передачи данных и стоп-бит, соответственно об окончании.

Рассмотрим кадр данных:

При разговорах о серийный протоколах принято использовать такие слова как кадр и пакет. Кадр — интервал от старт-бита до стоп-бита. Пакет — количество кадров полезных данных. При этом не стоит путать кадр и байт: байт — это только сами данные, не включающие в себя синхронизирующие и проверочные биты.

Старт-бит:

При отсутствии передачи линия удерживается в состоянии логической единицы (в случае TTL Arduino это 5 вольт или Vcc). Как только передающее устройство притягивает линию к 0 (GND или 0 вольт в случае Arduino), это сигнализирует принимающему устройству о том что сейчас будет передача данных.

Данные:

При появлении старт-бита на линии принимающее устройство начинает отсчитывать время в соответствии с установленной скоростью и считывать состояния линии через определённые промежутки времени в соответствии с установленным количеством бит данных, после этого.

Стоп-бит:

По завершении передачи данных принимающее устройство ожидает стоп-бит, который должен быть на уровне логической единицы. Если по завершении кадра удерживается логический ноль, значит данные неверны. Если логический ноль удерживается время, превышающее длину кадра в 1,5 раза, такое состояние именуется break (разрыв линии, исторически пошло от устройств, использующих токовую петлю для передачи данных). Некоторые передатчики вызывают это состояния специально перед посылкой пакета данных. Некоторые приёмники считают такое состояние за неправильно выставленную скорость и сбрасывают свои настройки на установки «по умолчанию».

Скорость передачи данных

Скорость изменения логических уровней (импульсов) на линии принято измерять в бодах. Единица измерения названа так в честь французского изобретателя Жана Мориса Эмиля Бодо.

Скорость при использовании UART может быть любой, единственное требование — скорости передающего и принимающего должны быть одинаковы. Стандартная скорость UART принята за 9600 бод. Arduino без проблем и лишних настроек может принимать и передавать данные на скоростях до 115200 бод.

Так как при передаче данных присутствуют синхронизирующие биты, именуемые старт-бит и стоп-бит, не совсем корректно говорить, что скорость 9600 бод равна 9600 битам в секунду. Если речь идёт о полезных данных, то реальная скорость на 20% ниже. Например, если выставлены параметры 8-N-1 и 9600 бод, то на передачу одного байта уходит десять бит, и 9600/10 = 960 байт, что равно 7680 битам в секунду.

Методы связи

UART позволяет одновременно передавать и принимать данные, однако не всегда это возможно или нужно. Например, если Вам нужно только получать не критические данные (которые можно проверить следующим пакетом, например расстояние, посылаемое лидаром каждые несколько сотен миллисекунд) от цифрового датчика или любого другого устройства и не нужно ничего передавать, такой метод называется симплексным. Всего различают три метода связи:

  • Полнодуплексная — когда ведущий и ведомый могут одновременно принимать и передавать (одновременная передача в обе стороны)
  • Полудуплексная — когда ведущий и ведомый поочерёдно принимают и передают (Поочерёдная передача в обе стороны)
  • Симплексная — когда ведущий или ведомый только передают (Передача в одну сторону)

Источник

Adblock
detector
Board USB CDC name Serial pins Serial1 pins Serial2 pins Serial3 pins