【问题标题】:Missing packages with python-xbee library and raspberry缺少带有 python-xbee 库和覆盆子的软件包
【发布时间】:2017-12-08 18:31:06
【问题描述】:

我正在尝试通过 2 个 Xbee S1 模块将一些包从 MSP 发送到 Raspberry Pi 3。

Xbee 配置为带有转义帧的 DigiMesh 2.4,一个作为路由器,另一个作为协调器。在 raspberry 中,使用 USB 加密狗进行连接。

我在 MSP 的代码使用 CTS 流控制每 10 我们发送一个包。当协调器插入我运行 windows 的 PC 时,我可以通过 XCTU 看到所有包都到达了,一切都很好!!!

但是,当加密狗在 raspberry,运行 Raspbian 和以下代码时,一些包无法到达。

由于 XCTU 一切正常,问题出在代码中,可能处理串行端口或任何类似的东西。

所以,任何帮助将不胜感激!!!

start.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# copyright: Thiago Cruz <thiagoalberto@gmail.com>

import sys
import os

from PyQt4 import QtGui
from middleware.QueueMiddleware import QueueMiddleware
from jobs.ScheduleJob import ScheduleJob


def startQueue():
    queue = QueueMiddleware()
    queue.start()

def assyncSchedule():
    schedule = ScheduleJob()
    schedule.run()

def runApp():
    startQueue()

    app = QtGui.QApplication(sys.argv) 


    sys.exit(app.exec_())


if __name__ == '__main__':
    runApp()

QueueMiddleware.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# copyright: Thiago Cruz <thiagoalberto@gmail.com>

import threading
import time
import serial
import Queue

from middleware.DataProcessorGear import DataProcessorGear
from xbee import ZigBee

minutes = 0

class QueueMiddleware(threading.Thread):
    __instance = None

    PORT = '/dev/ttyUSB0'
    BAUD_RATE = 9600

    # The XBee addresses I'm dealing with
    BROADCAST = '\x00\x00\x00\x00\x00\x00\xFF\xFF'
    UNKNOWN = '\xFF\xFE' # This is the 'I don't know' 16 bit address

    def __new__(cls):
        if QueueMiddleware.__instance is None:
            QueueMiddleware.__instance = super(QueueMiddleware, cls).__new__(cls)

        return QueueMiddleware.__instance

    def __init__(self):
        QueueMiddleware.__instance = self
        threading.Thread.__init__(self)
        self.dataPacketsQueue = Queue.Queue()
        # Create API object, which spawns a new thread
        self.ser = serial.Serial(
                                    port='/dev/ttyUSB0',
                                    baudrate = 9600,
                                    parity=serial.PARITY_NONE,
                                    stopbits=serial.STOPBITS_ONE,
                                    bytesize=serial.EIGHTBITS,
                                    timeout=1
                                )
        self.xbeeApi = ZigBee(self.ser, callback=self.message_received, escaped=True)
        print 'start queue'

    def __del__(self):
        # halt() must be called before closing the serial
        # port in order to ensure proper thread shutdown
        self.xbeeApi.halt()
        self.ser.close()
        self.processor = None

    def run(self):
        # Do other stuff in the main thread
        while True:
            try:
                time.sleep(1)
                #if self.dataPacketsQueue.qsize() > 0:
                #    lock = threading.Lock()
                #    processor = DataProcessorGear(self.dataPacketsQueue, lock)
                #    processor.start()
            except KeyboardInterrupt:
                break

    def message_received(self, data):
        global minutes

        minutes += 1
        print minutes
        self.dataPacketsQueue.put(data, block=True, timeout=None)

我已经尝试更改 time.sleep() 的值并抑制后续线程的执行以“隔离”问题。

我的控制台显示从 ~120 到 ~170 的值。 MSP只发送200个数据包!!

所以...有什么猜测吗??

提前致谢。

【问题讨论】:

    标签: python raspberry-pi pyserial missing-data xbee


    【解决方案1】:

    启用硬件流控制并将波特率从 9600 更改为 115200。您必须为新的波特率更新 XBee 模块配置,但您有机会让数据包通过。

    我假设您的意思是每 10 毫秒而不是每 10 微秒发送一次数据包。在 10 毫秒/包时,您的速度为 100 包/秒。 9600 波特每秒只有大约 960 个字符,而您的数据包肯定会大于 9 个字符,还有 API 开销。

    【讨论】:

    • 实际上我发送了一个包然后等待 10us... 尝试更改波特率并没有任何改变.. 我忘了提到我的协调员是 XBee S2C...
    • 其他想法:在 PC 上测试您的 Python 代码,看看速度更快的计算机是否可以跟上。切换到使用常规 API 模式而不是转义 API 模式以减少转义代码的开销。看看你是否可以在不排队接收到的数据的情况下跟上。将 sleep() 更改为 0.001(您提到更改它,但不是值的范围 -- 0.001 = 1ms)以确保睡眠不会停止所有线程。
    【解决方案2】:

    一种解决方案.....

    在我的代码中尝试了不同的方法后,甚至尝试了下面的脚本......

    #!/usr/bin/python
    import serial
    
    serialport = serial.Serial("/dev/ttyUSB0", 115200, timeout=None,rtscts=True,dsrdtr=True)
    
    while True:
        serialport.flush()
        command = serialport.readline()
        print str(command).encode('hex')
    

    我能够通过将 XBee MR 参数(Mesh unicast retries - 网络数据包传递尝试的最大次数)更改为最大值 (0x7) 来获得期望的行为,我的包都不是丢失,即使每个包的传输之间有 0 秒(零)的延迟。

    很可能,正如 tomlogic 所说,如果我在更快的 PC 上运行我的代码,我相信我会得到我的包。

    当我做这个测试时,我会在这里发布结果。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2019-09-22
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      相关资源
      最近更新 更多