Serial Monitor. Общаемся с компьютером
Для общения между платой Arduino и компьютером или другим устройством в контроллере используется интерфейс UART или USART, который в сочетании со встроенным в UNO USB-to-UART конвертером, позволит установить двунаправленую связь с компьютером через виртуальный последовательный порт. У некоторых моделей Arduino может быть несколько портов. Порт соединяется через цифровой пин 0 (RX) и 1 (TX) при подключении к компьютеру через USB, поэтому не используйте пины 0 и 1 для ввода/вывода.
Раньше на старых компьютерах были COM-порты, сейчас они создаются виртуально при помощи микросхемы FTDI, когда мы подключаем плату к компьютеру через USB.
Вам часто придётся использовать общение между устройствами для обмена информацией. Можно как посылать сигнал с компьютера, например, с клавиатуры, так и принимать сигналы с платы. Это полезно, чтобы узнать, что вообще происходит с сигналом из нужного вывода платы.
В Arduino IDE есть специальный значок с изображением лупы, который запускает Serial Monitor (монитор порта).
Для корректной работы с портом требуется выполнение двух условий: выбрать правильный COM-порт, выбрать скорость работы в скетче, которая должна совпадать со скоростью, выбранной в мониторе порта.
Для общения используется класс Serial. В методе setup() мы открываем порт для общения функцией Serial.begin() с указанием скорости в бодах (baud). Бод — это количество изменений сигнала в секунду. В нашем случае сигналы могут быть только двоичными, так что скорость в бодах соответствует скорости в битах в секунду. Можно использовать любую скорость, главное чтобы на приёмной и передающей сторонах они были одинаковыми. Доступные скорости можно посмотреть в настройках порта. Значение 9600 является стандартным и его можно не менять (9600 бод — 960 символов — один стартовый бит, восемь бит на сам символ и конечный бит). Если установить неправильную скорость, то вместо данных получим «мусор» — данные, которые нельзя обработать. Для обмена данными между другими компонентами скорость может быть и выше, например между платой и Bluetooth-модулем.
На платах Arduino Mega и Arduino Due доступны также Serial1, Serial2, Serial3.
Чтобы отправить сообщение в порт, используются методы print() (символы идут подряд) или println() (с переводом на новую строку).
Давайте выведем какое-нибудь сообщение. Это можно сделать в методе setup(), так как нам не нужно повторять одну и ту же фразу бесконечно. Метод loop() оставляем пустым.
Если посылаем строку, то обрамляем её кавычками. Если число, то кавычки не используем. Изменим функцию setup().
Можно заменить строки и числа на переменные. Перепишем пример.
Немного о числах. При работе с дробными числами, можно указать число знаков после запятой.
Работа с массивами и строками
Разберём пример отправки строк в случайном порядке. Любая строка уже является массивом символов. Поэтому вместо типа String, можно использовать массив char[]. Для примера создадим массив из четырёх имён и будем выводить их в случайном порядке через разные промежутки времени, используя функцию random().
Приём данных
Выводить данные в порт просто. А вот принимать данные с компьютера и других источников сложнее. При отправлении данных, они складываются в буфер, ожидая, когда плата их прочитает. Объём буфера составляет 64 байта. Чтобы постоянно не читать пустой буфер, есть специальная функция проверки буфера Serial.available(). Она возвращает число байт, которые лежат в буфере. Обычно в коде создают условие проверки — если в буфере больше 0 байт, то выполняем какие-то команды.
Для демонстрации создадим странный пример — создадим переменную, присвоим ей данные через Serial.read() и попросим её прислать полученные данные через Serial.print(). Получится круговорот данных или эхо.
Проверяем на числах. Отправляем число 9, а получаем 57. Если вы получаете две строки с числами 57 и 10, то в нижней части окна выберите настройку No line ending вместо Newline.
Попробуем также отправить букву. Опять вместо t возвращается 116. Ерунда какая-то. Всё просто, функция read() работает с символьными значениями и мы видим код символа из стандартной таблицы символов ASCII.
Чтобы решить проблему, нужно изменить тип данных на char.
Вроде проблема решена. Мы можем принимать отдельные цифры и буквы. Но буквы только английские, а числа только однозначные.
Если мы планируем работать только с однозначными числами, то можно написать такой код.
Решение какое-то половинчатое. А как быть с большими числами или словами?
Если отправить двузначное число 23, то ответ разбивается на части — 2 и 3. Получается, что переменная получит последнее число 3 (промежуточные значения перезаписываются). Чтобы обработать всё число, нужно использовать метод parseInt().
Теперь вы можете вводить любые числа. Но, наверное, вы заметите теперь небольшую задержку в ответах. Метод внутри себя перемалывает данные. Кстати, вы можете использовать и обычные символы. Если набор символов состоит только из букв, то вернётся 0. Если будут попадаться и цифры, то будут возвращаться цифры. Попробуйте комбинировать различные сочетания цифр и букв, чтобы понять, как будут обрабатываться данные.
Управление светодиодом с клавиатуры
Напишем пример управления встроенным светодиодом с клавиатуры. Если нажата клавиша 1, то светодиод должен загореться, при нажатии клавиши 0 выключим светодиод.
Часть кода нам уже знакома — мы используем встроенный светодиод под номером 13.
Сигнал от компьютера поступает в виде байта. Создаём новую переменную incomingByte для этих целей.
Последовательный порт включается командой begin() с указанием скорости.
Если с компьютера поступает сигнал, то функция available() вернёт количество байт, доступное для чтения. Таким образом, мы просто убеждаемся, что какой-то сигнал пришёл (больше нуля).
После первой проверки мы проверяем введённый символ, который может быть представлен и как байт. Если символ равен единице, то включаем светодиод, как мы делали раньше. Если символ равен 0, то выключаем.
Как это выглядит на практике. Заливаем скетч и запускаем Serial Monitor (Ctrl+Shift+M). В окне Serial Monitor наверху есть текстовое поле. Вводим в него числа 1 или 0 и нажимаем кнопку Send. Можно также нажать клавишу Enter для быстрого ввода.
Для общего развития в скетч добавлены также две строчки кода, определяющие код нажатой клавиши. Таким образом вы можете узнать код для клавиш 0 и 1. Вы также можете нажимать и на другие клавиши, они не повлияют на светодиод, но вы увидите коды клавиш.
Чуть более сложный пример, когда строка задана в виде массива и символы выводятся по очереди.
Функция Serial.end() закрывает последовательное соединение, порты RX и TX освобождаются и могут быть использованы для ввода/вывода.
В различных уроках вы будете принимать сигналы от платы Arduino. Это полезно, например, для отладки приложения, когда вы выводите сообщения и по ним ориентируетесь, какая часть программа работает, а какая — нет. Способность общения между Arduino и компьютером очень важна. Вы можете принимать сигналы не только в Arduino IDE, но и в других приложениях на компьютере. Например, в связке с Arduino часто используют приложение Processing, в котором рисуют графики поступаемых сигналов.
Если вы больше не нуждаетесь в получении данных, то закрывайте окно Serial Monitor.
Также существует библиотека SoftwareSerial. Она позволяет осуществить последовательную передачу данных через другие цифровые контакты Arduino.
Другие варианты
Чтение данных из последовательного порта возможно другими способами. Ищите расширения, например, Arduino Chrome Serial Monitor. На видео можно посмотреть, как создать расширение самостоятельно.
На C# также можно написать приложение, которое будет уметь считывать данные.
Processing также умеет работать с последовательным портом.
Дополнительное чтение
ASCIITable — распечатываем таблицу символов ASCII в разных форматах
Serial.print()
Description
Prints data to the serial port as human-readable ASCII text. This command can take many forms. Numbers are printed using an ASCII character for each digit. Floats are similarly printed as ASCII digits, defaulting to two decimal places. Bytes are sent as a single character. Characters and strings are sent as is. For example-
Serial.print(1.23456) gives «1.23»
Serial.print(«Hello world.») gives «Hello world.»
An optional second parameter specifies the base (format) to use; permitted values are BIN(binary, or base 2) , OCT(octal, or base 8) , DEC(decimal, or base 10) , HEX(hexadecimal, or base 16) . For floating point numbers, this parameter specifies the number of decimal places to use. For example-
Serial.print(78, BIN) gives «1001110»
Serial.print(78, OCT) gives «116»
Serial.print(78, DEC) gives «78»
Serial.print(78, HEX) gives «4E»
Serial.print(1.23456, 0) gives «1»
Serial.print(1.23456, 2) gives «1.23»
Serial.print(1.23456, 4) gives «1.2346»
You can pass flash-memory based strings to Serial.print() by wrapping them with F(). For example:
To send data without conversion to its representation as characters, use Serial.write().
Syntax
Serial.print(val)
Serial.print(val, format)
Parameters
Serial : serial port object. See the list of available serial ports for each board on the Serial main page.
val : the value to print. Allowed data types: any data type.
Returns
print() returns the number of bytes written, though reading that number is optional. Data type: size_t .
Serial.print()
Description
Prints data to the serial port as human-readable ASCII text. This command can take many forms. Numbers are printed using an ASCII character for each digit. Floats are similarly printed as ASCII digits, defaulting to two decimal places. Bytes are sent as a single character. Characters and strings are sent as is. For example-
Serial.print(78) gives «78»
Serial.print(1.23456) gives «1.23»
Serial.print(‘N’) gives «N»
`Serial.print(«Hello world.») gives «Hello world.» `
An optional second parameter specifies the base (format) to use; permitted values are BIN(binary, or base 2) , OCT(octal, or base 8) , DEC(decimal, or base 10) , HEX(hexadecimal, or base 16) . For floating point numbers, this parameter specifies the number of decimal places to use. For example-
Serial.print(78, BIN) gives «1001110»
Serial.print(78, OCT) gives «116»
Serial.print(78, DEC) gives «78»
Serial.print(78, HEX) gives «4E»
Serial.println(1.23456, 0) gives «1»
Serial.println(1.23456, 2) gives «1.23»
Serial.println(1.23456, 4) gives «1.2346»
You can pass flash-memory based strings to Serial.print() by wrapping them with F(). For example:
To send a single byte, use Serial.write().
Syntax
Serial.print(val)
Serial.print(val, format)
Parameters
val : the value to print — any data type
Returns
size_t : print() returns the number of bytes written, though reading that number is optional.
Serial.print()
Description
Prints data to the serial port as human-readable ASCII text. This command can take many forms. Numbers are printed using an ASCII character for each digit. Floats are similarly printed as ASCII digits, defaulting to two decimal places. Bytes are sent as a single character. Characters and strings are sent as is. For example-
Serial.print(78) gives «78»
Serial.print(1.23456) gives «1.23»
Serial.print(‘N’) gives «N»
Serial.print(«Hello world.») gives «Hello world.»
An optional second parameter specifies the base (format) to use; permitted values are BIN(binary, or base 2) , OCT(octal, or base 8) , DEC(decimal, or base 10) , HEX(hexadecimal, or base 16) . For floating point numbers, this parameter specifies the number of decimal places to use. For example-
Serial.print(78, BIN) gives «1001110»
Serial.print(78, OCT) gives «116»
Serial.print(78, DEC) gives «78»
Serial.print(78, HEX) gives «4E»
Serial.print(1.23456, 0) gives «1»
Serial.print(1.23456, 2) gives «1.23»
Serial.print(1.23456, 4) gives «1.2346»
You can pass flash-memory based strings to Serial.print() by wrapping them with F(). For example:
To send data without conversion to its representation as characters, use Serial.write().
Syntax
Serial.print(val)
Serial.print(val, format)
Parameters
Serial : serial port object. See the list of available serial ports for each board on the Serial main page.
val : the value to print — any data type
Returns
size_t : print() returns the number of bytes written, though reading that number is optional.
Arduino Serial.print ( )
The serial.print ( ) in Arduino prints the data to the serial port. The printed data is stored in the ASCII (American Standard Code for Information Interchange) format, which is a human-readable text.
Each digit of a number is printed using the ASCII characters.
The printed data will be visible in the serial monitor, which is present on the right corner on the toolbar.
The Serial.print( ) is declared in two formats, which are shown below:
Note: In Serial.print( ), S must be written in uppercase.
serial: It signifies the serial port object.
print: The print ( ) returns the specified number of bytes written.
value: It signifies the value to print, which includes any data type value.
format: It consists of number base, such as OCT (Octal), BIN (Binary), HEX (Hexadecimal), etc. for the integral data types. It also specifies the number of decimal places.
Serial.print( value )
The serial.print ( ) accepts the number using the ASCII character per digit and value upto two decimal places for floating point numbers.
Example 1:
Output:
It sends bytes to the printer as a single character. In Arduino, the strings and characters using the Serial.print( ) are sent as it is.
Example 2:
Output:
Serial.print( value, format )
It specifies the base format and gives the output according to the specified format. It includes the formats Octal -OCT (base 8), Binary-BIN (base 2), Decimal-DEC (base 10), and Hexadecimal-HEX (base 16).
Let’s understand by few examples.
Example 1:
Output:
It converts the decimal number 25 to binary number 11001.
Example 2:
Output:
It converts the decimal number 58 to hexadecimal number 3A.
Example 3:
It converts the decimal number 58 to octal number 72.
Example 4:
Output:
The conversion is from decimal to decimal. So, the output will be the same.
Flash Memory based strings
If we want to pass the flash memory in Serial.print ( ) based on string, we need to wrap the function statement with F.
Serial.print( F ( «Hello Arduino») ).
Printing a Tab space
We can also print the tab in the output.
Let’s consider the code below:
Here, Serial.print(» \ t ») is used to print the tab in the output program.
Serial.println ( )
The Serial.println ( ) means print line, which sends the string followed by the carriage return (‘\r’ or ASCII 13) and newline (‘\n’ or ASCII 10) characters. It has a similar effect as pressing the Enter or Return key on the keyboard when typing with the Text Editor.
The Serial.println( ) is also declared in two formats, which are shown below:
- println( value )
- println( value, format)
What is the difference between Serial.print( ) and Serial.println( )?
The text written inside the open and closed parentheses in the Serial.println( ) moves in a new line. With the help of Serial.print( ) and Serial.println( ), we can figure the order and execution of certain things in our code.
Let’s understand with an example:
Consider the below code.
Click on the Upload button-> Serial monitor for the output.
In the output, the word Hello will appear followed by the word Arduino 1 second later. After 1.5 second, another line will be printed.
Output
Arduino Mega
The Arduino Mega board (type of Arduino board) has four serial ports. While programming the Mega, we need to declare all the four serial ports. The baud rates of all the four serial ports should be different.
It is shown below:
Feedback
Help Others, Please Share
Learn Latest Tutorials
Python Design Patterns
Preparation
Trending Technologies
B.Tech / MCA
Javatpoint Services
JavaTpoint offers too many high quality services. Mail us on [email protected], to get more information about given services.
- Website Designing
- Website Development
- Java Development
- PHP Development
- WordPress
- Graphic Designing
- Logo
- Digital Marketing
- On Page and Off Page SEO
- PPC
- Content Development
- Corporate Training
- Classroom and Online Training
- Data Entry
Training For College Campus
JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected]
Duration: 1 week to 2 week