В чем разница между Serial.write и Serial.print? И когда они используются?

В чем разница между Serial.write и Serial.print? И когда они используются?
Оба они использовались для печати на последовательном мониторе, в чем их фактические различия?

, 👍45


5 ответов


24

С сайта Arduino для последовательной записи и последовательной печати:

Serial.write()

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

Serial.print()

Выводит данные на последовательный порт в виде удобочитаемого текста ASCII. Эта команда может принимать различные формы. Числа печатаются с использованием символа ASCII для каждой цифры. Плавающие точки аналогично печатаются в виде цифр ASCII, по умолчанию с двумя знаками после запятой. Байты отправляются в виде одного символа. Символы и строки отправляются как есть

,

7

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

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

,

3

Еще один способ ответить на этот вопрос-указать, что Serial.write принимает одиночные символы, в то время как Serial.print принимает строки. Могут быть некоторые различия, но это главное.

,

Как насчет Serial.write(StringData.c_str());? если StringData определяется как строка., @jstuardo

Пожалуйста, покажите, как StringData определяется как строка., @linhartr22


36

Serial.write более приземлен , он прост и быстр, он предназначен для работы в двоичном формате, по одному байту за раз. пример:

Serial.write(0x45);   // запишет 0100 0101 в кабель

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

Все приведенные выше примеры верны, но, возможно, более ясны.... Все данные, отправленные через последовательный порт, отправляются как 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.

Хотя это не ПОЛНОЕ описание, я надеюсь, что оно поможет вам направить ваши мысли в правильном направлении...

,