Найти в Дзене
informatics_for_everyone

Задачи C++ (монитор порта)

Введение Выводим сообщение через метод setup(), так как нам пока не нужно повторять одну и ту же фразу бесконечно - метод loop() оставляем пустым. ВАЖНО! Если отправляем строку, то обрамляем её кавычками. Если число, то кавычки не используем. Изменим функцию setup(). Можно заменить строки и числа на переменные. Перепишем пример: При работе с дробными числами, можно указать число знаков после запятой: Работа с массивами и строками Пример отправки строк в случайном порядке (random). Любая строка уже является массивом символов. Поэтому вместо типа String, можно использовать массив char[]. Для примера создадим массив из четырёх имён и будем выводить их в случайном порядке через разные промежутки времени, используя функцию random() Результат: Приём данных Очень сложно принимать данные с компьютера и других источников. При отправлении данных, они складываются в буфер, ожидая, когда плата их прочитает. Объём буфера составляет 64 байта. Чтобы постоянно не читать пустой буфер, есть специал
Оглавление

Введение

Выводим сообщение через метод setup(), так как нам пока не нужно повторять одну и ту же фразу бесконечно - метод loop() оставляем пустым.

ВАЖНО!

Если отправляем строку, то обрамляем её кавычками.

Если число, то кавычки не используем. Изменим функцию setup().

-2

Можно заменить строки и числа на переменные. Перепишем пример:

-3

При работе с дробными числами, можно указать число знаков после запятой:

-4

Работа с массивами и строками

Пример отправки строк в случайном порядке (random). Любая строка уже является массивом символов. Поэтому вместо типа String, можно использовать массив char[]. Для примера создадим массив из четырёх имён и будем выводить их в случайном порядке через разные промежутки времени, используя функцию random()

-5

Результат:

-6

Приём данных

Очень сложно принимать данные с компьютера и других источников. При отправлении данных, они складываются в буфер, ожидая, когда плата их прочитает. Объём буфера составляет 64 байта. Чтобы постоянно не читать пустой буфер, есть специальная функция проверки буфера Serial.available(). Она возвращает число байт, которые лежат в буфере. Обычно в коде создают условие проверки - если в буфере больше 0 байт, то выполняем какие-то команды.

Пример - создадим переменную, присвоим ей данные через Serial.read() и попросим её прислать полученные данные через Serial.print(). Получится круговорот данных или эхо.

-7

Проверяем на числах. Отправляем число 9, а получаем 57. Если получаете две строки с числами 57 и 10, то в нижней части окна выберите настройку No line ending вместо Newline.

Попробуем также отправить букву. Опять вместо t возвращается 116, но это не ошибка!!! Просто функция read() работает с символьными значениями и мы видим код символа из стандартной таблицы символов ASCII.

Чтобы решить проблему, нужно изменить тип данных на char.

-8

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

Если мы планируем работать только с однозначными числами, то можно написать такой код:

-9

Как быть с большими числами или словами?

Если отправить двузначное число 23, то ответ разбивается на части - 2 и 3. Получается, что переменная получит последнее число 3 (промежуточные значения перезаписываются). Чтобы обработать всё число, нужно использовать метод parseInt().

-10

Теперь можно вводить любые числа. Но теперь небольшая задержка в ответах. Метод внутри себя обрабатывает данные. Если набор символов состоит только из букв, то вернётся 0. Если будут попадаться и цифры, то будут возвращаться цифры. Попробуйте комбинировать различные сочетания цифр и букв, чтобы понять, как будут обрабатываться данные.

Управление светодиодом с клавиатуры

Пример управления встроенным светодиодом с клавиатуры. Если нажата клавиша 1, то светодиод должен загореться, при нажатии клавиши 0 выключим светодиод:

-11

Часть кода знакома - мы используем встроенный светодиод под номером 13.

Сигнал от компьютера поступает в виде байта. Создаём новую переменную incomingByte для этих целей.

Последовательный порт включается командой begin() с указанием скорости.

Если с компьютера поступает сигнал, то функция available() вернёт количество байт, доступное для чтения. Таким образом, мы просто убеждаемся, что какой-то сигнал пришёл (больше нуля).

После первой проверки мы проверяем введённый символ, который может быть представлен и как байт. Если символ равен единице, то включаем светодиод, как мы делали раньше. Если символ равен 0, то выключаем.

Как это выглядит на практике. Заливаем скетч и запускаем Serial Monitor (Ctrl+Shift+M). В окне Serial Monitor наверху есть текстовое поле. Вводим в него числа 1 или 0 и нажимаем кнопку Send. Можно также нажать клавишу Enter для быстрого ввода.

Для общего развития в скетч добавлены также две строчки кода, определяющие код нажатой клавиши. Таким образом вы можете узнать код для клавиш 0 и 1. Вы также можете нажимать и на другие клавиши, они не повлияют на светодиод, но вы увидите коды клавиш.

Пример, когда строка задана в виде массива и символы выводятся по очереди:

-12

Функция Serial.end() закрывает последовательное соединение, порты RX и TX освобождаются и могут быть использованы для ввода/вывода.

Существует библиотека SoftwareSerial. Она позволяет осуществить последовательную передачу данных через другие цифровые контакты Arduino.