XBee использует Serial, а не SoftwareSerial — как исправить

Итак, у меня есть пара XBee S2C, и я правильно их настроил — они действительно могут взаимодействовать друг с другом. Я использую их с Arduino Unos и этим шилдом: https://store.arduino.cc/usa/shield -xbee-без-рф. Я пытаюсь взаимодействовать с XBees с помощью SoftwareSerial, но по какой-то причине вместо этого они используют обычный Serial. Все, что я помещаю в SoftwareSerial, кажется, полностью игнорируется, в то время как все, что я помещаю в Serial, появляется на моем последовательном мониторе, а также передается на другой XBee. У меня есть этот код для передачи:

#include <SoftwareSerial.h>
SoftwareSerial xbee (2, 3);
void setup() {
    Serial.begin(9600);
    xbee.begin(9600);
}

void loop() {
    xbee.println("hello");
    Serial.println("world");
    delay(5000);
}

И этот код для получения:

#include <SoftwareSerial.h>

SoftwareSerial xbee(2, 3);

void setup() {
    Serial.begin(9600);
    xbee.begin(9600);
}

void loop() {
    if (xbee.available() > 0) {
        Serial.println("xbee: " + xbee.readString());
    }
    else {
        Serial.println("no xbee data");
    }

    if (Serial.available() > 0) {
        Serial.println("serial: " + Serial.readString());
    }
    else {
        Serial.println("no serial data");
    }
    delay(5000);
}

Каждые 5 секунд я получаю этот вывод через последовательный монитор на передающей стороне:

world

и это на принимающей стороне:

no xbee data
serial: world

Я также получаю строку world, когда подключаю третий XBee к своей консоли XCTU.

Итак, у меня есть пара вопросов:

Во-первых, как это происходит? Я не эксперт по Arduino, но, насколько я могу судить из того, что я прочитал, если XBee захватывает мой последовательный вывод, я не должен также видеть его в мониторе последовательного порта.

Во-вторых, как заставить работать SoftwareSerial? Теоретически я мог бы просто использовать Serial навсегда, но это усложнило бы отладку и, вероятно, позже создало бы головную боль при обслуживании кода. Если бы мне пришлось угадывать, мне, возможно, пришлось бы использовать разные контакты для щита, но я понятия не имею, как узнать, какие контакты использовать правильно.

Обновление: исходя из того, что я видел и читал, похоже, что конкретная комбинация Uno с этим щитом не оставляет мне другого выбора, кроме как использовать аппаратный серийный номер. Другой шилд или плата Arduino предоставили бы мне возможность отделить мой последовательный выход от моего выхода xbee, но здесь это не вариант.

, 👍1

Обсуждение

Если этот экран имеет xbee, подключенный к аппаратным последовательным контактам (0 и 1), то никакое количество программных серийных экземпляров не сможет его переподключить. В ссылке не так много информации об этом щите, есть ли способ изменить используемые им контакты?, @Delta_G

Это может быть так. Я понятия не имею, как бы я это изменил — я тоже не нашел много информации о щите, а я не настолько разбираюсь в электрике, чтобы копаться в нем без него., @jordan767

Главный урок может заключаться в следующем: «Всегда проверяйте документацию, ПРЕЖДЕ чем тратить деньги». Каким бы крутым ни казалось какое-то устройство, если к нему не прилагаются какие-либо инструкции, то оно практически бесполезно., @Delta_G

В каком положении находятся перемычки? Прочтите это: https://www.arduino.cc/en/Main/ArduinoXbeeShield, @Majenko


2 ответа


Лучший ответ:

1

Чтобы отладить скетч с помощью SoftwareSerial, снимите перемычки с JP2 и JP3 и соедините (с помощью перемычек) средний контакт JP2 и JP3 с выбранными контактами SoftwareSerial.

Средний контакт JP2 — это TX Xbee, поэтому подключите его к RX SoftwareSerial. Средний контакт JP3 — это RX XBee.

На этой конкретной плате перемычка JP2 ближе к середине платы, а JP3 ближе к краю.

схемы щита

,

1

Вам понадобится разделительная плата xbee прорыв Xbee плату или эту от Sparkfun, чтобы сделать это...

Убедитесь, что на плате есть заголовки, так как они не всегда включены. Также обратите внимание, что сокет xbee не является стандартным размером, поэтому вам нужна переходная плата — она преобразует контакт XBee в стандартный размер. Вот 2-миллиметровые разъемы, необходимые для xbee и обычных разъемы 0,1", необходимые для подключения к макетной плате или соединительным проводам и т. д.

На самом деле я использовал leonardo именно по той причине, о которой вы спрашивали в своем вопросе. У Леонардо есть два последовательных порта, один для USB-подключения, с которым вы знакомы в Uno, но он не подключен к контактам 0 и 1.

Другой — полностью независимый последовательный порт, подключенный к контактам 0 и 1 на leonardo.

Итак, на Leonardo вы можете выполнить Serial.println("Отладочные сообщения"); и Serial1.println("xbee messages"); (обратите внимание на цифру 1 в серийном1). Конечно, таким же образом можно использовать и другие платформы, такие как Mega.

Я предполагаю, что у вас уже есть XBee Shield, который позволяет подключать XBee напрямую к Uno. Прелесть Леонардо в том, что вы можете продолжать использовать этот щит. XBee будет "автоматически" подключен к Serial1.

FWIW, у меня были всевозможные проблемы с серийным номером s/w. Я вообще не мог заставить его работать с моим XBees. Я никогда не мог понять, почему это не работает.

Как только я перешел на leonardo, все заработало как по маслу.

,