不带fifo的OV7670 用20块的摄像头做WiFi实时传图小车( 三 )


在这里我设置了作,上位机作为,通过配置连接WIFI,然后访问我电脑的IP,就可以与上位机建立进行图片的传输 。
STM32与上位机机通信最好是要有自定的协议,要有帧头,校验位等,但这个数据量实在有点大,我就只设置了一个传输数据包大小的帧头,然后就粗暴的上传了,不过效果还蛮好的说
效果如下:

不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图
全损画质
3、STM32与进行交互
STM32对进行交互,官方给了许多的协议,例如MQTT,EDP和HTTP等,不过对于我来说,最快的还是直接使用API,用get获取数据点,用post上传图片 。
为了顺利的与进行交互,建议先使用网络调试助手进行调试,调试方面可以参考这个链接:利用串口网络助手上传数据、图片到平台以及获取数据(HTTP)_川哥子的博客-CSDN博客上传图片
对于图像传输,这是我上传的数据
POST http://api.heclouds.com/bindata?device_id=607169499&datastream_id=image HTTP/1.1api-key:your api-keyHost:api.heclouds.comContent-Length:3493
不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图
后面加上图像数据,图像数据可以是用上面链接给的一个小软件 。
在传输的时候需要注意的是,在传输末尾要加上两个换行符,这个很关键,没有这两个换行符数据上传就会有很多的问题 。另外的Api-key建议直接使用-api-key
在STM32的代码上,如下所示
u8 *p;int t =0;p=mymalloc(SRAMIN,32);//申请32字节内存sprintf((char*)p,"Content-Length:%d\r\n\r\n",pt_buf);u3_printf("POST http://api.heclouds.com/bindata?device_id=607169499&datastream_id=image&desc=testfile HTTP/1.1\r\n");u3_printf("api-key: your api key\r\n");u3_printf("Host:api.heclouds.com\r\n");u3_printf(p);for(t = 0;t
同理,获取的数据点
USART3_RX_STA=0;u3_printf("GET http://api.heclouds.com/devices/607169499/datastreams/direction HTTP/1.1\r\n");u3_printf("api-key:your api key\r\n");u3_printf("Host:api.heclouds.com\r\n\r\n");delay_ms(100);USART3_RX_STA=0;char *c1=strstr(USART3_RX_BUF, "current_value");return *(c1+16);
这里对于收到的数据可以使用cJSON进行解析,但需要注意的是,收到的数据还有一个HTTP的头,需要将他除去,如下所示
HTTP/1.1 200 OKDate: Wed, 01 Jul 2020 15:23:14 GMTContent-Type: application/jsonContent-Length: 133Connection: keep-aliveServer: Apache-Coyote/1.1Pragma: no-cache
因此为了方便使用,我直接使用了函数,通过查找来获取数据点的数据 。
4、上位机的编写
上位机的编写我是用的是C#来进行编写,下列展示一下主要的代码
void TSReceive(){aimSocket = mySocket.Accept();//服务端监听到的Socket为服务端发送数据的目标socketinfoLabel.Text = "连接成功";byte[] buffer = new byte[4];while (true){try{aimSocket.Receive(buffer, buffer.Length, SocketFlags.None);int contentLen = BitConverter.ToInt32(buffer, 0);int size = 0;MemoryStream ms = new MemoryStream();while (size < contentLen){//分多次接收,每次接收256个字节,byte[] bits = new byte[256];int r = aimSocket.Receive(bits, bits.Length, SocketFlags.None);//接收到监听的Socket的数据if (r == 0){MessageBox.Show("连接断开");break;}ms.Write(bits, 0, r);size += r;}Image img = Image.FromStream(ms);picBox.Image = null;picBox.Image = img;}catch{ }}}
上述代码是TCP 的线程,在该线程中,通过监听,获取数据然后将他显示到Image控件上 。
不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图
整体上位机布局
在控制指令方面,我设置了一个帧头,byte[]= new byte[2] { 0xA3, 0x20 };
虽然实际上并没有起到什么作用.......