Serial.begin (): Почему не всегда использовать 28800?


35

Во многих примерах кода онлайн люди добавляют строку Serial.begin(9600)в блок установки.

Когда я смотрю, что Serial.begin()находится в официальной документации, он говорит, что контролирует передачу данных в битах в секунду.

Поэтому очевидный вопрос: почему бы не использовать 28800, самую высокую скорость передачи? Почему люди соглашаются на 9600? Какое здесь ограничение?


3
К вашему сведению, самый высокий показатель, поддерживаемый Arduino, подключенным к USB, на самом деле составляет 115200, а 57600 часто является второй наиболее распространенной скоростью передачи данных, которую вы видите.
BrettAM

Ответы:


48

Почему люди обосновываются?

Люди соглашаются, потому что это более чем достаточно быстро. Наиболее распространенное использование - просто напечатать некоторые вещи на терминале для отладки. 9600 бод - это 960 символов в секунду или 12 x 80 строк символов в секунду. Как быстро вы можете читать? :)

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

Какое ограничение ...

Ограничения на серийные высоки. Непосредственно вы можете использовать 115200 бод в своих программах, и это будет просто работать. Терминал Arduino будет иметь максимум 115200, но другие программы, такие как RealTerm, позволят вам работать выше.

Аппаратный серийник будет работать до 1 Мбод. Если вы прочитаете вокруг, вы увидите, что люди использовали до 1 М, непосредственно управляя UART. Вы можете получить выгоду от высокой скорости передачи данных при использовании, например, при передаче через Bluetooth-чип. Если вы используете аппаратный последовательный интерфейс для обмена данными от микросхемы к микросхеме на небольшом расстоянии, то вполне допустимо 1 Мбод. Подумайте обо всех устройствах SPI и I2C, которые прекрасно работают с тактовой частотой 1 МГц.

На больших расстояниях у вас начнутся проблемы с шумом при использовании сигнализации логического уровня (от 0 до 5 В). Чтобы использовать большие расстояния, вы должны добавить приемопередатчик для обеспечения надежной сигнализации, обычно RS-232 и реже RS-485. С RS-232 вы можете бегать мега-бит на расстоянии 10 футов.

Тактовая частота микропроцессора будет реальным пределом. С аппаратным UART процессор должен загружать один байт в UART каждые 10 бит (для N81). Поэтому, когда вы получаете 1 Мбод, для 16-МГц процессора будет непросто обеспечить UART данными. Новый байт будет отправляться каждые 160 тактов, что составляет очень мало строк кода. Для короткого пакета данных вы можете достичь этой скорости. Это сообщение означает, что процессор разгонится до того, как UART достигнет предела.

Обратите внимание, это все относится к HardwareSerial , серийный номер программного обеспечения сильно отличается.


Обратите внимание, что 2M архивируется с помощью hw serial, но реализация arduino кажется слишком медленной и отправляет много мусора. Посмотрите atmega328p ds, чтобы найти магический бит, чтобы удвоить вашу скорость. Также добавьте, что 9800 бод - это очень старый стандарт, и многие датчики используют это значение в качестве стандарта, даже если его можно настроить для большего, например, xbee, gps и т. Д. Кроме того, при последовательном соединении по USB используется автоматическое согласование скорости передачи данных, которое может переопределить выбранную скорость передачи данных, но я думаю, что arduino не использует (но это может быть на leonardo)
Lesto

1
9600 8N1 также является де-факто настройкой по умолчанию. Многие устройства с последовательным интерфейсом поставляются с этим параметром и должны быть настроены, если требуется другая скорость (или бит данных, бит четности, стоп-бит).
Питер Мортенсен

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

Если вы делаете массовую передачу данных, в идеале вы будете использовать SPI, верно?
Tuskiomi

6

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

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

Например, если ваша ATmega328PA работает на частоте 1 МГц, вы можете достичь 9600b / с при 0,2% ошибки. Но при 14400b / с ошибка составляет -3,5% (фактически при скорости 13900b / с). А при скорости 28800b / с ошибка составляет + 8,5% (фактически при скорости передачи данных 31200b / с). Все эти цифры взяты из таблицы ATmega48PA-88PA-168PA-328PA, p200 .

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

Увеличение базовой частоты не обязательно значительно повышает точность. Например, использование той же ATmega328PA, что и выше, на частоте 2 МГц, на самом деле не дает лучших результатов, так как это в основном из-за ошибок округления. Но его частота 1,8432 МГц дает очень точный бит / с от 2400 бит / с до 57,6 кГц.


3

Я думаю, что это своего рода традиция использовать скорость передачи данных, которая не является самой низкой (300), но также и не может привести к проблемам в некоторых настройках (28800 или даже 115200). Серийный порт ПК (чаще всего USB-адаптер FTDI232) может справиться с более высокими скоростями, но ваше аппаратное обеспечение может не справиться. Таким образом, 9600 бит / с зарекомендовал себя как своего рода стандартная скорость передачи для примеров кода.


2

В глубине веков «золотой стандарт» для удаленных клавиатур (с использованием телефонного модема и телетайпов, если вы их помните) составлял 9600 бод, первоначально достижимый только по выделенной телефонной линии. Время движется медленно; быстрое развитие технологий; и память движется даже медленнее, чем время (кажется). Мы можем регулярно общаться, по крайней мере, на расстоянии нескольких метров, на пару порядков быстрее, чем 9600 бод. То, что когда-то считалось золотым стандартом, уже не золото, а все еще считается стандартом.

tl; dr: это история, а не технология.


0

Я думаю, что основная причина, по которой люди чаще всего используют 9600, заключается в том, что в IDE Arduino это скорость передачи по умолчанию. Кроме того, более быстрая скорость передачи данных также может быть ненадежной, если последовательный сигнал должен пройти длинный путь, хотя я не знаю, почему он был выбран в качестве оптимальной скорости.


-2

Время реакции человека

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

9600 бод - это компромисс между «легко убить убегающий процесс» и «раздражающе медленным».


100% эй ... интересно;)
сердитый 84
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.