В чем разница между Serial.write и Serial.print? И когда они используются?
В чем разница между Serial.write и Serial.print? И когда они используются?
Оба они использовались для печати на последовательном мониторе, в чем их фактические различия?
@shadab, 👍47
5 ответов
С сайта Arduino для последовательной записи и последовательной печати:
Serial.write()
Записывает двоичные данные в последовательный порт. Эти данные отправляются в виде байта или серии байтов; для отправки символов, представляющих цифры числа, вместо этого используйте функцию print ().
Serial.print()
Выводит данные на последовательный порт в виде удобочитаемого текста ASCII. Эта команда может принимать различные формы. Числа печатаются с использованием символа ASCII для каждой цифры. Плавающие точки аналогично печатаются в виде цифр ASCII, по умолчанию с двумя знаками после запятой. Байты отправляются в виде одного символа. Символы и строки отправляются как есть
Serial.write
отправляет байты в последовательный порт, в то время как Serial.print
отправляет символы ASCII, чтобы люди могли легко читать.
Некоторые устройства работают с байтами для настройки конфигураций, обычно используют пакеты данных, и для связи с ними необходимо использовать функцию записи. В конце концов они будут отправлять байты через последовательный интерфейс, а затем вы сможете интерпретировать каждый байт.
Еще один способ ответить на этот вопрос-указать, что Serial.write принимает одиночные символы, в то время как Serial.print принимает строки. Могут быть некоторые различия, но это главное.
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");
ПОСЛЕДОВАТЕЛЬНЫЙ ВЫХОД :
Все приведенные выше примеры верны, но, возможно, более ясны.... Все данные, отправленные через последовательный порт, отправляются как 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.
Хотя это не ПОЛНОЕ описание, я надеюсь, что оно поможет вам направить ваши мысли в правильном направлении...
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
- Использовать все контакты как цифровые входы/выходы
Как насчет
Serial.write(StringData.c_str());
? если StringData определяется как строка., @jstuardoПожалуйста, покажите, как StringData определяется как строка., @linhartr22