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


Відповіді:


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 букви

Затінені червоним кольором частини - це період простою між байтами.

З вищенаведеного графічного зауваження, що рядок даних Tx (передачі) зазвичай високий (1), поки він не опуститься низько, щоб вказати на початок символу (байт). Це початковий біт . Потім 8 бітів даних (позначених білими крапками) з'являються зі швидкістю передачі (9600 проб в секунду). Після цього рядок знову підносять високо. Це стоп-біт (червона частина). Потім ми бачимо стартовий біт для наступного символу тощо. Частина "стоп" може бути нескінченно довгою, однак вона повинна бути принаймні однією бітовою довжиною.


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

Серійні комікси - один байт

  • A - даних немає (Tx є високим)

  • В - "Біт старту". Рядок низький, щоб повідомити одержувачу, що символ (байт) починає надсилатися. Одержувач чекає півтори години перед тим, як взяти пробу лінії.

  • 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 V для 1-бітового і +12 V для 0-бітного. Це перевернуто, тому що одиниця менша за нуль, напруга.

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


Правило швидкості великого пальця

Оскільки, за допомогою одного початкового біта, 8 бітів даних та одного стоп-біту, ми маємо загалом 10 біт, як швидке правило, ви можете обчислити кількість байтів, які ви можете передати за секунду, поділивши швидкість передачі бітів на 10 .

Напр. При 9600 BPS ви можете відправити 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.