[Maixpy]+[vofa+]实现K210串口图传【更新到反向图传2021.3.8】

【点灯鼠教程】[Maixpy]+[vofa+]实现K210串口图传【更新到反向图传2021.3.8】

VOFA+致力于降低图形化调试的门槛:

保留了传统字节流调试助手风格的数据收发功能,以应对非图形化调试需求;
通过直观极简的协议设计和方便快捷的命令绑定,硬件工程师无需处理复杂的协议逻辑,只需以面向串口助手的编程方式,就能获得强大的数据可视化、数据分析、使用控件发送指令的能力;
拥有一个可裁剪的系统,"丰俭由人"。通过添加控件的方式,工程师可以定制一个无限丰富的调试界面;也可以仅仅使用极简的字节流收发界面,无须担忧系统占用繁重;
拥有一个开放、开源的插件系统:
用户可以定制符合自己需求的协议和控件;
通过开源社区的力量,VOFA+的调试生态可以不断发展繁荣。

插件驱动的高自由度上位机

maixpy:就不用多介绍了,nb就完事
总有人不满ide的帧缓存显示,或者想拿k210拍照传给电脑处理,或者其他的譬如其他地方拍照传给k210处理(反正就是不按常理来)
本质上就是通过各种通讯协议,进行图片的收发。这里提供一个简单的方法,通过串口(毕竟各位第一个会的通讯协议都是串口吧2333)将图片数据发送到电脑。
电脑端可以利用python的pyserial或者其他的语言传递给opencv,pil等进行处理。这里也是先进行最简单的操作,利用现成上位机进行展示。
这里采用了国产的高自由度的VOFA+上位机,可进行各种二次开发。


先看看vofa规定的协议引擎:给了三个现成的协议引擎,以及自主开发方法。这里我才用的是firewater。Firewater,吨吨吨!

virewater规定了图片传输的格式:

数据格式#
先发送前导帧:
// 先发送前导帧
"image:IMG_ID, IMG_SIZE, IMG_WIDTH, IMG_HEIGHT, IMG_FORMAT\n"
image: - FireWater约定的前导帧开头,用于告诉协议引擎这是一个图片前导帧;
IMG_ID - 图片通道ID,用于标识不同图片;
IMG_SIZE - 即将发送过来的图片尺寸;
IMG_HEIGHT - 即将发送过来的图片高度;
IMG_WIDTH - 即将发送过来的图片宽度;
IMG_FORMAT - 图片格式,诸如8位灰度图、16位灰度图、jpg等等。
然后发送真正的图片数据,FireWater会根据前导帧里的IMG_FORMAT指定的格式将图片解析出来

按照协议格式发送前导帧后,就可以发送图片数据了,此时,vofa+就会显示出收到的图片。

这里例程提供的是c代码,我们修改为maixpy用的python代码

"image:%d,%d,%d,%d,%d\n"%(
IMG_ID, # 此ID用于标识不同图片通道
IMG_SIZE, # 图片数据大小
IMG_WIDTH, # 图片宽度
IMG_HEIGHT, # 图片高度
IMG_FORMAT# 图片格式

然后是图片传输。由于print发送的是解析为自然语言的内容,会造成数据修改(常见的就是,print(img),收到的并非图片数据,而是图片信息),所以我们采用串口输出。在使用串口前,我们应该先将image转换为bytes数据。采用“img_bytes = img.to_bytes() #转换图片为byte数组”

然后是上位机的操作。

安装后vofa后,选择协议与链接,正常配置串口数据(所以vofa也能当串口助手使用),数据协议选择我们使用的firewater。

找到控件,找到image,拖到面板上

 

然后链接上单片机,按协议填写内容,配置串口,发送图片数据后,右键绑定图片数据

 

然后我们就能愉快的拍照啦

 

最后附上源码:

Untitled - By: Lithromantic - 周日 2月 7 2021

#注意,复用uart后,ide将无法使用
from fpioa_manager import fm
fm.register(5, fm.fpioa.UART1_TX, force=True)
fm.register(4, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
img = img.compress(quality=10)#压缩图片为jpg,质量为10%
IMG_ID = 0
IMG_SIZE = img.size()
IMG_WIDTH =img.width() # 图片宽度
IMG_HEIGHT = img.height() # 图片高度
IMG_FORMAT =27
img_bytes = img.to_bytes() #转换图片为byte数组
#####此处为vota+上位机的前导帧,使用其他接收时自行修改#####
uart_A.write("image:%d,%d,%d,%d,%d\n"%(
IMG_ID, # 此ID用于标识不同图片通道
IMG_SIZE, # 图片数据大小
IMG_WIDTH, # 图片宽度
IMG_HEIGHT, # 图片高度
IMG_FORMAT# 图片格式
)
)
######################################################
uart_A.write(img_bytes,IMG_SIZE)#以数组形式发送图片

2021年3月7日代码更新

# Untitled - By: Lithromantic - 周日3月 7 2021
from fpioa_manager import fm
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time
uart_A = UART(UART.UART1, 1152000, 8, 1, 0, timeout=1000, read_buf_len=4096)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
perFrame=[0,0,0,0,0]
prendFrame =[0x00, 0x00, 0x80, 0x7f,0x00, 0x00, 0x80, 0x7f]
clock = time.clock()
while(True):
    clock.tick()
    img = sensor.snapshot()
    img = img.compress(quality=80)#压缩图片为jpg,质量为10%
    perFrame[0] = 0
    perFrame[1] = img.size()
    perFrame[2] =img.width()   # 图片宽度
    perFrame[3] = img.height() # 图片高度
    perFrame[4] =27
    img_bytes = img.to_bytes() #转换图片为byte数组
    #####此处为vota+上位机的前导帧,使用其他接收时自行修改#####
    for i in perFrame:
        buff=i.to_bytes(4,'little')
        uart_A.write(buff,len(buff))
    uart_A.write(bytes(prendFrame),len(bytes(prendFrame)))
    ######################################################
    uart_A.write(img_bytes,img.size())#以数组形式发送图片
    print(img)

更新日志:
1.实现了justfloat协议图片传输
2.更改了串口,现在可以和ide一起使用了
3.拉高了波特率,传输图片更快了


文章来源于Sipeed点灯鼠,原文链接:https://bbs.sipeed.com/thread/519

搬运请注明原文地址

3月8日更新

增加了反向图传功能

# Untitled - By: Lithromantic - 周日 2月 7 2021
#注意,复用uart后,ide将无法使用
from fpioa_manager import fm
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time,lcd
lcd.init(freq=15000000)
uart_A = UART(UART.UART1, 1152000, 8, 1, 0, timeout=1000, read_buf_len=4096)
img = []
clock = time.clock()
while(True):
        clock.tick()
        img=uart_A.read()
        if img!= None:
            #print(img)
            back = image.Image(img, from_bytes = True)
            uart_A.write("success")
            print(back)
            lcd.rotation(1)
            lcd.display(back)
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值