Чим відрізняється Serial.write від Serial.print? А коли вони використовуються?


26

Чим відрізняється Serial.write від Serial.print? А коли вони використовуються?
Обидва були використані для друку на послідовному моніторі, які їх фактичні відмінності?


Відмінне пояснення bpinhosilva! Ви допомогли мені зрозуміти щось, з чим я зараз дуже чітко боровся.
Рорі

Відповіді:


19

З сайту Arduino для Serial.write та Serial.print :

Serial.write ()

Записує двійкові дані на послідовний порт. Ці дані надсилаються у вигляді байту або серії байтів; щоб надіслати символи, що представляють цифри числа, скористайтесь функцією print ().

Serial.print ()

Друкує дані до послідовного порту у тексті ASCII, що читається людиною.


17

Serial.write є більш земним, він простий і швидкий, він може говорити бінарним, один байт за один раз. приклад:

Serial.write(0x45);   // will write 0100 0101 to the cable

Serial.print з іншого боку є більш універсальним, він зробить перетворення для вас з ASCII в бінарний, він також може конвертувати в BIN / HEX / OCT / DEC, але вам потрібно вказати другий аргумент, наприклад

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

більше прикладів із візуальним серійним виведенням:

Код:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

СЕРІЙНИЙ ВИХІД: введіть тут опис зображення

Код:

  Serial.print("HELLO");

СЕРІЙНИЙ ВИХІД: введіть тут опис зображення

Serial.println () з іншого боку додасть кінці рядка 2 байтів 0x0D та 0x0A, як ви бачите на кадрі

Код:

  Serial.println("HELLO");

СЕРІЙНИЙ ВИХІД:

введіть тут опис зображення


7

Serial.writeнадсилає байти до послідовного порту, в той час як Serial.printнадсилає символи ASCII, щоб люди могли легко читати.

Деякі пристрої працюють за допомогою байтів для встановлення конфігурацій, зазвичай використовують пакети даних, і вам потрібно використовувати функцію запису для спілкування з ними. Зрештою вони будуть надсилати байти через послідовний інтерфейс, а потім ви можете інтерпретувати, перейшовши кожен байт.


5

Усі наведені вище приклади правильні, але, можливо, більш чітко .... Усі дані, що надсилаються через послідовний порт, надсилаються як "1" та "0". (очевидно .... я сподіваюся) ... Різниця в двох командах полягає в тому, як все, що надсилається, насправді перекладається / інтерпретується в / з цих 1 та 0. Найясніший приклад включає передачу чисел.

Скажімо, вам потрібно надіслати число 217. Двійкове представлення цього числа (1 і 0) - це 11011001. Використання команди Serial.write(217)буквально просто надішле 11011001 по всьому рядку. Шістнадцяткове представлення того ж числа 0xD9, і команда Serial.write(0xD9)надішле те саме ... 11011001.

Ось де вам стає цікаво ... Якби ви використовували команду, Serial.write("217")ви натомість отримаєте це: 00110010 00110001 00110111 ... ЩО?!?!?
Коли рядок передається в якості аргументу, він розбивається на окремі символи, перетворюється на ASCII, а потім надсилається як байт для кожного символу. Ви отримали б точно такий же вихід, якби використали наступне:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

Тепер давайте розглянемо Serial.print(). Обидва команди Serial.print(217)або Serial.print("217")друкують те саме: 00110010 00110001 00110111. Це відбувається тому, що команда print спочатку перетворює будь-яке число у подання рядка, а потім використовує команду Serial.write()для надсилання кожного символу як окремі біти ASCII.

Хоча це не ПОЛЬНИЙ опис, я сподіваюся, що це допоможе змусити вас задуматися в правильному напрямку ...


3

Ще один спосіб відповісти на це - констатувати, що Serial.write приймає поодинокі символи, де Serial.print приймає рядки. Можливо, є деякі відмінності, але це головна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.