#python #raspberry-pi #xbee #binascii
#python #raspberry-pi #xbee #binascii
Вопрос:
Привет, я совсем новичок в XBee и борюсь с передачей данных. Моя цель — сделать снимок с помощью Raspberry pi wide и отправить его обратно на компьютер через XBee, преобразовав это изображение в код hexlify. после получения кода с помощью python на компьютере я использую библиотеку binascii, чтобы превратить этот код обратно в изображение с помощью этого кода
ASCII в IMG:
import binascii
with open("file.txt", "r") as f:
data=f.read()
data = data.strip()
data = data.replace('n', '')
data = binascii.a2b_hex(data)
with open('image.png', 'wb') as image_file:
image_file.write(data)
но после запуска этого кода изображение повреждено. Итак, я начинаю просматривать код приема, но я не уверен, что код правильный, потому что в текстовом файле, который я получил, много «0»
Получение кода:
from digi.xbee.devices import XBeeDevice
PORT = 'COM11'
BAUD = 19200
ser = XBeeDevice(PORT, BAUD)
try :
ser.open()
def data_receive_callback(xbee_message):
data = xbee_message.data.decode("utf-8")
with open("file.txt","a") as f:
f.write(data)
ser.add_data_received_callback(data_receive_callback)
print("Waiting for data...n")
input()
finally:
if ser is not None and ser.is_open():
ser.close()
код камеры в RPi:
from picamera import PiCamera
import serial
import binascii
ser =serial.Serial(
port='/dev/ttyS0',
baudrate=19200,
parity= serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
camera=PiCamera()
camera.resolution(1920,1080)
camera.capture("img.png")
with open("image.png",'rb') as f:
content=f.read()
a=binascii.hexlify(content)
ser.write(a)
ser.close
Что мне делать или попытаться исправить код. Я думаю, что основной проблемой является код приема.
Ps. я уже пытаюсь преобразовать файл изображения в hexlify как на компьютере, так и на Raspberry Pi и вернуть его обратно, и он по-прежнему работает нормально.
Комментарии:
1. Пожалуйста, покажите простейший возможный код, который захватывает изображение и отправляет его. Пожалуйста, также поделитесь файлом, содержащим изображение — возможно, с помощью Google Диска или Dropbox, если вы не можете опубликовать его здесь.
2. Хорошо, поэтому я тщательно проверяю код, и пока все в порядке. Но я перепроверяю принимающий пакет и выяснил, что причина, по которой он не работает, связана с потерей пакета. сообщение, которое я получил, теряется примерно 14 раз (каждый пакет состоит из 114 символов). есть ли способ предотвратить потерю пакета в xbee???
Ответ №1:
Вопросы:
Почему вы используете XBee вместо Wi-Fi и стандартного протокола TCP, такого как HTTP или FTP?
Работайте над отладкой части вашей системы за раз. Вместо того, чтобы записывать изображение на Pi, используйте небольшой текстовый файл и посмотрите, правильно ли он передается. Будет легче увидеть, отбрасываете ли вы байты в середине, начале или конце файла.
При использовании модуля XBee обязательно включите аппаратное управление потоком (контакты D6 и D7), чтобы не потерять какие-либо последовательные данные. Благодаря аппаратному управлению потоком каждая сторона соединения имеет возможность сигнализировать другой стороне временно прекратить отправку, пока она обрабатывает данные.
Я также рекомендую увеличить скорость передачи данных до 115200 или даже 230400 бит / с. Это, в сочетании с аппаратным управлением потоком, приведет к более быстрой передаче без потери байтов.
Нет необходимости в шестнадцатеричном преобразовании данных — XBee способен отправлять 8-битные байты при работе в прозрачном последовательном режиме (по сути, замена последовательного кабеля).
Тем не менее, у вас нет никакого способа указать начало или конец файла — получатель не знает, когда начинается изображение или когда заканчивать и закрывать файл. Если вы продолжаете шестнадцатеричную обработку данных, вы можете отправлять символы, отличные от 0-9a-f, чтобы указать, что это начало изображения или изображение завершено.