Xbee python беспроводной прием данных через последовательный интерфейс

#python #serial-port #raspberry-pi3 #xbee

#python #последовательный порт #raspberry-pi3 #xbee

Вопрос:

Я использую Xbee, подключенный к Raspberry pi3, API-mode = 2 и отправляющий данные из xbee через последовательный интерфейс, который работает хорошо. Однако мне нужно прочитать данные, которые поступают на тот же Xbee (эта часть работает плохо). Пожалуйста, найдите мой код ниже, который содержит скрипт как для передачи, так и для приема данных через последовательный интерфейс:

 ser=serial.Serial(PORT, BAUDRATE)
while True:
    #SEND DATA
    msg=[0x10,
         0x00,
         0x00,
         0x00,
         0x00,
         0x00,
         0x00,
         0x00,
         0xFF,
         0xFF,
         0xFF,
         0xFE,
         0x00,
         0xCC,
         0x66,
         0x00,
         0x00,
         0x01,
         0x00,
         0x03,
         0xFF,
         0x01,
         0x00,
         0x01,
         0x77,
         0x00,
         0x1D]
    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) amp; 0xFF ))
    ser.write(chr(check))

    #READ DATA
    msg=[0x90,
         0x00,
         0x13,
         0xA2,
         0x00,
         0x41,
         0x88,
         0xA5,
         0x2C,
         0xFF,
         0xFE,
         0x00,
         0x66,
         0x00,
         0x00,
         0x01,
         0x00,
         0x03,
         0xFF,
         0x01,
         0x00,
         0x01,
         0x77,
         0x00,
         0x1D]
    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) amp; 0xFF ))
    ser.write(chr(check))
    data = ser.read()
    print(data)

ser.close()
  

Я могу отправлять данные. Однако сценарий чтения выводит мне следующее:

 ~


▒

}
3
▒

A
▒
▒
▒
▒
▒
▒
f



▒





w


▒
  

Я был бы признателен за любую помощь в этом. Я предпочитаю последовательно читать и записывать без использования библиотеки python. Тем не менее, я открыт для предложения, которое сработало бы в моем случае.

Ответ №1:

Во-первых, вы можете захотеть оставить свои ser.write() вызовы за пределами вашего while True: , иначе вы отправляете много пакетов.

Попробуйте создать свой большой цикл, чтобы всегда проверять наличие байтов в последовательной строке и запускать ваши записи после определенных событий (например, возможно, нажатие клавиши или прошло определенное количество времени).

Похоже, что вы получаете фрейм — ~ это 0x7E . ser.read() Всегда ли возвращается один символ? Вы можете распечатать его с помощью print(hex(ord(data))) , чтобы получить шестнадцатеричное значение порядкового значения символа, и оно может начать выглядеть как список шестнадцатеричных значений, которые вы ожидаете.

И вы сказали, что предпочитаете не использовать библиотеку Python, но, возможно, захотите рассмотреть библиотеку python-xbee от Digi, чтобы сократить время, которое вы тратите на получение простого рабочего кода, и сосредоточить свое время на кодировании на прикладном уровне.