2017-12-08 28 views
0

MSPからラズベリーパイ3から2 Xbee S1モジュールにいくつかのパッケージを送信しようとしています。python-xbeeライブラリとラズベリーのパッケージがありません

Xbeeは、DigiMesh 2.4としてエスケープされたフレーム、ルータと他のコーディネータとして1つのフレームで構成されています。ラズベリーでは、USBドングルで接続します。

私のコードは、MSPで、CTSフロー制御で10ユーロごとにパッケージを送信します。コーディネーターがPCを走らせている私のPCに接続されると、XCTUを通してすべてのパッケージが届きます。

しかし、ドングルがラズベリーにあり、Raspbianと次のコードを実行している場合、一部のパッケージは到着できません。

XCTUですべて正常に動作するため、この問題はコードに存在し、おそらくシリアルポートやそれに類するものを処理しています。

だから、どんな助けでも大いに感謝しています!

start.py:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# copyright: Thiago Cruz <[email protected]> 

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 <[email protected]> 

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) 

Iはすでに(time.sleepの値を変更しようとした)と "に続いてスレッドの実行を抑制しています問題を分離してください。

マイコンソールには〜120〜〜170の値が表示されます。 MSPは200個のデータパッケージしか送信しません!

だから...どんな推測?

ありがとうございます。

答えて

0

ハードウェアフロー制御を有効にし、9600から115200に変更します。新しいボーレートのためにXBeeモジュールの設定を更新する必要がありますが、パケットを受信する可能性があります。

あなたは10msごとにではなく10msごとにパケットを送信していると書いていると思います。 10ms /パケットでは、100パケット/秒です。 9600ボーは約960文字/秒しかなく、パケットはAPIオーバーヘッドで9文字を超えることは確かです。

+0

実際に私はパッケージを送ってから10時間待っています...ボーレートを変更しようとしましたが何も変わっていません...私のコーディネーターがXBee S2Cだと言わざるを得ない... –

+0

追加のアイデア:より速いコンピュータが追いつくことができるかどうかを知るPC。エスケープされたAPIモードの代わりに通常のAPIモードを使用して、エスケープコードのオーバーヘッドを減らします。受信したデータをキューに入れずに続けることができるかどうかを確認してください。スリープがすべてのスレッドを停止していないことを確認するには、sleep()を0.001(値の範囲は0.001 = 1ms)に変更してください。 – tomlogic

0

液の種類.....

私のコードに異なるアプローチを試みた後、でも以下のスクリプトを試してみました...

#!/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パラメータ(メッシュユニキャスト再試行 - 最大ネットワークパケット配信試行回数)を最大(0x7)に変更すると、各パッケージの送信が失われます。パッケージ。

おそらく、tomlogicによると、速いPCでコードを実行すると、私は自分のパッケージを手に入れることができると思います。

私はこのテストを行うときに、ここに結果を掲載します。

ありがとうございました。

関連する問題