2017-06-30 3 views
1

Ich benutze 2 XBee pro S1, möchte ich die Pakete vom Koordinator auf meinem PC empfangen lesen, ist es mit API_2 aktiviert und alle anderen Verbindungen sind richtig gemacht, kann ich siehe die Pakete mit XCTU, ich bin mit dem python xbee Bibliothek, aber es gibt keinen Ausgang:Python xbee Bibliothek keine Ausgabe für eingehende Frames

der Code:

import serial.tools.list_ports 
from xbee import XBee 
import serial 

ports = list(serial.tools.list_ports.comports()) 

for p in ports: #print the list of ports 
    print p 

def toHex(s): 
    lst = [] 
    for ch in s: 
     hv = hex(ord(ch)).replace('0x', '') 
     if len(hv) == 1: 
      hv = '0'+hv 
     hv = '0x' + hv 
     lst.append(hv) 

def decodeReceivedFrame(data): 
     source_addr_long = toHex(data['source_addr_long']) 
     source_addr = toHex(data['source_addr']) 
     id = data['id'] 
     samples = data['samples'] 
     options = toHex(data['options']) 
     return [source_addr_long, source_addr, id, samples] 

PORT = '/dev/ttyUSB0' 
BAUD_RATE = 9600 

ser = serial.Serial(PORT, BAUD_RATE) 
print "Serial ports initialised...." 

xbee = XBee(ser,escaped=True) 

print "XBee object created" 

while True: 
    try: 
    response = xbee.wait_read_frame() 
    sleep(0.5) 
    decodedData = decodeReceivedFrame(response) 
    print decodedData 
    print "data decoded" 
    except KeyboardInterrupt: 
    break 

ser.close() 

die Portnummer und Baudrate sind connect, ich ändern sie an den entsprechenden Port-Nummer jedes Mal schicke ich den Koordinator an meinen PC. Meine Ausgabe wie folgt aussieht:

Serial ports initialised.... 
XBee object created 

Es ist wie es bleibt und gibt keine Ausgabe, auch wenn ich die RX siehe LED zu blinken. Unten ist der Code mit nur pyserial geschrieben:

import serial 
from time import sleep 

port = '/dev/ttyUSB0' 
baud = 9600 

ser = serial.Serial(port, baud) 

data = "" 

while True: 
try: 
    while ser.in_waiting: 
    sleep(1) 
    data = ser.read() 
    print data 

except KeyboardInterrupt: 
    break 

ser.close() 

Es gibt die folgende Ausgabe.

Könnte jemand freundlicherweise helfen.

Antwort

0

Sind Sie sicher, dass Sie die richtige serielle Schnittstelle und Baudrate haben? Unterstützt das xbee Paket den API-Modus 2? Es funktioniert möglicherweise nur mit API-Modus 1.

Verfügt dieses Paket über Methoden zum Zugreifen auf den RAW-Byte-Stream, anstatt zu versuchen, Frames zu lesen? Können Sie es so konfigurieren, dass Ausnahmen bei Analysefehlern ausgelöst werden?

Ich würde damit beginnen, nur response zu drucken, bis Sie sehen, dass Sie Daten empfangen. Und warum schließen Sie den sleep() Anruf in diese Schleife ein?

Ich bin mir nicht sicher, was Sie in toHex() erreichen wollen, aber Sie könnten auf der Python-Methode struct.unpack() aussehen wollen oder alle der Arbeit, die Sie mit '0x%02X' % ord(ch) auf hv tun ersetzen.

+0

Nur mit der Pyserial-Bibliothek bekomme ich eine Ausgabe (nicht die gewünschte Ausgabe), es ist nicht lesbar. –

+0

Die serielle Schnittstelle und Baudrate sind korrekt, ich überprüfe die serielle Schnittstelle jedes Mal, wenn ich es an den Computer anschließe, Baudrate ist die Standardeinstellung, ich habe es auch mit API_1 Modus versucht, aber keinen Erfolg, ich habe den Schlaf hinzugefügt, weil ich das vorher angenommen habe der serielle Puffer war voll Ich habe versucht zu lesen (Ich habe das gerade zufällig versucht). –

+0

Sind die Pakete als API-Frames in XCTU? Sie beginnen mit 0x7E (~), Zwei-Byte-Länge, Prüfsumme usw.? Wie sieht es im XCTU-Terminal im Hex-Modus aus? (Und ich nehme an, wenn wir "API_1" sagen, setzen Sie "ATAP = 1" in XCTU.) – tomlogic