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

26

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

shadab
источник
Отличное объяснение bpinhosilva! Вы помогли мне понять кое-что, с чем я боролся очень ясно сейчас.
Рори

Ответы:

19

С сайта Arduino для Serial.write и Serial.print :

Serial.write ()

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

Serial.print ()

Печатает данные на последовательный порт в виде удобочитаемого текста ASCII.

LoganBlades
источник
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, чтобы люди могли легко читать.

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

bpinhosilva
источник
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)or Serial.print("217")будут печатать одно и то же: 00110010 00110001 00110111. Это связано с тем, что команда печати сначала преобразует любое число в строковое представление, а затем использует команду Serial.write()для отправки каждого символа в виде отдельных битов ASCII.

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

Jerimiah
источник
3

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

linhartr22
источник