Відповіді:
З сайту Arduino для Serial.write та Serial.print :
Serial.write ()
Записує двійкові дані на послідовний порт. Ці дані надсилаються у вигляді байту або серії байтів; щоб надіслати символи, що представляють цифри числа, скористайтесь функцією print ().
Serial.print ()
Друкує дані до послідовного порту у тексті ASCII, що читається людиною.
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");
СЕРІЙНИЙ ВИХІД:
Serial.write
надсилає байти до послідовного порту, в той час як Serial.print
надсилає символи ASCII, щоб люди могли легко читати.
Деякі пристрої працюють за допомогою байтів для встановлення конфігурацій, зазвичай використовують пакети даних, і вам потрібно використовувати функцію запису для спілкування з ними. Зрештою вони будуть надсилати байти через послідовний інтерфейс, а потім ви можете інтерпретувати, перейшовши кожен байт.
Усі наведені вище приклади правильні, але, можливо, більш чітко .... Усі дані, що надсилаються через послідовний порт, надсилаються як "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.
Хоча це не ПОЛЬНИЙ опис, я сподіваюся, що це допоможе змусити вас задуматися в правильному напрямку ...
Ще один спосіб відповісти на це - констатувати, що Serial.write приймає поодинокі символи, де Serial.print приймає рядки. Можливо, є деякі відмінності, але це головна.