9600 бод это сколько байт в секунду
Перейти к содержимому

9600 бод это сколько байт в секунду

Как работает последовательная связь на Arduino?

Применительно к платам Arduino Uno, Mega2560, Leonardo и аналогичным:

  • Как работает последовательная связь?
  • Насколько быстрый серийный?
  • Как мне установить связь между отправителем и получателем?

Пожалуйста, обратите внимание: это задумано как справочный вопрос.

Асинхронная последовательная (обычно называемая последовательной) связь используется для отправки байтов с одного устройства на другое. Устройство может быть одним или несколькими из следующих:

  • Arduino
  • ПК
  • GPS
  • Считыватель RFID карт
  • ЖК дисплей
  • Модем
  • Другой

Тактовая частота и выборка данных

В отличие от SPI / USB / I2C последовательная связь не имеет тактового сигнала. Часы дискретизации — это согласованная частота дискретизации (известная как скорость передачи данных). Как отправитель, так и получатель должны быть настроены на использование одной и той же скорости, иначе получатель будет получать бессмысленные данные (из-за того, что биты отбираются не с той же скоростью, с которой они были отправлены).

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

Serial comms - отправка одного байта

На рисунке выше показана передаваемая буква «F». В ASCII это 0x46 (в шестнадцатеричном формате) или 0b01000110 (в двоичном виде). Не менее значимо (младший) бит передается первым, таким образом , в приведенном выше рисунке вы видите биты , поступающие в порядке: 01100010 .

Время простоя между байтами передается в виде непрерывных битов «1» (фактически линия передачи постоянно поддерживается на высоком уровне).

Чтобы указать начало байта, стартовый бит всегда указывается путем вытягивания линии вниз, как показано на рисунке. Как только приемник увидит начальный бит, он ждет в 1,5 раза больше времени выборки, а затем производит выборку битов данных. Он ждет 1,5 раза, чтобы он:

  • Пропускает стартовый бит
  • Образцы на полпути через следующий бит

Например, если скорость передачи составляет 9600 бод, то частота дискретизации составит 1/9600 = 0.00010416 секунды (104,16 мкс).

Таким образом, на скорости 9600 бод после приема начального бита приемник ожидает 156,25 мкс, а затем производит выборку каждые 104,16 мкс.

Стартовый бит

Цель стоп-бита — убедиться, что между каждым байтом определенно есть 1-бит. Без стоп-бита, если байт заканчивался нулем, аппаратное обеспечение не могло бы определить разницу между этим битом и начальным битом следующего байта.

Для получения вышеуказанного вывода на Uno вы можете написать этот код:

Количество бит данных

Чтобы сэкономить время передачи (в старину, хе) вам было разрешено указывать разное количество бит данных. Аппаратное обеспечение AtMega поддерживает нумерацию битов данных от 5 до 9. Понятно, что чем меньше бит данных, тем меньше информации вы можете отправлять, но тем быстрее это будет.

Биты четности

При желании вы можете иметь бит четности. Это вычисляется, если требуется, путем подсчета числа 1 в символе, а затем убедитесь, что это число нечетное или четное, установив бит четности в 0 или 1, как требуется.

Например, для буквы «F» (или 0x46 или 0b01000110) вы можете видеть, что там есть 3 (в 01000110). Таким образом, у нас уже есть странный паритет. Итак, бит четности будет выглядеть следующим образом:

  • Без паритета: опущено
  • Четное соотношение: 1 (3 + 1 — четное)
  • Нечетное соотношение: 0 (3 + 0 нечетно)

Бит четности, если имеется, появляется после последнего бита данных, но перед стоп-битом.

Если получатель не получает правильный бит четности, это называется «ошибкой четности». Это указывает на то, что есть какая-то проблема. Возможно, отправитель и получатель настроены на использование разных скоростей в бодах, или на линии был шум, который превратил ноль в единицу или наоборот.

Некоторые ранние системы также использовали «пометить» четность (где бит четности всегда был равен 1 независимо от данных) или «пробел» четности (где бит четности всегда был равен 0 независимо от данных).

9-битная передача

Некоторое оборудование связи использует 9-битные данные, поэтому в этих случаях бит четности превращается в 9-й бит. Существуют специальные методы для отправки этого 9-го бита (регистры являются 8-битными регистрами, поэтому 9-й бит должен быть помещен в другое место).

Количество стоп-битов

Раннее оборудование, как правило, было несколько медленнее в электронном виде, поэтому, чтобы дать получателю время для обработки входящего байта, иногда указывалось, что отправитель отправит два стоповых бита. Это в основном добавляет больше времени, когда строка данных удерживается на высоком уровне (еще один бит), прежде чем появится следующий стартовый бит. Это дополнительное битовое время дает получателю время для обработки последнего входящего байта.

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

нотация

Обычно последовательная связь указывается сообщением скорости, количества бит данных, типа четности и количества стоп-битов, например:

Это говорит нам:

  • 9600 бит в секунду
  • 8 бит данных
  • Нет четности (вы можете увидеть вместо этого: E = четный, O = нечетный)
  • 1 стоповый бит

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

Pin-ауты

Arduino Uno имеет цифровые контакты 0 и 1, доступные для серийного оборудования:

Серийные булавки Arduino Uno

Чтобы соединить два Arduinos, вы меняете местами Tx и Rx следующим образом:

Соединение двух Arduinos вместе

скорость

Поддерживается широкий диапазон скоростей (см. Рисунок ниже). «Стандартные» скорости обычно кратны 300 бод (например, 300/600/1200/2400 и т. Д.).

Другие «нестандартные» скорости могут быть обработаны путем установки соответствующих регистров. Класс HardwareSerial делает это для вас. например.

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

Таким образом, на скорости 9600 бод вы можете передавать 960 байт ( 9600 / 10 = 960 ) в секунду.

Ошибки скорости передачи

Скорость передачи данных на Atmega генерируется путем деления системных часов и последующего отсчета до заданного числа. Эта таблица из таблицы данных показывает значения регистров и процент ошибок для тактовой частоты 16 МГц (такой как на Arduino Uno).

Ошибки скорости передачи

Бит U2Xn влияет на делитель тактовой частоты (0 = делить на 16, 1 = делить на 8). Регистр UBRRn содержит число, которое подсчитывает процессор.

Итак, из таблицы выше мы видим, что мы получаем 9600 бод от тактовой частоты 16 МГц следующим образом:

Мы делим на 104, а не 103, потому что счетчик является нулевым. Таким образом, ошибка здесь 15 / 9600 = 0.0016 близка к приведенной выше таблице (0,02%).

Вы заметите, что некоторые скорости передачи данных имеют большую ошибку, чем другие.

Согласно данным таблицы максимальный процент ошибок для 8 бит данных находится в диапазоне от 1,5% до 2,0% (см. Таблицу данных для более подробной информации).

Ардуино Леонардо

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

Из-за этого вы должны подождать, пока Serial станет «готовым» (поскольку программное обеспечение устанавливает соединение USB), с дополнительной парой строк, например:

Однако, если вы действительно хотите общаться через контакты D0 и D1 (а не через USB-кабель), вам нужно использовать Serial1, а не Serial. Вы делаете это так:

Уровни напряжения

Обратите внимание, что Arduino использует уровни TTL для последовательной связи. Это означает, что он ожидает:

  • Нулевой бит равен 0 В
  • Единичный бит + 5В

Старое последовательное оборудование, предназначенное для подключения к последовательному порту ПК, вероятно, использует уровни напряжения RS232, а именно:

  • Нулевой бит от +3 до +15 вольт
  • Один бит составляет от -3 до -15 вольт

Мало того, что это «инвертировано» по отношению к уровням TTL («единица» является более отрицательным, чем «ноль»), Arduino не может обрабатывать отрицательные напряжения на своих входных выводах (ни положительные, превышающие 5В).

Таким образом, вам нужна интерфейсная схема для связи с такими устройствами. Только для входа (для Arduino), простой транзистор, диод и пара резисторов сделают это:

Инвертирующий буфер

Для двусторонней связи вы должны иметь возможность генерировать отрицательные напряжения, поэтому требуется более сложная схема. Например, микросхема MAX232 сделает это в сочетании с четырьмя конденсаторами емкостью 1 мкФ, которые будут действовать как цепи подкачки заряда.

Серийный

Существует библиотека SoftwareSerial, которая позволяет вам осуществлять последовательную связь (до определенного момента) в программном, а не аппаратном обеспечении. Это имеет то преимущество, что вы можете использовать различные конфигурации контактов для последовательной связи. Недостаток заключается в том, что выполнение последовательных программ в программном обеспечении является более ресурсоемким и более подверженным ошибкам. Смотрите Software Serial для более подробной информации.

Mega2560

Arduino «Мега» имеет 3 дополнительных аппаратных последовательных порта. Они помечены на доске как Tx1 / Rx1, Tx2 / Rx2, Tx3 / Rx3. Они должны быть использованы в предпочтении SoftwareSerial, если это возможно. Чтобы открыть эти другие порты, вы используете имена Serial1, Serial2, Serial3, например:

Прерывания

При отправке и получении с использованием библиотеки HardwareSerial используются прерывания.

Отправка

Когда вы делаете a Serial.print , данные, которые вы пытаетесь распечатать, помещаются во внутренний буфер передачи. Если у вас 1024 байта или больше оперативной памяти (например, в Uno), вы получите 64-байтовый буфер, в противном случае вы получите 16-байтовый буфер. Если в буфере есть место, то Serial.print возвращается немедленно, таким образом, не задерживая ваш код. Если места нет, то он «блокирует» ожидание достаточного опустошения буфера, чтобы освободилось место.

Затем, когда каждый байт передается аппаратным обеспечением, вызывается прерывание (прерывание «USART, пустой регистр данных»), и процедура прерывания отправляет следующий байт из буфера из последовательного порта.

получающий

При получении входящих данных вызывается подпрограмма прерывания (прерывание «USART Rx Complete»), и входящий байт помещается в буфер «приема» (такого же размера, как упомянутый выше буфер передачи).

Когда вы звоните, Serial.available вы узнаете, сколько байтов доступно в этом буфере «приема». При вызове Serial.read байт удаляется из приемного буфера и возвращается в ваш код.

На Arduinos с 1000 или более байтов оперативной памяти нет никакой необходимости удалять данные из приемного буфера, если вы не позволяете им заполняться. Если он заполняется, то все дальнейшие входящие данные отбрасываются.

Обратите внимание, что из-за размера этого буфера нет смысла ждать очень большое количество байтов, например:

Это никогда не будет работать, потому что буфер не может содержать так много.

подсказки

Перед чтением всегда убедитесь, что данные доступны. Например, это неправильно:

Serial.available Тест только гарантирует , что вы есть один байт доступны, однако код пытается прочитать два. Это может сработать, если в буфере два байта, если нет, вы получите -1, который будет выглядеть как «ÿ» при печати.

Знайте, сколько времени занимает отправка данных. Как упоминалось выше, при скорости 9600 бод вы передаете только 960 байт в секунду, поэтому попытка отправить 1000 показаний с аналогового порта на скорости 9600 бод не будет очень успешной.

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

    Разница между битом и скоростью

    Видео: Разница между битом и бодом | Сравните разницу между похожими терминами

    Содержание:

    Бит против Бода

    В вычислениях бит — это основная единица информации. Просто бит можно рассматривать как переменную, которая может принимать только одно из двух возможных значений. Эти два возможных значения — «0» и «1» и интерпретируются как двоичные цифры. Два возможных значения также могут быть интерпретированы как логические (логические) значения, которыми являются «истина» и «ложь». Бод — это единица измерения, используемая для измерения скорости передачи данных. Значение бода — количество символов или импульсов в секунду.

    Что такое бит?

    В вычислениях бит — это основная единица информации. Просто бит можно рассматривать как переменную, которая может принимать только одно из двух возможных значений. Эти два возможных значения — «0» и «1» и интерпретируются как двоичные цифры. Два возможных значения также могут быть интерпретированы как логические (логические) значения, которыми являются «истина» и «ложь». На практике биты могут быть реализованы несколькими способами. Обычно это реализуется с помощью электрического напряжения. Значение «0» в бите представлено 0 вольт, а значение «1» в бите представлено с использованием положительного напряжения относительно земли (обычно до 5 вольт) в устройствах, использующих положительную логику. В современных устройствах памяти, таких как динамическая память с произвольным доступом и флэш-память, для реализации бита используются два уровня заряда в конденсаторе.В оптических дисках два значения бита представлены с использованием наличия или отсутствия очень маленькой ямки на отражающей поверхности. Для представления бита используется символ «бит» (согласно стандарту 2008 — ISO / IEC 80000-13) или строчная буква «b» (согласно стандарту 2002 — IEEE 1541).

    Что такое Бод?

    Бод — это единица измерения, используемая для измерения скорости передачи данных. Значение бода — количество символов или импульсов (переходов между состояниями) в секунду. Символ скорости передачи — «Bd». Единица бод названа в честь французского инженера Жана Мориса Эмиля Бодо, изобретателя телеграфии. Кроме того, бод впервые был использован для измерения скорости передачи телеграфа. Но бод в настоящее время не используется для измерения скорости передачи данных и заменен на бит / с (бит в секунду). Скорость передачи и бит / с связаны, но это не одно и то же, поскольку один переход состояния может включать несколько битов данных.

    В чем разница между Bit и Baud?

    В вычислениях бит является основной единицей информации, тогда как бод — это единица измерения, используемая для измерения скорости передачи данных, которая имеет значение символов или импульсов (переходов между состояниями) в секунду. Для представления бита используется символ «бит» или «b», а для представления бода — «Bd». Бод в настоящее время не используется и был заменен на бит / с (бит в секунду). Эти два измерения связаны, но это не одно и то же. Иногда скорость передачи данных неправильно используется в местах, где должна использоваться скорость передачи данных. Эти две скорости будут одинаковыми для передачи данных по простым каналам, использующим один бит для символа. Но в других местах эти две ставки разные.

Добавить комментарий

Ваш адрес email не будет опубликован.