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個のデータパッケージしか送信しません!
だから...どんな推測?
ありがとうございます。
実際に私はパッケージを送ってから10時間待っています...ボーレートを変更しようとしましたが何も変わっていません...私のコーディネーターがXBee S2Cだと言わざるを得ない... –
追加のアイデア:より速いコンピュータが追いつくことができるかどうかを知るPC。エスケープされたAPIモードの代わりに通常のAPIモードを使用して、エスケープコードのオーバーヘッドを減らします。受信したデータをキューに入れずに続けることができるかどうかを確認してください。スリープがすべてのスレッドを停止していないことを確認するには、sleep()を0.001(値の範囲は0.001 = 1ms)に変更してください。 – tomlogic