Нет данных на SoftwareSerial

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Marvin
Сообщения: 22
Зарегистрирован: 05 май 2012, 19:04

Нет данных на SoftwareSerial

Сообщение Marvin »

Приехал долгожданный Bluetooth Serial Module. Я взял стандартный пример SoftwareSerialExample. По BT к этому модулю подключаюсь компьютером, посредством терминальной программы Termite. После старта arduino в Termite наблюдаю строчку Hello, world?.
При вводе символов в Termite, ни чего не наблюдается в терминале Arduino IDE, кроме первоначального Goodnight moon!.
То, что пишу в терминале Arduino IDE появляется в Termite.

Если в скейтч добавить Serial.println(mySerial.available()) то постоянно наблюдаются нули.
В Termite пробовал менять варианты завершения строк:
  • ни чего не добавлять
  • добавлять CR
  • добавлять LF
  • добавлять CR/LF
Но это тоже не помогло.

Код: Выделить всё

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
  delay(200);
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Привет!

А реализация последовательного интерфейса SoftwareSerial на 9600 работает вообще? Что с чем соединено в вашей конфигурации? Из описания не очень понятно.
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Я когда-то экспериментировал с Bluetooth Bee и Arduino UNO. Только у меня модуль BT был подключен к Arduino через хардварный UART (пины D0 и D1). Каких-либо проблем с ним не было.
С уважением, Григорий
GitHub FB ВК
Marvin
Сообщения: 22
Зарегистрирован: 05 май 2012, 19:04

Re: Нет данных на SoftwareSerial

Сообщение Marvin »

Mr.Kubikus писал(а):Привет!

А реализация последовательного интерфейса SoftwareSerial на 9600 работает вообще? Что с чем соединено в вашей конфигурации? Из описания не очень понятно.
Думаю, что дело не в том, что куда подключено, но все же:
1) Компьютер видит модуль Bluetooth Serial Module как обычное BT устройство в виде COM-порта. На этом порту открыт терминал Termite.
2) Bluetooth Serial Module модуль подключён проводами а Arduino, запушено Arduino IDE, там запущен свой терминал.

Если скейтч выводит какой-то текст на Bluetooth Serial Module(например mySerial.println("Hello, world?");), то этот текст видно в терминал Termite.
Если что-то написать в терминале Termite, то это мы должны увидеть в терминале Arduino IDE, но этого не происходит, т.к. mySerial.available() всегда возвращает 0, т.е. данные туда не приходят.

Думаю, что если исключить Bluetooth Serial Module совсем, а Termite открыть тот порт, каким компьютер Arduino эффект будет тот же самый.

Объясните про 9600, разве недостаточно что бы Serial.begin(9600); и скорость в Arduino-терминале были одинаковы?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Тут я вижу два варианта:
1. BT модуль не принимает данные из терминала.
2. Библиотека SoftwareSerial не работает в вашем примере должным образом.

Попробуйте замкнуть пины RX и TX на BT модуле и проверить, возвращается ли эхо в терминал при передаче.
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Правильно ли я понял конфигурацию? См. картинку ниже:
bluetooth-bee-1a.png
bluetooth-bee-1a.png (15.78 КБ) 26482 просмотра
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Выпало немного свободного времени и я попробовал реализовать связь по представленной выше схеме.

Библиотека SoftwareSerial позволяет реализовать программный приемопередатчик UART на любых выводах контроллера в дополнение к существующему аппаратному UART, который использует пины D0 (RX) и D1(TX).
Подробное описание библиотеки на сайте Arduino - SoftwareSerial Library.

В примере использовалось следующее железо:
- Arduino UNO R2
- Arduino Wireless Proto Shield
- Модуль Bluetooth Bee

Связь тестировалась с помощью терминала Termite, который можно скачать на сайте разработчиков - http://www.compuphase.com.

Припаиваться к модулю BluetoothBee (BB) мне было влом, поэтому я использовал плату Wireless Proto Shield (WPS), но не устанавливал её на ардуину, а пробросил соединения между пинами (D0, D1) на WPS и D2, D3 на ардуине. Вот что получилось:
bluetooth-bee-4a.jpg
bluetooth-bee-4a.jpg (152.82 КБ) 26479 просмотров
Перед использованием потребовалось настроить BB в AT-режиме на скорость 9600. Для этого я использовал плату Arduino как USB-Serial преобразователь. Переключатель на модуле BB должен быть в положении АТ. Команда, которая меняет настройки скорости модуля:
AT+UART=9600,0,0

Проверить актуальные настройки можно командой:
AT+UART?

После подключения к Bluetooth Bee в диспетчере устройств появляется еще один COM-порт (СОМ3 на картинке) в дополнение к COM-порту Arduino (COM17 на рисунке).
cap-06a.png
cap-06a.png (7.34 КБ) 26479 просмотров
Программа для Arduino, которая пересылает символы между UART и SoftwareSerial:

Код: Выделить всё

/*

Схема: 
 * RX - digital pin 2 (connect to TX of other device)
 * TX - digital pin 3 (connect to RX of other device)  

 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
 // Инициализируем аппаратный UART:
  Serial.begin(57600);
  // Установим скорость для SoftwareSerial UART:
  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}
Теперь запускаем два терминала. Один на COM3, другой на COM17. Светящийся индикатор LINK на модуле BB хороший признак наличия коннекта. Для проверки шлем символы в обе стороны. Что, собственно, и требовалось получить:
cap-04.png
cap-04.png (25.85 КБ) 26479 просмотров
Если есть вопросы, пишите.
С уважением, Григорий
GitHub FB ВК
Marvin
Сообщения: 22
Зарегистрирован: 05 май 2012, 19:04

Re: Нет данных на SoftwareSerial

Сообщение Marvin »

Картинка выше нарисована Вами верно.

Замкнул RX-TX на BT модуле, открываю терминал, отправляю символы - эхо присутствует.

Убираю из схемы BT. Вместо него подключаю CP2102 (RX <-> 2 и TX <-> 3)
Открываю терминалы на Arduino и CP2102. Проблема сохраняется:
1) После рестарта Arduino в каждом терминале отображается свой текст (Goodnight moon! и Hello, world?)
2) При работе в терминалах данные передаются только от Arduino в CP2102.

Загадка в работе SoftwareSerial...
Забыл написать, используется Arduino 1280, может быть в этом дело?
Пробовал устанавливать скорость работы на 14400 для CP2102 - ошибка сохраняется.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Нет данных на SoftwareSerial

Сообщение Mr.Kubikus »

Я, кстати, забыл прикрепить исходник, который использовал для проверки:

Код: Выделить всё

/*

Схема: 
 * RX - digital pin 2 (connect to TX of other device)
 * TX - digital pin 3 (connect to RX of other device)  

 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
 // Инициализируем аппаратный UART:
  Serial.begin(57600);
  // Установим скорость для SoftwareSerial UART:
  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}
Для Arduino Mega есть такая особенность:
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Используйте другой вывод для RX.
С уважением, Григорий
GitHub FB ВК
Ответить