Xbee 图像传输 python
Xbee image transfer python
您好,我对 xBee 很陌生,在数据传输方面遇到了困难。我的 objective 是拍摄 Raspberry pi 宽的照片,然后通过 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。我已经尝试在计算机和 Raspberry Pi 中将图像文件转换为 hexlify 并将其反转回来,它仍然可以正常工作。
问题:
您为什么使用 XBee 而不是 Wi-Fi 和标准 TCP 协议,如 HTTP 或 FTP?
一次调试您的系统的一部分。不要在 Pi 上捕获图像,而是使用一个小文本文件并查看它是否正确通过。将更容易看出您是否在文件的中间、开头或结尾丢弃了字节。
无论何时使用 XBee 模块,请务必启用硬件流控制(引脚 D6 和 D7),以免丢失任何串行数据。通过硬件流量控制,连接的每一端都能够向另一端发出信号,在它处理数据时暂时停止发送。
我还建议将波特率提高到 115200 甚至 230400 bps。这与硬件流控制相结合,将导致更快的传输而不会丢失字节。
无需对数据进行 hexlify——当 运行 在透明串行模式(本质上是串行电缆替代)时,XBee 能够发送 8 位字节。
也就是说,您没有任何方法来指示文件的开始或结束——接收者不知道图像何时开始或何时结束和关闭文件。如果您继续对数据进行十六进制化,您可以发送 0-9a-f 以外的字符来指示它是图像的开始或图像已完成。
您好,我对 xBee 很陌生,在数据传输方面遇到了困难。我的 objective 是拍摄 Raspberry pi 宽的照片,然后通过 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。我已经尝试在计算机和 Raspberry Pi 中将图像文件转换为 hexlify 并将其反转回来,它仍然可以正常工作。
问题:
您为什么使用 XBee 而不是 Wi-Fi 和标准 TCP 协议,如 HTTP 或 FTP?
一次调试您的系统的一部分。不要在 Pi 上捕获图像,而是使用一个小文本文件并查看它是否正确通过。将更容易看出您是否在文件的中间、开头或结尾丢弃了字节。
无论何时使用 XBee 模块,请务必启用硬件流控制(引脚 D6 和 D7),以免丢失任何串行数据。通过硬件流量控制,连接的每一端都能够向另一端发出信号,在它处理数据时暂时停止发送。
我还建议将波特率提高到 115200 甚至 230400 bps。这与硬件流控制相结合,将导致更快的传输而不会丢失字节。
无需对数据进行 hexlify——当 运行 在透明串行模式(本质上是串行电缆替代)时,XBee 能够发送 8 位字节。
也就是说,您没有任何方法来指示文件的开始或结束——接收者不知道图像何时开始或何时结束和关闭文件。如果您继续对数据进行十六进制化,您可以发送 0-9a-f 以外的字符来指示它是图像的开始或图像已完成。