【问题标题】:File Transfer PC to Raspberry Pi (with xBee)文件传输 PC 到 Raspberry Pi(使用 xBee)
【发布时间】:2020-08-21 23:25:17
【问题描述】:

我有两个 xBee Pro S2C 模块。我正在尝试使用 xBee 模块将图像从 Windows PC 发送到 Raspberry Pi。我将我的 xBees 配置为 API 模式,我可以使用 Python 代码接收/发送 AT 文本消息。

我想将图像从我的 PC 发送到 Raspberry Pi Model 3 B+

我也查了这个主题:http://cms.digi.com/support/forum/70518/transfer-image-between-xbee-modules-connected-raspberry-each

我做了一些更改并尝试了下面的代码。

PC 端(发送方) ############################

ser = serial.Serial('COM6', 9600,timeout=.5)
fc= 'xbee.jpg'
File = open(fc,'r')
#while True:
line = ser.readline()
a= File.read()
print(str(a))
ser.write(str(a))

#############################

Raspberry Pi 端(接收器) #############################

ser = serial.Serial('/dev/ttyUSB0', 9600,timeout=.5)

while True:
incoming = ser.readline().strip()


file = open ('images.png','wb')

print (incoming)
file.write(incoming)
file.close()
content= file.read()

#################################

然后我得到一个错误:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 240: character maps to <undefined>

我也想到了一个主意。我制作了一个脚本,将图像转换为 base64 代码并保存为 .txt 文件。我将“images.png”更改为“test.txt”。没有发生错误,但也没有在我的树莓派上创建 .txt 文件。

这对我来说真的很重要。请帮忙。

更新

我也试过这个代码:https://github.com/MortadhaDhkar/zigbee-file-transfer

没有发生错误。但文件也不会接收到 Raspbbery Pi。 Sender.py 输出的是:

Sending Header...
Sending File...
Done

【问题讨论】:

  • 不幸的是,我无法提供详细的答案,但看起来您正在读取二进制文件,但是,代码似乎处理字符串而不是处理字节。调用strip() 可能会弄乱原始字节顺序,破坏图像。此外,看起来您正在读取 JPG(“xbee.jpg”)并写入 PNG(“images.png”)。请注意,这些是不同的图像编解码器。如果您想将图像发送一个字符串,也许编码/编码为 Base64(并注意 strip()/etc.)?或者,您可以将图像解码为 r、g、b 值的平面数组并将其作为字节发送?
  • ...此外,您似乎在 while 循环中不断覆盖 incoming 而不是追加。如果图像很大,以每秒 9600 波特的速度传输将需要很长时间。查看图像大小(以字节为单位)并除以波特率,您将了解传输的方式。
  • 谢谢您的回复。我把波特率改成230400。我会考虑你说的。

标签: python raspberry-pi xbee


【解决方案1】:

您不能将readline() 用于图像等二进制数据,因为它用于文本。它基本上会查找换行符来分隔文本行,但是当您有图像时,它们是二进制的,并且如果像素恰好具有 10 的亮度值(过度简化的示例),则可能包含换行符。

相反,我们需要建立一种方法,让接收者知道需要多少字节的数据,然后它就可以读取那么多字节。有很多方法可以做到这一点,但我只是在下面展示如何按照网络顺序发送一个 4 字节整数,以便接收者可以简单地读取固定数量的 4 字节来获取图像的长度,然后读取构成图像的确切字节数。如果一台机器是大端而另一台是小端,我会按照网络字节顺序进行操作。与典型的 JPEG/PNG 图像大小相比,这允许传输高达 2GB 的图像巨大

所以,这里是发件人:

#!/usr/bin/env python3

import serial
import struct

# Open image and slurp entire contents
with open('image.jpg', 'rb') as f:
    image = f.read()
    nbytes = len(image)
    print(f'DEBUG: Image length={nbytes}')

# Open serial connection
with serial.Serial('/dev/ttyS0', 9600) as s:
    # Send 4-byte network order long with image size
    s.write(struct.pack('!L', nbytes))
    # Send image itself
    s.write(image)

这里是接收者:

#!/usr/bin/env python3

import serial
import struct

# Open serial connection
with serial.Serial('/dev/ttyS0', 9600) as s:
    # Read 4-byte network order long with image size
    print(f'DEBUG: Waiting for 4-byte header')
    nbytes = struct.unpack('!L', s.read(4))[0]
    print(f'DEBUG: Image length={nbytes}')
    # Read image itself
    image = s.read(nbytes)

# Open image and write
with open('image.jpg', 'wb') as f:
    f.write(image)

关键字:Raspberry Pi、串行、pyserial、发送图像、接收图像、成帧协议。

【讨论】:

  • 在 PC 端,我只得到如下输出:runfile ('C: /Users/Canberk/Downloads/sender.py', wdir = 'C: / Users / Canberk / Downloads') DEBUG: Image length = 50958 在 raspbbery 端:print (f'DEBUG: Waiting for 4-byte header ') 我在 Receiver.py 中注释掉了打印命令。该代码工作没有任何错误。但是控制台屏幕上什么也没有出现,只是一片空白的黑屏。带有 Receiver.py 文件的文件夹中也没有文件。
  • 请问runfile() 是什么?你怎么运行这个?看来您的 XBees 并没有真正正确连接。请不要尝试以 192,000 波特率运行。先让它以低速稳定运行,否则我们有太多未知数。
猜你喜欢
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多