Raspberry Pi und Xbee können nicht zusammenarbeiten

Es fällt mir am schwersten, meine XBEEs dazu zu bringen, mit meinem Raspberry Pi (RP) zu arbeiten. Ich habe einen auf einem USB-Breakout-Board in meinem Computer und den anderen XBEE, der mit einem RP verbunden ist. Der auf dem RP ist der API-Koordinator und der auf dem Computer ist der AT-Router. Wenn ich dieses Programm auf dem RP ausführe (was einen der IO-Pins auf dem Router XBEE ändern sollte)

    #!/usr/bin/python
import serial
print("TEST")
ser=serial.Serial('/dev/ttyAMA0', baudrate=9600)
print(ser)
ser.write('\x7E')
ser.write('\x00')
ser.write('\x10')
ser.write('\x17')
ser.write('\x00')
ser.write('\x00')
ser.write('\x00')
ser.write('\x00')
ser.write('\x00')
ser.write('\x00')
ser.write('\xFF')
ser.write('\xFF')
ser.write('\xFF')
ser.write('\xFE')
ser.write('\x02')
ser.write('\x44')
ser.write('\x01')
ser.write('\x05')
sum=(0x17+0xFF+0xFF+0xFF+0xFE+0x02+0x44+0x01+0x05)
check=(0xFF - ( sum & 0xFF ))
ser.write(chr(check))
ser.close()
print("DONE")

Auf dem Router wird aber nichts gemacht. Ich glaube, dass die XBEEs verbunden sind, denn wenn ich den Router an den Computer anschließe, erhalte ich eine Nachricht an der seriellen Schnittstelle des RP, die ihn darüber informiert, dass etwas beigetreten ist. Mir gehen die Ideen aus und ich hatte gehofft, dass mir jemand helfen könnte.

Hast du ein Oszilloskop zur Verfügung? Wenn ja, wäre das der beste Weg, um ein solches Problem zu diagnostizieren.
Das tue ich. Was hast du dir dabei gedacht? Ich denke, das Problem ist, warum der Koordinator nicht sendet. Wie kann ich das mit einem Oszilloskop feststellen?
Ich würde mir Sorgen darüber machen, wie das auf der Leitung ausgegangen ist. Es kann Zeitüberschreitungen zwischen Charakteren geben, die Sie durcheinander bringen. Sehen Sie sich nach Möglichkeit einen Bereich an, um den Unterschied zwischen der Arbeitsversion in der App und Ihrer Python-Version zu sehen. Wenn Sie das nicht können ... versuchen Sie, die Nachricht in einem Puffer zusammenzustellen und den Puffer auf einmal zu senden.
Bist du sicher, dass dein Code richtig ist? Diese Prüfsummenberechnung erscheint mir verdächtig ( (0xFF - ( sum & 0xFF ))?). Ich würde Ihr gesamtes Paket als String speichern und die Prüfsumme berechnen, indem ich über den String iteriere. Auf diese Weise haben Sie keine möglichen Transkriptionsfehler.

Antworten (2)

Sie verwenden den API-Modus; ist das eine maskierte API (ATAP=2) oder eine nicht maskierte API? Der Frame, den Sie senden, muss maskiert/nicht maskiert werden, damit er mit der Einstellung übereinstimmt, die auf der Sender-XBee konfiguriert ist.

Versuchen Sie zuerst, eine Art Übertragung im AT-Modus zu erreichen; Wenn das funktioniert, aktualisieren Sie auf den API-Modus.

Ich habe den AT-Modus nicht für viel anderes als für die Verwendung eines Terminals oder für das Verlassen eines Geräts im werkseitigen Standardzustand aus dem AT-Modus gefunden. Wenn sich ein nicht abgestürztes XBEE im maskierten API-Modus befindet, sollte es bedingungslos auf so etwas wie ein „SL“-Befehlspaket antworten, das in diesem Modus gesendet wird, und die Antwort sollte klar und eindeutig sein.

Ich kenne XBee nicht, aber es sieht so aus, als ob Ihr Längenbyte 0x10 (16) ist und Ihre Nachricht nur 15 Bytes lang ist.

Außerdem wiederholen Sie die Nachricht im Code zweimal, was nur eine schlechte Praxis ist.

Versuchen Sie Code wie diesen (ungetestet):

#!/usr/bin/python
import serial
print("TEST")
ser=serial.Serial('/dev/ttyAMA0', baudrate=9600)
print(ser)

msg=[0x17,
     0x00,
     0x00,
     0x00,
     0x00,
     0x00,
     0x00,
     0xFF,
     0xFF,
     0xFF,
     0xFE,
     0x02,
     0x44,
     0x01,
     0x05]

ser.write(chr(0x7e)+
          chr(len(msg)//256)+
          chr(len(msg)%256))
ser.write(''.join(chr(x) for x in msg))
check=(0xFF - ( sum(msg) & 0xFF ))
ser.write(chr(check))
ser.close()
print("DONE")
Also habe ich das versucht, und es hat nicht funktioniert. Hier ist, was ich in den letzten paar Tagen gelernt habe. Ich habe XCTU geöffnet, das Programm, das mit XBee geliefert wird. Ich konnte den Hex-Stream 7E 00 10 17 05 00 13 A2 00 40 A0 D2 93 FF FE 02 44 34 03 6F senden, indem ich die Funktion "Paket zusammenbauen" verwendete. Das Problem scheint nur zu sein, wenn ich die Bytes von Python sende. Gibt es eine Möglichkeit, einen Bytestream oder ähnliches zu erstellen? Ich habe das Gefühl, dass Python die Zeichenfolge falsch sendet. Außerdem konnte ich mit der XBEE-Java-Bibliothek auch API-Frames senden. Weiß jemand, was ich in Python falsch mache?