本节我们将进行VOFA+的tcp协议使用。 通过tcp,我们将可以通过网络,无线图传到上位机,很有实际意义。 由于博主使用的是bit板,自带的没有网卡固件,本节我们将使用外挂网卡(esp01s,小巧玲珑)
关于K10如何使用外挂网卡,我将于另外一个帖子详细讲解,本贴不另作赘述。 将esp01s和K210链接 第一步,配置wifi及socket
from fpioa_manager import fm fm.register(10, fm.fpioa.UART1_TX, force=True) fm.register(9, fm.fpioa.UART1_RX, force=True) from machine import UART import sensor, image, time import struct import network,socket from setuart import setUART as SU #wifi config ssid="1234" key="11111111" baudrate=2048000 SU.setuart(baudrate) uart = UART(UART.UART1,baudrate, timeout=1000, read_buf_len=10240)#创建外部可访问的uart net=network.ESP8285(uart) net.connect(ssid, key) A=net.ifconfig()#cheak ip address. Your sock addr should be same to this print(A) #wifi config end #socket config ADDR = ("192.168.137.1", 1347) sock = socket.socket() sock.connect(ADDR) sock.settimeout(10) #socket config end
这里需要注意的是,esp01s默认的串口波特率是115200,传输数据时会很慢。于是我通过setuart,在esp01s链接后,修改波特率为204800(这里使用的是软配置,重启后将恢复到115200) sock的地址,要与ifconfig打印出来的第三个数保持一致。 如
(192.168.137.196, 255.255.255.0, 192.168.137.1, 0, 0, d2:57:7b:35:a7:e1, 1234)
连接上sock以后,我们就可以发送数据了。这里继续使用justfloat协议。 稍作修改,将uart.write改为sock.send即可使用。
img = sensor.snapshot() img = img.compress(quality=10)#压缩图片为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) sock.send(buff) sock.send(bytes(prendFrame)) ###################################################### block = int(len(img_bytes)/2048) for i in range(block): sock.send(img_bytes[i*2048:(i+1)*2048]) sock.send(img_bytes[block*2048:])#按块发送
这里需要注意的是,tcp发包时有数据上限,所以要将数据切割成小于上限的n个小块发送。 vofa+打开后,设置为下图所示:
效果如图所示:
视频就不上了,惨不忍睹。。效果只能达到1fps,调了一下午没定位到问题,目测esp01s体质太差?或者是杜邦线太长?有能解决的希望回复下。
最后,贴上setuart源码:
import time, network from machine import UART from fpioa_manager import fm class setUART(): def init(): fm.register(10, fm.fpioa.UART1_TX, force=True) fm.register(9, fm.fpioa.UART1_RX, force=True) __class__.uart = UART(UART.UART1, 115200, timeout=1000, read_buf_len=8192) def _at_cmd(cmd="AT ", resp="OK ", timeout=20): __class__.uart.write(cmd) # "AT+GMR " time.sleep_ms(timeout) tmp = __class__.uart.read() # print(tmp) if tmp and tmp.endswith(resp): return True return False def setuart(baudrate=1152000, reply=5): __class__.init() for i in range(reply): print(set baudrate=%d...%baudrate) time.sleep_ms(500) # at start > 500ms if __class__._at_cmd(timeout=500): break __class__._at_cmd() __class__._at_cmd(AT+UART_CUR=%d,8,1,0,0 %baudrate, "OK ")#设置当前波特率,重启模块恢复到115200 if __name__ == "__main__": setUART.setuart() uart2 = UART(UART.UART1,1152000, timeout=1000, read_buf_len=10240) while(True): uart2.write("AT ") B=uart2.read() print(B)
补一下代码:
# Untitled - By: Lithromantic - 周二 3月 9 2021 from fpioa_manager import fm fm.register(10, fm.fpioa.UART1_TX, force=True) fm.register(9, fm.fpioa.UART1_RX, force=True) from machine import UART import sensor, image, time import struct import network,socket from setuart import setUART as SU #wifi config ssid="1234" key="11111111" baudrate=1152000 SU.setuart(baudrate,1) uart = UART(UART.UART1,baudrate, timeout=1000, read_buf_len=10240)#创建外部可访问的uart net=network.ESP8285(uart) net.connect(ssid, key) #A=net.ifconfig()#cheak ip address. Your sock addr should be same to this ADDR={} ADDR[0]=net.ifconfig()[2] print(ADDR[0]) #wifi config end #socket config ADDR = ("{}".format(ADDR[0]), 1347) sock = socket.socket() sock.connect(ADDR) sock.settimeout(10) #socket config end #sensor.config sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_windowing((200,200)) sensor.skip_frames(time = 2000) #sensor.config end 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=10)#压缩图片为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) sock.send(buff) sock.send(bytes(prendFrame)) ###################################################### block = int(len(img_bytes)/2048) # for i in range(block): # sock.send(img_bytes[i*2048:(i+1)*2048]) # sock.send(img_bytes[block*2048:])#按块发送 sock.send(img_bytes)#以数组形式发送图片 # time.sleep_ms(20)
3.12更新
更新日志:
1.大幅修改了代码排版,美观度提升了
2.完善了程序逻辑,稳定性提升了
# Untitled - By: Lithromantic - 周二 3月 9 2021 from fpioa_manager import fm fm.register(10, fm.fpioa.UART1_TX, force=True) fm.register(9, fm.fpioa.UART1_RX, force=True) from machine import UART import sensor, image, time import network,socket,gc from setuart import setUART as SU perFrame=[0,0,320,240,27,0x7F800000,0x7F800000] ssid="1234" key="11111111" def set_net(baudrate=1152000): #wifi config SU.setuart(baudrate,1) uart = UART(UART.UART1,baudrate, timeout=1000, read_buf_len=10240)#创建外部可访问的uart net=network.ESP8285(uart) net.disconnect() net.connect(ssid, key) #A=net.ifconfig()#cheak ip address. Your sock addr should be same to this ADDR={} ADDR[0]=net.ifconfig()[2] print(ADDR[0]) #wifi config end #socket config ADDR = ("{}".format(ADDR[0]), 1347) return ADDR #socket config end def set_img(): #sensor.config sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000) #sensor.config end def get_img(quality=70): img = sensor.snapshot() img = img.compress(quality)#压缩图片为jpg,质量为10% perFrame[1] = img.size() img_bytes = img.to_bytes() #转换图片为byte数组 return img_bytes def send_img(img_bytes): sendbuff=b for i in perFrame: buff=i.to_bytes(4,little) sendbuff=sendbuff+buff sock.send(sendbuff)#以数组形式发送图片 block = int(len(img_bytes)/2048) for i in range(block): sock.send(img_bytes[i*2048:(i+1)*2048]) sock.send(img_bytes[block*2048:]) clock = time.clock() sock = socket.socket() sock.connect(set_net(2048000)) sock.settimeout(10) set_img() while(True): send_img(get_img(50))
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290769.html