Ich versuche, einige Pakete von einem MSP zu einem Raspberry Pi 3 durch 2 Xbee S1-Module zu senden.Fehlende Pakete mit Python-Xbee-Bibliothek und Himbeere
Xbee sind als DigiMesh 2.4 mit ausgeblendeten Frames konfiguriert, eine als Router und andere als Koordinator. Bei der Himbeere erfolgt die Verbindung mit USB-Dongle.
Mein Code sendet bei MSP ein Paket alle 10 us mit CTS-Ablaufsteuerung. Wenn der Koordinator an meinen PC angeschlossen ist, auf dem Windows läuft, kann ich durch XCTU sehen, dass alle Pakete ankommen, alles in Ordnung !!!
Aber, wenn der Dongle Himbeere ist, Raspbian und den folgenden Code laufen, können einige Pakete nicht ankommen.
Da alles mit XCTU ordnungsgemäß funktioniert, liegt das Problem im Code, wahrscheinlich mit der seriellen Schnittstelle oder etwas ähnliches.
Also, jede Hilfe wäre sehr zu schätzen !!!
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 bereits versucht, die Werte der time.sleep zu ändern() und haben die Ausführung der nachfolgenden Fäden unterdrückt " isoliere "das Problem.
Meine Konsole zeigt Werte von ~ 120 bis ~ 170 an. MSP sendet nur 200 Datenpakete !!
Also ... irgendwelche Vermutungen ??
Vielen Dank im Voraus.
In der Tat sende ich ein Paket und dann 10US warten ... Versucht, die Baudrate zu ändern und nichts geändert .. Ich vergesse zu erwähnen, dass mein Koordinator ist ein XBee S2C ... –
Weitere Ideen: Testen Sie Ihren Python-Code auf ein PC, um zu sehen, ob ein schnellerer Computer mithalten kann. Wechseln Sie zur Verwendung des regulären API-Modus anstelle des maskierten API-Modus, um den Overhead des ausgehenden Codes zu reduzieren. Sehen Sie, ob Sie mithalten können, ohne die empfangenen Daten in eine Warteschlange zu stellen. Ändern Sie den Wert für sleep() in 0,001 (Sie haben erwähnt, dass Sie ihn ändern, aber nicht den Wertebereich - 0,001 = 1 ms), um sicherzustellen, dass der Schlafmodus nicht alle Threads stoppt. – tomlogic