Проблема с открытием одного и того же порта несколько раз в python Digi-XBee API - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь понять, почему я не могу несколько раз открыть один и тот же последовательный порт с помощью API Digi-Xbee (импорт digi.xbee) для python, а с API Xbee (импорт xbee) для python Я могу.

Когда я запускаю приведенный ниже код, возникает исключение digi.xbee.exception.InvalidOperatingModeException: Could not determine operating mode.

from digi.xbee.devices import *
import time
import codecs


class start(object):
            
    while True:
        xbeeApi2 = DigiMeshDevice(port='/dev/ttyUSB0', baud_rate=9600)
        xbeeApi2.open()
        time.sleep(0.5)
        message = xbeeApi2.read_data(timeout=None)
        if message is not None:
            print(codecs.decode(message.data, 'utf-8'))  
        time.sleep(1) 

Модуль XBee - это S2 C (XB24 C), установленный как Digime sh 2.4 TH, прошивка 9002 (новейшая) с USB-ключом. Python - это 3,7, и мое основное оборудование - это Raspberry Pi 3 B + под управлением Debian.

Любая помощь приветствуется.

EDIT 1 Исключение возникает, когда для во второй раз выполняется {xbeeApi2.open ()}. Фактически, мой исходный код имеет несколько потоков, которые импортируют класс, в котором открыт порт, много раз до того, как предыдущий поток успел его закрыть. Ниже приведен "исходный" фрагмент кода, который работает нормально:

from xbee import ZigBee
import serial
import time



class start(object):
    
    while True:
        ser = serial.Serial('/dev/ttyUSB0', 9600)
        xbeeApi2 = ZigBee(ser, escaped=True)  # S2 e S2C
        time.sleep(0.5)
    message = ''
        try:
            message = xbeeApi2.wait_read_frame(timeout=0.5)
        except:
            pass #timeout exception
        if message is not None:
            print(message)
        time.sleep(1)

1 Ответ

0 голосов
/ 14 июля 2020

Ну, вы не закрываете. Почему бы не создать устройство и не открыть его перед вашим while True l oop?

И вы можете настроить его только на 0,1 секунды при message is None, чтобы уменьшить нагрузку на процессор. Таким образом вы сможете поддерживать очередь сообщений - если сообщение было, вы хотите немедленно проверить наличие другого сообщения в очереди, прежде чем переходить в режим сна.

from digi.xbee.devices import *
import time
import codecs

class start(object):
    xbeeApi2 = DigiMeshDevice(port='/dev/ttyUSB0', baud_rate=9600)
    xbeeApi2.open()
    while True:
        message = xbeeApi2.read_data(timeout=None)
        if message is not None:
            print(codecs.decode(message.data, 'utf-8'))
        else:
            time.sleep(0.1) 
...