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

Я знаю, что это что-то печатать:

Serial.begin(9600);

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

20 голосов | спросил shajib0o 18 Mayam14 2014, 00:48:05

4 ответа


22

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

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

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

ответил heypete 18 Mayam14 2014, 01:11:36
20

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

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

 Последовательные сообщения - 3 буквы

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

Из приведенного выше графического примечания, что линия передачи данных Tx (передача) обычно высока (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-бит является HIGH, а 0-бит является LOW. Если у вас есть оборудование RS232, которое, вероятно, будет отправлять что-то вроде -12 В для 1-битного и +12 В для 0-бит. Это инвертируется, потому что один меньше нуля, по напряжению.

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


Правило скорости большого пальца

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

Eg. На 9600 BPS вы можете отправить 960 байт в секунду.


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

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

void loop ()
  {
  }
ответил Nick Gammon 13 AM000000100000005931 2015, 10:41:59
1

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

ответил linhartr22 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2015 23:13:09 +0300 2015, 23:13:09
-3

Указывает программу для работы внутри компьютерной системы. Цифры указывают скорость. Serial.print указывает, какой текст будет отображаться

ответил user11766 13 AM00000060000005531 2015, 06:46:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132