XBee Series 2 зависает и истекает время ожидания при попытке получить пакеты

У меня есть две установки XBee Series 2 в режиме API 2. Одна настроена как контроллер, а другая настроена как конечный узел. Конечный узел подключен к Arduino и на данный момент просто принимает значение аналогового датчика и отправляет его.

На данный момент все работает, когда я запускаю XBees через X-ctu. В новой версии добавляю модуль контроллера (на USB проводнике). Затем я нажимаю среднюю кнопку на устройстве, которое ищет другие сетевые устройства. Затем я выбираю режим консоли. Как только я нажимаю кнопку подключения, я сразу же начинаю получать «Получить пакет». После просмотра деталей рамы все в порядке.

В тот момент, когда я пытаюсь использовать java-библиотеку xbee-api или библиотеку python-xbee, я начинаю сталкиваться с проблемами. Код, который я использую, полностью скопирован из примеров (они кажутся вполне разумными для работы). Вот пример кода Python (это COM3 в Windows и /dev/ttyUSB1. Обе ОС имеют одинаковую проблему.)

from xbee import XBee
import serial
s = serial.Serial('COM3', 9600)
xbee = XBee(s)
while True:
  try:
    response = xbee.wait_read_frame()
    print(response)
except KeyboardInterrupt:
  break
s.close()

Приложения зависают на xbee.wait_read_frame(). Java-код работает так же, когда я вызываю Xbee.open(), когда код в конечном итоге достигает строки «sendAtCommand (new AtCommand («AP»));» (или используя альтернативу sendSynchronous). Время ожидания метода истекает, и возникает исключение.

На данный момент я понятия не имею, куда идти дальше. Работает внутри XCTU, но не с любым API. Есть ли что-то еще, что мне нужно сделать до того, как wait_read_frame свяжет их вместе? (Я предполагаю, что не потому, что у них одинаковый идентификатор панорамы. На самом деле все настройки, кроме прошивки, одинаковы)

Спасибо за любую помощь!


person Mike    schedule 10.05.2014    source источник
comment
Вы настроили две библиотеки для режима API 2? Возможно, они по умолчанию настроены на режим 1.   -  person tomlogic    schedule 10.05.2014
comment
Я дважды и трижды проверил, что они оба находятся в режиме 2.   -  person Mike    schedule 10.05.2014
comment
Ваш пример Python не включает экранированный параметр при создании объекта XBee: xbee = XBee(s, escaped=True). Библиотека Java также может ожидать ATAP=1, если вы специально не настроите ее как таковую. Если вы не должны использовать ATAP=2, вы можете просто попробовать переключиться на ATAP=1, чтобы посмотреть, начнет ли работать ваш код.   -  person tomlogic    schedule 10.05.2014
comment
Дин! Как я уже сказал, я скопировал и вставил примеры, и они не сработали. Думаю, я предположил (явно ошибочно), что он был в режиме 2, и сбежал.   -  person Mike    schedule 10.05.2014
comment
Что такое ошибка исключения? Я столкнулся с похожей проблемой, когда XBee получил тип пакета, который он не понял (но это не объясняет, почему, например, он не работает).   -  person jamesleesaunders    schedule 09.08.2016


Ответы (2)


Обратите внимание, что модули XBee имеют два разных режима API. ATAP=1 — это стандартный режим, а ATAP=2 — экранированный режим.

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

В случае python-xbee вам нужно добавить escaped=True в свой конструктор. В библиотеке Java, вероятно, есть что-то подобное.

Но, на мой взгляд, нет смысла использовать экранированный режим API. Я рекомендую просто установить ATAP=1 для модулей вместо того, чтобы пытаться настроить библиотеки для экранированного режима.

person tomlogic    schedule 11.05.2014

Замените XBee на ZigBee.
На компьютере с Windows я использую Python 2.7.5
Попробуйте пример, приведенный ниже.

Код:

from xbee import  ZigBee
import serial
import time

port = serial.Serial(port='COM16',baudrate=9600,timeout=0)


xbee = ZigBee(port,escaped=True)

def filewrite(rcv):
    logfile = open("c:\\templog.txt","a")
    logfile.write(rcv)
    logfile.close



while True:

    recv = port.readline().strip()
    if (len(repr(recv)) > 2):
     try:
       response = xbee.wait_read_frame()
       filewrite(repr(response))
       print repr(response)
     except KeyboardInterrupt:
      break
person Bhushan Mahajan    schedule 03.03.2015