В чем разница между Serial.write и Serial.print? И когда они используются?
26
В чем разница между Serial.write и Serial.print? И когда они используются?
Оба были использованы для печати на последовательном мониторе, каковы их фактические различия?
Записывает двоичные данные в последовательный порт. Эти данные отправляются в виде байта или серии байтов; чтобы отправить символы, представляющие цифры номера, используйте вместо этого функцию print ().
Serial.print ()
Печатает данные на последовательный порт в виде удобочитаемого текста ASCII.
Serial.write более приземленный, он простой и быстрый, он сделан для того, чтобы говорить двоично, по одному байту за раз. пример:
Serial.write(0x45); // will write 0100 0101 to the cable
Serial.print, с другой стороны, более универсален, он будет выполнять преобразование для вас из ASCII в двоичный файл, он также может конвертировать в BIN / HEX / OCT / DEC, но вам нужно указать второй аргумент, например, так
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.print(). Команды Serial.print(217)or Serial.print("217")будут печатать одно и то же: 00110010 00110001 00110111. Это связано с тем, что команда печати сначала преобразует любое число в строковое представление, а затем использует команду Serial.write()для отправки каждого символа в виде отдельных битов ASCII.
Хотя это не ПОЛНОЕ описание, я надеюсь, что это поможет вам думать в правильном направлении ...
Еще один способ ответить на это - указать, что Serial.write принимает отдельные символы, а Serial.print принимает строки. Там могут быть некоторые различия, но это главное.
Ответы:
С сайта Arduino для Serial.write и Serial.print :
Serial.write ()
Serial.print ()
источник
Serial.write более приземленный, он простой и быстрый, он сделан для того, чтобы говорить двоично, по одному байту за раз. пример:
Serial.print, с другой стороны, более универсален, он будет выполнять преобразование для вас из ASCII в двоичный файл, он также может конвертировать в BIN / HEX / OCT / DEC, но вам нужно указать второй аргумент, например, так
больше примеров с визуальным последовательным выводом:
Код:
СЕРИЙНЫЙ ВЫХОД:
Код:
СЕРИЙНЫЙ ВЫХОД:
Serial.println () с другой стороны добавит конец строки 2 байта 0x0D и 0x0A, как вы можете видеть в кадре
Код:
СЕРИЙНЫЙ ВЫХОД:
источник
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 и затем отправляется в виде байта для каждого символа. Вы бы получили точно такой же вывод, если бы использовали следующее:
(00110010 00110001 00110111)
Теперь давайте посмотрим на
Serial.print()
. КомандыSerial.print(217)
orSerial.print("217")
будут печатать одно и то же: 00110010 00110001 00110111. Это связано с тем, что команда печати сначала преобразует любое число в строковое представление, а затем использует командуSerial.write()
для отправки каждого символа в виде отдельных битов ASCII.Хотя это не ПОЛНОЕ описание, я надеюсь, что это поможет вам думать в правильном направлении ...
источник
Еще один способ ответить на это - указать, что Serial.write принимает отдельные символы, а Serial.print принимает строки. Там могут быть некоторые различия, но это главное.
источник