-1

嗨,我对 xBee 很陌生,并且在数据传输方面遇到了困难。我的目标是用 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 

我应该怎么做或尝试修复代码。我认为它的接收代码是一个主要问题。

附言。我已经尝试在计算机和 Raspberry Pi 中将图像文件转换为 hexlify 并将其反转回来,它仍然可以正常工作。

4

1 回答 1

0

问题:

为什么要使用 XBee 而不是 Wi-Fi 和 HTTP 或 FTP 等标准 TCP 协议?

一次调试系统的一部分。不要在 Pi 上捕获图像,而是使用一个小文本文件,看看它是否正确通过。更容易看出您是否在文件的中间、开头或结尾删除字节。

每当使用 XBee 模块时,请务必启用硬件流控制(引脚 D6 和 D7),以免丢失任何串行数据。使用硬件流控制,连接的每一端都能够在处理数据时向另一端发出信号以暂时停止发送。

我还建议将波特率提高到 115200 甚至 230400 bps。这与硬件流控制相结合,将导致更快的传输而不会丢失字节。

无需对数据进行 hexlify 处理——XBee 在透明串行模式下运行时能够发送 8 位字节(本质上是串行电缆的替代品)。

也就是说,您没有任何方法可以指示文件的开始或结束——接收者不知道图像何时开始或何时结束并关闭文件。如果您继续对数据进行 hexlify,您可以发送 0-9a-f 以外的字符来表示这是图像的开始或图像已完成。

于 2020-11-28T21:14:28.223 回答