Как использовать несколько серийных номеров программного обеспечения в библиотеках в Arduino?

В настоящее время я работаю над проектом, в котором подключаю модуль GPS, цифровой компас и ZigBee (< модем href="http://en.wikipedia.org/wiki/XBee" rel="nofollow">XBee) к Arduino. Кстати, для этого проекта я использую Eclipse IDE, поэтому я я разбил свой код на несколько библиотек.

В настоящее время XBee использует аппаратный UART и работает нормально. Модуль GPS и цифровой компас используют серийный номер программного обеспечения.

Моя проблема в том, что если я создам оба серийных номера программного обеспечения, будет работать только последний.

Ниже мой пример кода.

void CSensor::initSensors()
{
    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);

    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);
}

gpsSerial объявляется как элемент указателя класса CSensor. -> SoftwareSerial* gpsSerial; compassSerial также объявляется одинаковым -> SoftwareSerial* compassSerial;

В приведенном выше примере кода будет работать только цифровой компас, GPS не будет работать. Но если я поменяю местами код так, что он будет выглядеть так:

void CSensor::initSensors()
{
    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);

    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);
}

Теперь GPS будет работать, а цифровой компас — нет. Я предполагаю, что у Software Serial есть проблема. Каково решение?


person Loren    schedule 14.06.2012    source источник


Ответы (5)


Один вопрос: вы рассматривали возможность использования Arduino Mega для своего проекта? С этой платой вы получаете 4 (настоящих) аппаратных UART, которых должно быть достаточно для ваших целей.

Использование библиотеки «ПО серийный номер» слишком сложно. В некоторых случаях он может работать нормально, но имеет важные ограничения по сравнению с обычным последовательным портом и с большой долей вероятности может спровоцировать потерю данных.

Когда дело доходит до управления несколькими последовательными устройствами, я бы не рекомендовал вам тратить больше времени на «последовательные эмуляции». Просто возьмите микроконтроллер получше, и все.

person Community    schedule 16.11.2012

Согласно документации Arduino:

Библиотека имеет следующие известные ограничения:

При использовании нескольких программных последовательных портов только один из них может получать данные одновременно.

Таким образом, похоже, вам придется добавить код для переключения между выборками из каждого серийного номера программного обеспечения. Я знаю, что GPS вещает с интервалом в секунду. Поэтому, возможно, после получения действительного показания GPS отключите его, а затем наблюдайте за компасом до следующего запланированного GPS. Исследовательский вопрос будет заключаться в том, сколько времени требуется для инициализации вещей и поддержания достаточной эффективности кода.

person jdh    schedule 14.06.2012

Ваш SoftwareSerial в порядке. Как сказал jdh, Arduino может читать только один серийный номер программного обеспечения за раз. Но если вы используете Sparkfun GPS, вы можете использовать UART для GPS (используя переключатель UART/Dline и изменяя номера контактов RX/TX с 2, 3 на 0 и 1 соответственно).

Для этого держите переключатель в положении dline и загружайте код. После этого измените его обратно на UART, чтобы Arduino мог считывать данные с GPS. Это будет работать просто отлично.

Дополнительные сведения см. в разделе UART руководства по GPS. http://www.sparkfun.com/tutorials/173

person mixdev    schedule 06.08.2012
comment
Я понял, что мой UART был на контактах 0, 1, а не 2, 3, как написано на сайте. Просто говорю для тех, кто может приземлиться здесь. - person kechap; 30.01.2013

Чтобы установить, какой порт SoftwareSerial для прослушивания вы используете

mySerial.listen()

Это означает, что вам нужно дождаться прибытия сообщения после установки listen(). Сделайте это, отметив mySerial.available()>0

Недостатком является то, что вы пропускаете сообщения с другого устройства, поэтому хороший дизайн программы становится очень важным. Но я уверен, что вы это знаете :)

person James Mulling    schedule 25.10.2012

Вы должны прочитать строку текста с приемника GPS, затем использовать this->compassSerial->listen(), чтобы вернуться к компасу, а затем обратно к GPS. Вы потеряете некоторые отчеты, но это может не быть для вас ограничением.

person Russell Nelson    schedule 17.04.2013
comment
Вы сможете проголосовать за ответ, когда достигнете определенной базовой репутации. Пожалуйста, не публикуйте ответы, которые на самом деле не являются ответами. На данный момент я удалю часть комментария. - person John Dvorak; 17.04.2013