Amateur Radio Station R9AL

      Последовательный порт (англ. 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-интерфейсу.



Отправка данных с платы Arduino на ПК

      Для примера, напишем скетч чтобы передавать символы таблицы 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 бит/с.

Для записи значения в порт используются три функции:

  1. Serial.write() - записывает в порт данные в двоичном виде.
  2. Serial.print() может иметь много значений, но все они служат для вывода информации в удобной для человека форме. Например, если информация, указанная как параметр для передачи, выделена кавычками - терминальная программа выведет ее без изменения. Если вы хотите вывести какое-либо значение в определенной системе исчисления, то необходимо добавить служебное слово: BIN-двоичная, OCT - восьмеричная, DEC - десятичная, HEX - шестнадцатеричная. Например, Serial.print(25,HEX).
  3. Serial.println() делает то же, что и Serial.print(), но еще переводит строку после вывода информации.
После запуска программы, в монторе порта мы увидим как последовательно выводятся символы и их числовые значения согласно таблице ASCII



Отправка данных c ПК

     Некоторые уточнения относительного того, как работает 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 будет введенный вами символ.
Программа бесконечно крутится в основном цикле. В тот момент, когда в порт записывается байт - функция Serial.available() принимает значение 1, то есть выполняется условие Serial.available() > 0. Далее функция Serial.read() вычитывает этот байт, тем самым очищая буфер. После чего при помощи уже известных вам функций происходит вывод. Использование встроенного в Arduino IDE монитора COM-порта имеет некоторые ограничения. При отправке данных из платы в COM-порт вывод можно организовать в произвольном формате. А при отправке из ПК к плате передача символов происходит в соответствии с таблицей ASCII. Это означает, что когда вы вводите, например символ "1", через COM-порт отправляется в двоичном виде "00110001" (то есть "49" в десятичном виде).

Управление устройством через COM-порт

     Командами с ПК можно управлять любыми функциями микроконтроллера. Загрузите программу, управляющую работой светодиода:

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" светодиод будет гаснуть.





Copyright © R9AL 2021 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования