В этой статье я расскажу о канале связи с Arduino - COM порте. Если вы не знакомы с программной частью Arduino, то можете почитать статьи на моём канале, в них я рассказывал о подключении, программировании, переменных и ещё много о чём, что может понадобится новичку.
COM-порт
COM-порт (communications port) — это аппаратный интерфейс для последовательной передачи данных между компьютером и внешними устройствами. Также его называют последовательным портом.(Ответ Aлисы AI)
Своими словами могу сказать, что это окно, через которую мы на ПК получаем ответ от Arduino, например: мы хотим, чтобы обратно нам выводилась какая-то надпись или значение, Arduino будет возвращать и показывать нам его в COM-порте.
На моём канале уже есть статья, где я, для проверки работоспособности платы, просил открыть монитор порта, но не рассказывал что это.
Работа с COM-портом
Для работы с COM-портом существует встроенная библиотека, которая имеет объект Serial, который мы вызываем в блоке setup, чтобы порт открылся один раз при запуске Arduino. К нему мы применяем метод begin(), который устанавливает скорость связи с Arduino, которая измеряется в бодах.
Бод — это скорость изменения состояния сигнала в канале связи, измеряемая в количестве изменений (переходов) в секунду. Единица названа в честь французского инженера Эмиля Бодо, изобретателя телеграфного кода.
ё набор скоростей можно посмотреть, открыв порт
Для корректной работы, необходимо в методе begin(*), вместо * указывать такое же число бод, что и в порте.
Чтобы отправить что-то в порт используется метод print(), который пишется также через точку, как и begin()
При выводе в консоль, используя метод print() строки будут склеиваться в одну, чтобы такого не было и строки переводились автоматически на следующую, используется метод println()
Числа и переменные для вывода пишутся без скобок
Для вывода числа с плавающей точкой до определённого числа после запятой, также используется метод print("переменная", "порядок").
Так же можно выводить числа в разных системах счисления print("переменная", "базис")
Принятие данных от Arduino
При отправке данных, они складываются в буфер, объём которого 64 байта, и ждут пока их прочитают.
Для проверки буфера на наличие данных, существует команда Serial.available(); - она возвращает количество байт в буфере.
Например: используя if(Serial.available() > 0){}, то мы получим блок кода, который будет выполняться только когда в буфере что-то есть.
Serial.read() - метод, который читает, что было отправлено в порт и записывает в переменную.
Если поменять тип int на тип char, можно будет выводить символы, но только символы, выполнять математические операции нельзя.
Для перевода в целочисленный формат необходимо от Serial.read() отнять 0 в одиночных кавычках:
Этот метод подойдёт только для цифр 0 - 9, для двузначных чисел он не будет работать. Дело в том, что согласно таблице символов ASCII код нуля - 48, соответственно 1 - 49, 2 - 50 и т.д. Конструкция: Serial.read() - '0', здесь берётся разность не самих чисел, а их кодов, которая будет совпадать с вводимым числом.
Числа больше 9, будут разбиваться на отдельные и переменная будет перезаписываться, например: число 12345, переменная сначала будет равна 1, потом 2, 3 и т.д. до 5.
Для того, чтобы принять всё число целиком, есть метод Serial.parseInt()
Этот метод имеет некоторые ограничения:
- Не читает отрицательные числа по умолчанию: По умолчанию parseInt() читает только положительные числа. Чтобы читать отрицательные, нужно явно разрешить: Serial.parseInt(); // читает только положительные, если написать в порт отрицательное число, то ничего не выведет Serial.parseInt(SKIP_ALL); // читает и отрицательные, будет выводить отрицательные числа.
- Останавливается на первом НЕ-цифровом символе: Символы, которые прерывают чтение: пробел ' ', перевод строки \n, запятая ',', любой другой НЕ-цифровой символ. Пример: Отправляем: "123abc456" parseInt() вернёт: 123 (остановился на 'a')
- Игнорирует ведущие НЕ-цифровые символы: Если перед числом идут буквы или другие символы — они игнорируются. Пример: Отправляем: "abc123", parseInt() вернёт: 123 (буквы пропущены)
- Не читает числа с плавающей точкой: parseInt() читает только целые числа. Для дробных чисел используйте Serial.parseFloat() Пример: Отправляем: "3.14", parseInt() вернёт: 3, parseFloat() вернёт: 3.14
- Читает только первый попавшийся номер: Если в буфере несколько чисел — прочитает только первое. Пример: Буфер: "10 20 30", parseInt() вернёт: 10 (второе и третье останутся в буфере)
Также время возврата числа увеличивается - это плата за удобство.
Метода Serial.flush() - очищает буфер.
Материалы для этой статьи взяты из видеокурса "Заметки Ардуинщика". Ссылка на урок.
Если остались вопросы, то пиши в комментарии!
Успехов!
#arduino #начинающий #урок #COM-порт