No puedo hacer que Raspberry Pi y Xbee funcionen juntos

Me está costando mucho intentar que mis XBEE funcionen con mi Raspberry pi (RP). Tengo uno en una placa de conexión USB en mi computadora y el otro XBEE conectado a un RP. El que está en el RP es el coordinador de API y el que está en la computadora es el enrutador AT. Cuando ejecuto este programa en el RP (que debería cambiar uno de los pines IO en el enrutador XBEE)

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

Sin embargo, no se hace nada en el enrutador. Creo que los XBEE están conectados porque cuando conecto el enrutador a la computadora, aparece un mensaje en el puerto serie del RP notificándole que algo se ha unido. No tengo ideas, y esperaba que alguien pudiera ayudarme.

¿Tienes un osciloscopio para usar? Si es así, esa sería la mejor manera de diagnosticar un problema como este.
Sí. ¿Que estabas pensando? Creo que el problema es por qué el coordinador no está transmitiendo. ¿Cómo puedo saber eso con un osciloscopio?
Me preocuparía cómo salió esto en el cable. Puede haber tiempos de espera entre personajes que te están confundiendo. Si puede, mire un alcance para ver la diferencia entre la versión de trabajo en la aplicación y su versión de python. Si no puede hacer eso... intente ensamblar el mensaje en un búfer y envíe el búfer todo a la vez.
¿Estás seguro de que tu código es correcto? Ese cálculo de suma de comprobación me parece sospechoso ( (0xFF - ( sum & 0xFF ))?). Almacenaría todo su paquete como una cadena y calcularía la suma de verificación iterando sobre la cadena. De esa forma, no tendrás posibles errores de transcripción.

Respuestas (2)

Está utilizando el modo API; ¿Es esa API escapada (ATAP = 2) o API no escapada? El marco que está enviando debe tener escape/no escape para que coincida con la configuración configurada en el remitente XBee.

Primero intente lograr algún tipo de transmisión en modo AT; cuando eso funcione, actualice al modo API.

No he encontrado que el modo AT sea bueno para mucho más que cuando se usa un terminal, o para obtener un dispositivo que en el estado predeterminado de fábrica está fuera del modo AT. Si un XBEE no colapsado está en modo API escapado, debe responder incondicionalmente a algo como un paquete de comando "SL" que se envía en ese modo, y la respuesta debe ser clara e inequívoca.

No conozco XBee, pero parece que su byte de longitud es 0x10 (16) y su mensaje tiene solo 15 bytes de longitud.

También repite el mensaje en código dos veces, lo cual es una mala práctica.

Pruebe un código como este (no probado):

#!/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")
Así que probé esto, y no funcionó. Esto es lo que he aprendido en los últimos días. Abrí XCTU el programa que viene con el XBee. Pude enviar el flujo hexadecimal 7E 00 10 17 05 00 13 A2 00 40 A0 D2 93 FF FE 02 44 34 03 6F usando la función "ensamblar paquete". El problema parece ser solo cuando envío los bytes desde Python. ¿Hay alguna manera de hacer un flujo de bytes o algo así? Tengo la sensación de que Python está enviando la cadena de forma incorrecta. Además, al usar la biblioteca Java de XBEE, también pude enviar marcos de API. ¿Alguien sabe qué estoy haciendo mal en Python?