2017-12-08 2 views
0

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.

Antwort

0

Aktivieren Sie die Hardware-Flusskontrolle und ändern Sie die Baudrate von 9600 auf 115200. Sie müssen Ihre XBee-Modulkonfiguration für die neue Baudrate aktualisieren, aber Sie werden eine Chance haben, Ihre Pakete zu erhalten.

Ich nehme an, Sie wollten schreiben, dass Sie Pakete alle 10 ms anstatt alle 10US senden. Bei 10 ms/Paket sind Sie bei 100 Paketen/Sekunde. 9600 Baud sind nur etwa 960 Zeichen pro Sekunde, und Ihre Pakete sind mit dem API Overhead sicherlich größer als 9 Zeichen.

+0

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 ... –

+0

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

0

Art einer Lösung .....

Nach verschiedenen Ansätzen in meinem Code versucht, sogar versucht, das Skript unten ...

#!/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') 

konnte ich eine gewünscht erhalten Verhalten durch Ändern der XBee MR-Parameter (Mesh Unicast Wiederholungen - die maximale Anzahl der Netzwerk-Paketversandversuche) bis zum Maximum (0x7), keine meiner Pakete sind verloren, auch für eine Verzögerung von 0s (Null) zwischen der Übertragung von jedem Paket.

Wahrscheinlich, wie von Tomlogic gesagt, wenn ich meinen Code auf einem schnelleren PC laufen lasse, glaube ich, werde ich meine Pakete bekommen.

Wenn ich diesen Test mache, werde ich die Ergebnisse hier veröffentlichen.

Danke.