Arduino:Примеры/TwoPortReceive

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Получение данных по двум виртуальным портам[1]

Платы Arduino имеют встроенную поддержку для последовательной передачи данных (на 0-ом и 1-ом контактах), но что если вам нужно больше последовательных портов? Как раз для этого случая была разработана библиотека SoftwareSerial, которая позволяет организовать последовательную передачу данных через другие цифровые контакты – при помощи ПО, которое копирует функционал «намертво» запрограммированных линий RX и TX. Эта библиотека может оказаться крайне полезна, когда вам надо настроить последовательную передачу данных сразу с двумя девайсами, либо с одним, но так, чтобы один из последовательных портов был отведен под отладку.

В примере ниже цифровые контакты 2 и 4 на Arduino используются в качестве виртуальных RX-линий для последовательной передачи данных. Контакты 3 и 5 будут выступать в качестве виртуальных TX-линий. Arduino будет прослушивать один виртуальный порт (portOne), пока он не прекратит передавать данные, после чего начнет прослушивать второй виртуальный порт (portTwo).

Необходимое оборудование

  • Arduino Board;

Цепь

Для этого примера цепи строить не нужно. Только убедитесь, что Arduino подключена к компьютеру через USB, чтобы иметь возможность запустить последовательную коммуникацию.

Код

/*
Тест c передачей данных посредством Software Serial (вариация 2)

Получает данные по двум виртуальным портам, отправляет по аппаратному. 

Для «прослушки» виртуального порта вызываем функцию port.listen().
В данном примере используется два последовательных виртуальных порта,
поэтому прослушиваться они будут по очереди при помощи функции
listen(). Для подобного переключения обычно используется так
называемое «логическое время» – вроде завершения сеанса передачи
данных или когда буфер будет пуст. В этом примере порты переключаются,
когда на текущем порте считывать будет больше нечего. 

Цепь:
Нужны два девайса, поддерживающих последовательную передачу данных.
* TX первого подключен к 10-ому цифровому контакту, RX – к 11-ему
* TX второго подключен к 8-ому цифровому контакту, RX – к 9-ому

Примечание:
Не все контакты Mega и Mega 2560 поддерживают «перепрошивку»,
поэтому для RX можно использовать только эти:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 
Также не все контакты Leonardo поддерживают «перепрошивку», 
поэтому для RX можно использовать только эти: 
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 
Создан 18 апреля 2011,
модифицирован 25 мая 2012 Томом Иго (Tom Igoe),
основан на примере «twoPortRXExample» Микала Харта (Mikal Hart).
 
Этот код не защищен авторским правом.
*/

#include <SoftwareSerial.h>
// Виртуальный порт #1: TX – 10-ый цифровой контакт, RX – 11-ый цифровой контакт
SoftwareSerial portOne(10,11);

// Виртуальный порт #1: TX – 8-ой цифровой контакт, RX – 9-ый цифровой контакт.
// Если используете плату Mega, то у нее 8-ой и 9-ый контакты
// для этих целей работать не будут. Воспользуйтесь другими.
SoftwareSerial portTwo(8,9);

void setup()
{
 // Запускаем последовательную передачу данных и ждем открытия порта:
  Serial.begin(9600);
   while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для Leonardo)
  }


  // Запускаем оба виртуальных последовательных порта:
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop()
{
  // По умолчанию первым начнет прослушиваться порт,
  // который был инициализирован последним.
  // Если вам нужно начать с определенного порта, укажите его:
  portOne.listen();
  Serial.println("Data from port one:");  //  "Данные с первого порта:"
  // Пока данные идут, считываем их, а затем
  // отправляем обратно на аппаратный последовательный порт:
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  // Делаем пустую линию, чтобы разделить данные, пришедшие по разным портам:
  Serial.println();

  // Теперь прослушиваем второй порт:
  portTwo.listen();
  // Пока данные идут, считываем их, а затем
  // отправляем обратно на аппаратный последовательный порт:
  Serial.println("Data from port two:");  //  "Данные со второго порта:"
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  // Делаем пустую линию, чтобы разделить данные, пришедшие по разным портам:
  Serial.println();
}

См.также

  1. The Software Serial Library
  2. MultiSerialMega: use two of the serial ports available on the Arduino Mega.
  3. Serial Call Response: send multiple vairables using a call-and-response (handshaking) method.
  4. Serial Call Response ASCII: send multiple variables using a call-and-response (handshaking) method, and ASCII-encode the values before sending.

Внешние ссылки