Последовательный порт (англ. serial port, COM-порт, англ. communications
port) - сленговое название интерфейса стандарта RS-232, которым массово
оснащались персональные компьютеры. Порт называется "последовательным", так как
информация через него передаётся по одному биту, последовательно бит за битом
(в отличие от параллельного порта).
Несмотря на то, что некоторые интерфейсы компьютера (например, Ethernet,
FireWire и USB) тоже используют последовательный способ обмена информацией,
название "последовательный порт" закрепилось за портом стандарта RS-232.
Наиболее часто используются D-образные разъёмы: 9-ти и 25-ти контактные,
(DB-9 и DB-25 соответственно). Максимальная скорость передачи обычно
составляет 115200 бит/с.
Стандарт на него был разработан в 1969 году.
Назначение линий разъема Serial port DB-9 согласно RS-232 и их соответствие контактам разъема DB-25:
Контакт DB-9 | Английское название | Русское название | Контакт DB-25 |
1 | Data Carrier Detect | Несущая обнаружена | 8 |
2 | Transmit Data | Передаваемые данные | 2 |
3 | Receive Data | Принимаемые данные | 3 |
4 | Data Terminal Ready | Готовность терминала | 20 |
5 | Ground | Земля | 7 |
6 | Data Set Ready | Готовность передающего устройства | 6 |
7 | Request To Send | Запрос на отправку данных | 4 |
8 | Clear To Send | Передача данных разрешена | 5 |
9 | Ring Indicator | Индикатор звонка | 22 |
RS-232 - это стандарт физического уровня для асинхронного интерфейса (UART)
UART - (англ. Universal Asynchronous Receiver-Transmitter) - это
универсальный асинхронный приёмопередатчик - узел вычислительных
устройств, предназначенный для организации связи с другими цифровыми
устройствами. Преобразует передаваемые данные в последовательный вид так,
чтобы было возможно передать их по одной физической цифровой линии другому
аналогичному устройству. Фактически, для организации UART достаточно
всего двух линий RX (принимаемые данные) и TX (передаваемые данные).
Логическая схема UART имеет входы-выходы с логическими уровнями,
соответствующими полупроводниковой технологии схемы (например, уже
известная нам TTL, когда логический ноль - это 0 вольт,
а логическая 1 - это 5 вольт). Такой физический уровень может быть использован
в пределах одного устройства, однако непригоден для коммутируемых длинных
соединений по причине низкой защищённости от электрического разрушения и помех.
Для таких случаев были разработаны специальные физические уровни, такие, как
RS-232.
В микроконтроллере, на котором собрана плата Arduino, уже встроен UART
(Контакт D0 (RX) - используется для получения данных,
а контакт D1 (TX) - для их отправки.
Но подключить микроконтроллер к компьютеру сразу - не получится, необходимо
преоразовать сигналы UART - в уровни RS-232, для подключения к COM-порту
компьютера (первые платы Arduino подключались именно к COM-порту, для этого
на плату Arduino устанавливалась специальная микросхема типа MAX232, которая
позволяла преобразовать сигналы UART в стандарт RS-232).
Со временем, COM-порт был вытеснен более современным устройством -
последовательным интерфейсом USB,
и теперь сигналы UART микроконтроллера преобразуются в формат USB-интерфейса, и
для этого на плате Arduino устанавливается микросхема типа FT232 (CH340),
которая позволяет связать физический UART контроллера с виртуальным
COM-портом компьютера по USB-интерфейсу.
Для примера, напишем скетч чтобы передавать символы таблицы ASCII в компьютер. На компьютере мы будем принимать данные в монитор порта (см. Урок 3 "Монитор порта"). Здесь и дале нам потребуется только плата Arduino. Рассмотрим простой скетч:
int symbol = 32; // переменая, в которой хранится код символа void setup() { Serial.begin(9600); // Открываем порт со скоростью 9600 бит/с Serial.println("Таблица ASCII"); // Выводим надпись "Таблица ASCII" } void loop() { Serial.write(symbol); // записываем в порт данные в двоичном виде Serial.print(" "); // печатаем пробел после вывода символа Serial.println(symbol); // печатаем десятичное значение переменной simbol if(symbol == 126) { // проверяем, если перменная simbol равна 126 while(true) { // то больше ничего не делаем continue; // иначе продолжаем выполнять программу } } symbol++; // увеличиваем значение перменной simbol на 1 }
Переменная symbol хранит код символа, а так как таблица начинается со
значения 32 (пробел) и заканчивается значением 126, то изначально переменной
symbol присваивается значение 32.
Для запуска работы порта UART служит функция Serial.begin(). Единственный ее
параметр - это скорость. О скорости необходимо договариваться на передающей и
приемной стороне заранее, так как протокол передачи асинхронный.
В рассматриваемом примере скорость 9600 бит/с.
Для записи значения в порт используются три функции:
Некоторые уточнения относительного того, как работает COM-порт. В первую очередь весь обмен происходит через буфер памяти. То есть когда вы отправляете что-то с ПК устройству, данные помещаются в некоторый специальный раздел памяти. Как только устройство готово - оно вычитывает данные из буфера. Проверить состояние буфера позволяет функция Serial.avaliable(). Эта функция возвращает количество байт в буфере. Чтобы вычитать эти байты необходимо воспользоваться функцией Serial.read(). Рассмотрим работу этих функций на примере:
int val = 0; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { val = Serial.read(); Serial.print("I received: "); Serial.write(val); Serial.println(); } }После того, как код будет загружен в память микроконтроллера, откройте монитор COM-порта. Введите один символ и нажмите Enter. В поле полученных данных вы увидите: "I received: X", где вместо X будет введенный вами символ.
Командами с ПК можно управлять любыми функциями микроконтроллера. Загрузите программу, управляющую работой светодиода:
int val = 0; void setup() { Serial.begin(9600); pinMode (13, OUTPUT); } void loop() { if (Serial.available() > 0) { val = Serial.read(); if (val=='H') digitalWrite(13,HIGH); if (val=='L') digitalWrite(13,LOW); } }При отправке в COM-порт символа "H" происходит зажигание светодиода на 13-ом выводе, а при отправке "L" светодиод будет гаснуть.