Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/TwoPortReceive

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

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

  • Arduino Board;

Цепь

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

Arduino bb.png

Код

  1. /*
  2. Тест c передачей данных посредством Software Serial (вариация 2)
  3.  
  4. Получает данные по двум виртуальным портам, отправляет по аппаратному.
  5.  
  6. Для «прослушки» виртуального порта вызываем функцию port.listen().
  7. В данном примере используется два последовательных виртуальных порта,
  8. поэтому прослушиваться они будут по очереди при помощи функции
  9. listen(). Для подобного переключения обычно используется так
  10. называемое «логическое время» – вроде завершения сеанса передачи
  11. данных или когда буфер будет пуст. В этом примере порты переключаются,
  12. когда на текущем порте считывать будет больше нечего.
  13.  
  14. Цепь:
  15. Нужны два девайса, поддерживающих последовательную передачу данных.
  16. * TX первого подключен к 10-ому цифровому контакту, RX – к 11-ему
  17. * TX второго подключен к 8-ому цифровому контакту, RX – к 9-ому
  18.  
  19. Примечание:
  20. Не все контакты Mega и Mega 2560 поддерживают «перепрошивку»,
  21. поэтому для RX можно использовать только эти:
  22. 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
  23.  
  24. Также не все контакты Leonardo поддерживают «перепрошивку»,
  25. поэтому для RX можно использовать только эти:
  26. 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
  27.  
  28. Создан 18 апреля 2011,
  29. модифицирован 25 мая 2012 Томом Иго (Tom Igoe),
  30. основан на примере «twoPortRXExample» Микала Харта (Mikal Hart).
  31.  
  32. Этот код не защищен авторским правом.
  33. */
  34.  
  35. #include <SoftwareSerial.h>
  36. // Виртуальный порт #1: TX – 10-ый цифровой контакт, RX – 11-ый цифровой контакт
  37. SoftwareSerial portOne(10,11);
  38.  
  39. // Виртуальный порт #1: TX – 8-ой цифровой контакт, RX – 9-ый цифровой контакт.
  40. // Если используете плату Mega, то у нее 8-ой и 9-ый контакты
  41. // для этих целей работать не будут. Воспользуйтесь другими.
  42. SoftwareSerial portTwo(8,9);
  43.  
  44. void setup()
  45. {
  46.  // Запускаем последовательную передачу данных и ждем открытия порта:
  47.   Serial.begin(9600);
  48.    while (!Serial) {
  49.     ; // ждем подключения последовательного порта (нужно только для Leonardo)
  50.   }
  51.  
  52.  
  53.   // Запускаем оба виртуальных последовательных порта:
  54.   portOne.begin(9600);
  55.   portTwo.begin(9600);
  56. }
  57.  
  58. void loop()
  59. {
  60.   // По умолчанию первым начнет прослушиваться порт,
  61.   // который был инициализирован последним.
  62.   // Если вам нужно начать с определенного порта, укажите его:
  63.   portOne.listen();
  64.   Serial.println("Data from port one:");  //  "Данные с первого порта:"
  65.   // Пока данные идут, считываем их, а затем
  66.   // отправляем обратно на аппаратный последовательный порт:
  67.   while (portOne.available() > 0) {
  68.     char inByte = portOne.read();
  69.     Serial.write(inByte);
  70.   }
  71.  
  72.   // Делаем пустую линию, чтобы разделить данные, пришедшие по разным портам:
  73.   Serial.println();
  74.  
  75.   // Теперь прослушиваем второй порт:
  76.   portTwo.listen();
  77.   // Пока данные идут, считываем их, а затем
  78.   // отправляем обратно на аппаратный последовательный порт:
  79.   Serial.println("Data from port two:");  //  "Данные со второго порта:"
  80.   while (portTwo.available() > 0) {
  81.     char inByte = portTwo.read();
  82.     Serial.write(inByte);
  83.   }
  84.  
  85.   // Делаем пустую линию, чтобы разделить данные, пришедшие по разным портам:
  86.   Serial.println();
  87. }

См.также

  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.

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

  1. Arduino - Two Port Receive