Как да използвам множество софтуерни сериали в библиотеки в 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

Според документацията на Ardiuno:

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

Ако използвате множество софтуерни серийни портове, само един може да получава данни наведнъж.

Така че изглежда, че ще трябва да добавите код, за да превключвате между вземане на проби от всеки софтуерен сериал. Знам, че 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

За да зададете кой софтуерен сериен порт да слушате, който използвате

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