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


22

Я знаю, что это что-то для инициализации:

Serial.begin(9600);

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


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

Ответы:


22

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

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

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


2
Бод и BPS - это две разные вещи ... не могу найти ссылку, которую я искал сейчас.
Анонимный Пингвин

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

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

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

Baud and BPS are two different things... can't find the link I was looking for now.- Вот одно объяснение: Приложение C: «бод» против «bps»
Ник Гэммон

21

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

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

Последовательный порт - 3 буквы

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

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


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

Последовательный порт - один байт

  • A - нет данных (Tx высокий)

  • 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-бит будет нечетным.
    • Если вы укажете четность, бит четности будет установлен таким образом, чтобы общее число 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 ()
  {
  }

1

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


Не умалять или неуважение к превосходному освещению этой темы @ Nick-Gammon.
linhartr22
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.