Что такое Serial.begin(9600)?

Я знаю, что это что-то инициализировать:

Serial.begin(9600);

Но я хочу знать, что это на самом деле означает?

, 👍28

Обсуждение

В документации есть хорошее описание этого. http://arduino.cc/en/Serial/begin, @sachleen


3 ответа


Лучший ответ:

25

Serial.begin(9600) фактически ничего не печатает. Для этого вам нужно использовать Serial.print("Hello world!") для печати текста "Hello world!" на последовательную консоль. Скорее, он инициализирует последовательное соединение со скоростью 9600 бит в секунду.

Обе стороны последовательного соединения (то есть Arduino и ваш компьютер) должны быть настроены на использование последовательного соединения с одинаковой скоростью, чтобы получать какие-либо понятные данные. Если существует несоответствие между тем, что две системы считают скоростью, данные будут искажены.

9600 бит в секунду — это значение по умолчанию для Arduino, которого вполне достаточно для большинства пользователей, но вы можете изменить его на другие скорости: Serial.begin(57600) установит Arduino для передачи со скоростью 57600 бит в секунду. Вам нужно будет установить одну и ту же скорость любого программного обеспечения, которое вы используете на своем компьютере (например, последовательного монитора Arduino IDE), чтобы увидеть отправляемые данные.

,

Бод и BPS - это две разные вещи... сейчас не могу найти ту ссылку, которую искал., @Anonymous Penguin

что, если я поставлю «Serial.begin(0);» или «Serial.begin(4000);». Я имею в виду, я хочу знать, в чем разница между числами?, @shajib0o

Serial.begin используется для установки скорости передачи данных в битах в секунду. Один байт равен 8 битам, но последовательные соединения отправляют в принимающую систему стартовый и стоповый бит, чтобы идентифицировать начало и конец определенного байта. Таким образом, для отправки одного символа необходимо 10 бит. Использование Serial.begin(0) сообщает Arduino, что он должен обмениваться данными с последовательным портом со скоростью 0 бит в секунду. Как и следовало ожидать, это означает, что Arduino вообще никогда не будет отправлять никаких данных. Serial.begin(4000) заставит Arduino отправлять данные со скоростью 4000 бит в секунду. Это нестандартно, но в остальном нормально., @heypete

Короче говоря: изменение числа меняет скорость. Уменьшение числа (например, Serial.begin(300)) приводит к тому, что Arduino отправляет данные медленнее. Если увеличить его, скажем до 57600, данные будут отправляться быстрее. И отправляющая, и принимающая система должны договориться о том, какую скорость использовать: последовательная программа вашего компьютера, например окно последовательного монитора Arduino, позволит вам установить скорость, с которой ваш компьютер будет получать данные, но вы можете выбирать только из общих скорости: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 и 11520 бит/сек. Другие скорости ввести, например 4000, нельзя. 9600 обычно хорошо., @heypete

Бод и BPS - это две разные вещи... сейчас не могу найти ссылку, которую искал. - Вот одно объяснение: [Приложение C: «бод» и «бит/с»](http://www.tldp .org/HOWTO/Modem-HOWTO-23.html), @Nick Gammon


23

Говорят, что картинка стоит 1000 слов (1024 слова, если вы работаете с компьютерами), поэтому я выложу несколько картинок...

Я настроил Uno на отправку «Fab» со скоростью 9600 бод и зафиксировал результаты на логическом анализаторе.

Последовательная связь — 3 буквы

Части, заштрихованные красным, представляют собой период ожидания между байтами.

Из приведенного выше рисунка следует отметить, что линия данных Tx (передача) обычно имеет высокий уровень (1), пока не упадет до низкого уровня, указывая на начало символа (байта). Это стартовый бит. Затем 8 бит данных (обозначены белыми точками) появляются со скоростью передачи данных (9600 выборок в секунду). После этого линия снова поднимается на высокий уровень. Это стоповый бит (красная часть). Затем мы видим стартовый бит следующего символа и так далее. «Стоповая» часть может быть неограниченной длины, однако ее длина должна быть не менее одного бита.


Более подробную информацию о первом символе (букву «F», 0x46 или 0b01000110) можно увидеть здесь:

Последовательная связь — один байт

  • A – нет данных (высокий уровень передачи)

  • B — «стартовый бит». В строке устанавливается низкий уровень, чтобы сообщить получателю, что символ (байт) начинает отправляться. Приемник ожидает полтора такта перед выборкой строки.

  • C — прибывает первый символ (буква «F», 0x46 или 0b01000110). Тактового бита как такового нет, входящие данные просто отбираются со скоростью передачи (в бодах). В отличие от связи SPI, данные сначала поступают младшим битом (если вы не отправляете 8 бит на байт). Таким образом мы видим 01100010 (а не 01000110).

  • D — стоповый бит. Это значение всегда высокое, чтобы мы могли отличить конец этого байта от начала следующего. Поскольку стартовый бит равен нулю, а стоповый бит равен единице, всегда существует четкий переход от одного байта к другому.

  • E — начальный бит следующего символа.


Из снимков логического анализатора видно, что T1 - T2 составляет 0,1041667 мс, а на самом деле это 1/9600:

1 / 9600 = 0.00010416666 seconds

Таким образом, скорость 9600 дает вам количество бит в секунду, а обратное значение — это интервал времени между битами.


Другие соображения

  • Последовательная связь не синхронизируется самостоятельно (в отличие от SPI, I2C и других), поэтому отправитель и получатель должны согласовать тактовую частоту.

  • Тактовая частота на Arduino не точна, поскольку аппаратному обеспечению приходится делить системную тактовую частоту, чтобы получить последовательную тактовую частоту, и деление не всегда точное. Почти всегда возникает ошибка, ее количество указано в таблице данных (цифры указаны для системной частоты 16 МГц, например, на Uno):

    Ошибка скорости последовательной передачи данных

  • Вы можете варьировать количество бит данных, вам не обязательно отправлять 8 из них, на самом деле вы можете отправлять от 5 до 9 бит.

  • При необходимости после битов данных может быть отправлен бит четности.

    • Если вы указываете «нечетную» четность, бит четности устанавливается таким образом, что общее количество 1-битов является нечетным.
    • Если вы укажете «четную» четность, бит четности будет установлен таким образом, чтобы общее количество единиц было четным.
    • Если вы не указали четность, бит четности опускается.

    Это может помочь получателю определить, правильно ли поступили данные.

  • Бит четности отправляется перед стоповым битом.

  • В случае 9 бит данных (как используется в протоколе SeaTalk) бит четности переназначается как 9-й бит данных. Поэтому вы не можете иметь одновременно 9 бит данных и бит четности.

  • Вы также можете иметь два стоповых бита. По сути, это просто увеличивает время между байтами. В «старые времена» это было сделано для того, чтобы медленное электромеханическое оборудование могло обработать предыдущий байт (например, распечатать его).


Возможная коррупция

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

Единственный реальный способ исправить это — время от времени создавать достаточно большой разрыв (например, длиной 10 бит), чтобы этого не могло произойти.


Инвертированная логика

Показанные здесь биты (логический уровень) не инвертируются. То есть 1 бит — это ВЫСОКИЙ, а 0 бит — НИЗКИЙ. Если у вас есть оборудование RS232, которое, вероятно, будет отправлять что-то вроде -12 В для 1-бита и +12 В для 0-бита. Это инвертированное значение, поскольку единица меньше нуля по напряжению.

Если у вас есть такие устройства, вам необходимо сделать преобразование напряжения и инверсию логики. Такие чипы, как MAX232, сделают и то, и другое за вас. Они также могут обеспечить напряжение -12 В, необходимое для управления таким оборудованием, генерируя его внутри с помощью нескольких конденсаторов, приобретаемых пользователем.


Практическое правило скорости

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

Например. При скорости 9600 бит/с вы можете отправлять 960 байт в секунду.


Код для воспроизведения:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }
,

2

;TLDR; Он инициализирует порт последовательной связи и устанавливает скорость передачи данных. На устройстве, с которым вы обмениваетесь данными (или последовательном мониторе Arduino IDE), должна быть установлена соответствующая скорость передачи данных. После инициализации порта вы можете начать отправлять или получать символы. Справочник по серийным номерам Arduino

,

Не преуменьшать и не проявлять неуважение к превосходному освещению этой темы @Nick-Gammon., @linhartr22