在介绍OV7670之前先附上模块链接:点击购买OV7670摄像头模块
介绍代码前,首先来看之前写的文章:
OV7670 FIFO 30W摄像头介绍(一) — 整体介绍/SCCB时序
OV7670 FIFO 30W摄像头介绍(二) — 寄存器图示说明
OV7670 FIFO 30W摄像头介绍(三) — STM32F103驱动OV7670代码介绍

1.OV7670驱动跟上位机通信格式

目前上位机跟开发板是通过串口来通信,命令通信格式是json,摄像头数据是自定义格式,如果你没听过json,那么自行百度,跟OV7670相关的json格式分别如下:

包含:摄像头开启,摄像头关闭,设置亮度模式,设置饱和度,设置对比度,设置亮度,设置摄像头效果。
发送格式示例如下(以摄像头开启为例):

{"FUNC":"HW","OPERATE":"CAMERA_START","PARAM1":null,"PARAM2":null,"PARAM3":null,"PARAM4":null,"PARAM5":null,"PARAM6":null}

1)上位机json发送代码:

上位机用的c# winform,用的json库using Newtonsoft.Json,此库需要Newtonsoft.Json.dll库,发送代码如下:

private void json_construction_send(string func,string operate,string param1,string param2,string param3,string param4,string param5,string param6)
{json_commmand cmd = new json_commmand();cmd.FUNC = func;cmd.OPERATE = operate;cmd.PARAM1 = param1;cmd.PARAM2 = param2;cmd.PARAM3 = param3;cmd.PARAM4 = param4;cmd.PARAM5 = param5;cmd.PARAM6 = param6;string json_cmd = JsonConvert.SerializeObject(cmd);
#if  CONSOLE_DEBUGConsole.WriteLine(json_cmd);
#endifif (serialPort1.IsOpen){serialPort1.WriteLine(json_cmd);}
}

其中ov7670的operate字符串包括:

string operate_camera_start = "CAMERA_START";
string operate_camera_stop = "CAMERA_STOP";
string operate_camera_light_mode = "CAMERA_LIGHT";
string operate_camera_saturation = "CAMERA_SATURATION";
string operate_camera_brightness = "CAMERA_BRIGHTNESS";
string operate_camera_contrast = "CAMERA_CONTRAST";
string operate_camera_effect = "CAMERA_EFFECT";

2)单片机json接收解析代码

uint8_t uart_receive_parse(uint8_t *shell_string)
{uint8_t result = HW_ERR_OK;cJSON* parse_json = cJSON_Parse((const char *)shell_string);uint8_t* func_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"FUNC"))->valuestring;uint8_t* operate_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"OPERATE"))->valuestring;uint8_t* para1 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM1"))->valuestring;uint8_t* para2 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM2"))->valuestring;uint8_t* para3 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM3"))->valuestring;uint8_t* para4 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM4"))->valuestring;uint8_t* para5 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM5"))->valuestring;uint8_t* para6 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM6"))->valuestring;if(hw_strcmp((const char *)func_value,"HW") == 0){if(hw_strcmp((const char *)operate_value,"CAMERA_START") == 0){/* 开启摄像头 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_STOP") == 0){/* 关闭摄像头 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_LIGHT") == 0){/* 设置摄像头亮度模式 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_SATURATION") == 0){/* 设置摄像头饱和度 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_BRIGHTNESS") == 0){/* 设置摄像头亮度 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_CONTRAST") == 0){/* 设置摄像头对比度 */goto exit;}if(hw_strcmp((const char *)operate_value,"CAMERA_EFFECT") == 0){/* 设置摄像头效果 */goto exit;}result = HW_ERR_SHELL_NO_CMD;}if(hw_strcmp((const char *)shell_string,"shop220811498.taobao.com") == 0)HW_DEBUG("welcome to use our stm32f1 camera wifi board\n");elseHW_DEBUG("UART PARSE ERR:HW_ERR_SHELL_NO_CMD\n");result = HW_ERR_SHELL_NO_CMD;
exit:cJSON_Delete(parse_json);return result;
}

2.上位机图片


整个上位机是硬件测试例程的上位机,包括LED,OLED,SPI FLASH,摄像头,但是本文章只是拿OV7670做说明,整个上位机包括:
①串口配置区->包括串口打开,关闭,包括热插拔的检测
②功能测试区->包括LED,SPI,OLED,摄像头,贴图仅仅是OLED的测试
③串口调试区->包括可以接收开发板打印的log以及发送自定义的字符串给开发板

3.上位机跟驱动交互代码

1)摄像头开启


上位机代码:

private void bcamera_start_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_camera_start, null, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_START") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate CAMERA_START\n");hw_ov7670_init();operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

2)摄像头关闭


上位机代码:

private void bcamera_stop_Click(object sender, EventArgs e)
{json_construction_send(hw_func, operate_camera_stop, null, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_STOP") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate CAMERA_STOP\n");hw_ov7670_control(ov7670_ctl_stop);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

3)设置摄像头亮度模式


上位机代码:

private void bcamera_light_Click(object sender, EventArgs e)
{string light = ccamera_light.SelectedIndex.ToString();json_construction_send(hw_func, operate_camera_light_mode, light, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_LIGHT") == 0)
{uint8_t light = atoi((const char*)para1);HW_DEBUG("UART PARSE DEBUG:operate CAMERA_LIGHT\n");hw_ov7670_set_light_mode(light);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

4)设置摄像头饱和度


上位机代码:

private void bcamera_saturation_Click(object sender, EventArgs e)
{string saturation = ccamera_saturation.SelectedIndex.ToString();json_construction_send(hw_func, operate_camera_saturation, saturation, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_SATURATION") == 0)
{uint8_t saturation = atoi((const char*)para1);HW_DEBUG("UART PARSE DEBUG:operate CAMERA_SATURATION\n");hw_ov7670_set_color_saturation(saturation);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

5)设置摄像头亮度


上位机代码:

private void bcamera_brightness_Click(object sender, EventArgs e)
{string brightness = ccamera_brightness.SelectedIndex.ToString();json_construction_send(hw_func, operate_camera_brightness, brightness, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_BRIGHTNESS") == 0)
{uint8_t brightness = atoi((const char*)para1);HW_DEBUG("UART PARSE DEBUG:operate CAMERA_BRIGHTNESS\n");hw_ov7670_set_brightness(brightness);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

6)设置摄像头对比度


上位机代码:

private void bcamera_contrast_Click(object sender, EventArgs e)
{string contrast = ccamera_contrast.SelectedIndex.ToString();json_construction_send(hw_func, operate_camera_contrast, contrast, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_CONTRAST") == 0)
{uint8_t contrast = atoi((const char*)para1);HW_DEBUG("UART PARSE DEBUG:operate CAMERA_CONTRAST\n");hw_ov7670_set_contrast(contrast);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

7)设置摄像头效果


上位机代码:

private void bcamera_effect_Click(object sender, EventArgs e)
{string effect = ccamera_effect.SelectedIndex.ToString();json_construction_send(hw_func, operate_camera_effect, effect, null, null, null, null, null);
}

单片机代码:

if(hw_strcmp((const char *)operate_value,"CAMERA_EFFECT") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate CAMERA_EFFECT\n");uint8_t effect = atoi((const char*)para1);hw_ov7670_set_special_effect(effect);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

8)摄像头数据发送接收

上位机接受摄像头数据
通过串口来判断是否有CAML字符串,如果有后面的数据代表摄像头数据

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{if (serialPort1.IsOpen){try{string recv_data_string;int recv_data_count = serialPort1.BytesToRead;while (serialPort1.BytesToRead > 0){recv_data_string = serialPort1.ReadLine();if (recv_data_string.StartsWith("CAML")){if (recv_data_string.Length >= (320*2*2+4)){Color[] colors;colors = RGBToBitmap(recv_data_string.Substring(4, 1280));for (int Ycount = 0; Ycount < 320; Ycount++){OvImage.SetPixel(Xcount, Ycount, colors[Ycount]);}Xcount++;if (Xcount == 240)Xcount = 0;pcamera_box.Image = OvImage;}elseConsole.WriteLine("camera len error\n" + recv_data_string.Length);}else{t_data_recv.AppendText(recv_data_string + '\r' + '\n');}}}catch (Exception ex){return;}}
}

单片机发送

void hw_ov7670_get_data_send()
{uint32_t i, j;uint8_t color1,color2;if(ov7670_frame_interrupt){OV7670_RRST_L;OV7670_RCLK_L;OV7670_RCLK_H;OV7670_RCLK_L;OV7670_RRST_H;OV7670_RCLK_H;for(i=0; i<240; i++){if(ov7670_start){HW_DEBUG("CAML");for(j=0; j < 320; j++){OV7670_RCLK_L;color1=GPIOC->IDR&0XFF;OV7670_RCLK_H;OV7670_RCLK_L;color2=GPIOC->IDR&0XFF;OV7670_RCLK_H;HW_DEBUG("%02x",color2);HW_DEBUG("%02x",color1);}HW_DEBUG("\n");}elsebreak;}}ov7670_frame_interrupt=0;
}

OV7670 FIFO 30W摄像头介绍(四) --- OV7670上位机验证驱动相关推荐

  1. (兼容正点原子引脚)OV7670 FIFO 30W摄像头介绍(二) --- 寄存器图示说明

    在介绍OV7670之前先附上模块链接:点击购买OV7670摄像头模块 前面的文章介绍了OV7670以及SCCB的代码 (兼容正点原子引脚)OV7670 FIFO 30W摄像头介绍(一) - 整体介绍/ ...

  2. (兼容正点原子引脚)OV7670 FIFO 30W摄像头介绍(一) --- 整体介绍/SCCB时序

    在介绍OV7670之前先附上模块链接:点击购买OV7670摄像头模块 1. OV7670摄像头介绍 整体介绍 OV7670 是 OV(OmniVision)公司生产的一颗 1/6 寸的 CMOS VG ...

  3. 0.91寸 SSD1306 OLED介绍(四) --- 用上位机验证OLED显示屏

    在介绍0.91寸 SSD1306之前先附上模块链接:点击购买SSD1306 OLED显示模块 前面的文章已经详细说明了OLED的原理,指令,代码 0.91寸 SSD1306 OLED介绍(一) - 整 ...

  4. 深入学习Linux摄像头(四)三星平台fimc驱动详解

    深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头(二)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头 ...

  5. STM32驱动SDIO WIFI 介绍(十六) ---- 上位机UDP操作/代码

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  6. 疯壳AI开源无人机地面站上位机的使用和介绍

    地面站上位机使用和介绍 COCOFLY地面站上位机是配套COCOFLY无人机使用的,该地面站上位机功能非常的全.主要分为5大功能板块,分别是基本收发.飞控设置.波形显示.图形编队以及飞控状态. 1.1 ...

  7. 从零搭建树莓派远程监控小车,udp视频传输,qt上位机

    目录 前言 一.材料准备 二.连线方式 三.软件编程 软件编程主要有一下几个方面 (1)树莓派视频传输 (2)esp8266代码 (3)上位机编程 四.总结 前言 最近刚准备完期末机器人驱动的课设,本 ...

  8. Cortex-M3单片机的IAP在线升级上位机和下位机

    最近有个项目要做在线升级功能,我也是第一次做,把学习的过程总结下,希望能够帮助到 其他人吧.本篇博客主要介绍两个部分,下位机和上位机. 首先说下要实现功能: 1.上位机能够把APP的bin文件烧写进下 ...

  9. Matlab上位机开发(一) —— 了解上位机

    1. 上位机的作用 在嵌入式项目开发中,无论是单片机项目.嵌入式Linux项目.FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形.温度等) 用户控制(LED,继电器等) 文件传输 ...

最新文章

  1. 大型电商网站详情页是如何支撑亿级流量访问的?
  2. 2018年中国人工智能100强研究报告
  3. GCC中的分支预测(likely和unlikey)
  4. 超好用的几款可视化管理工具,你有吗?
  5. 常见通信协议HTTP、TCP、UDP的简单介绍
  6. 利用ssh-agent提升ansible使用的方便及安全性
  7. (4)Matplotlib_零碎知识点
  8. mysql 网页员工登记表_作业1:小型考勤登记表
  9. 毕业季音乐计算机简谱,毕业季简谱(歌词)-贺敬轩演唱-桃李醉春风记谱
  10. 说说在JAVA中使用Redis,以及Redis分布锁
  11. 阿里滑块 某宝的x82y解决方法、x5sec
  12. 浙江省计算机程序比赛员,计算机学子在“图森未来杯”第十七届浙江省大学生程序设计竞赛中斩获金奖...
  13. JavaScript-修炼之路第五层
  14. 如何自动翻译整篇PDF文件?教你两种自动翻译方法
  15. 爬虫速成(四):数据存储
  16. 数据结构与算法——第一章——绪论
  17. 35岁后最可怕的事,就是成为职场中的奢侈品
  18. 我们的空间是它圆——基于Poicare对宇宙的模型
  19. 正胶显影液/正胶稀释剂/SU8 显影液/RD-HMDS/OMNICOAT光刻胶配套
  20. java(11):tomcat简介与使用(上)

热门文章

  1. 互联网进入中国的先驱是谁?
  2. MATLAB下MSS (Marine Systems Simulator)工具箱安装方式
  3. fetch 服务器不响应,fetch的常见问题及其解决办法
  4. hive-sql简单查询where筛选
  5. Python爬虫的工具列表
  6. 导数存在的充分必要条件是左导数和右导数都存在,且相等
  7. Linux:fork是什么、使用方法、缓冲区问题、frok使用实例
  8. Muduo库源码剖析(三)——获取线程tid方法
  9. 沃顿商学院自我管理课——谢丽尔.桑德伯格
  10. [P1149] TSOI南湖探险(费用流)