你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享个用STM32F429做的网络摄像头  

[复制链接]
shanji 提问时间:2016-12-12 19:11 /
本帖最后由 shanji 于 2019-3-11 09:30 编辑

先来看看硬件资源:   
       主控是STM32F429IG,1MB flash,256KB RAM;外扩32MB SDRAM,用于暂存camera 输出的JPEG数据和LCD显存,摄像头这块使用DCMI传输数据。

简单实现原理:
       以太网使用lwip,netconn API编程,这种编程方式相比RAW 比较简单,只是需要OS的支持;然后,板子当服务器,PC当客户端,当建立连接后,服务器将采集到的摄像头数据发送到客户端显示。

162027lncmumfkoqu72cub.jpg

关键代码:

     系统(ucos_ii)中建立了两个任务,task1用来处理服务器的一些周期性任务,task2用来发送JPEG数据流。

/**
  * @brief  TCP服务器任务
  * @param  
  * @retval None
  */
void TCP_Server_task(void *arg)
{
        err_t err=0;
        err_t recv_err;
        struct netconn *server_coon; //服务器连接

        struct netbuf *recvbuf;             //接收数据netbuf指针        
        struct pbuf *bufptr;         //pbuf数据缓冲区指针
        
        server_coon = netconn_new(NETCONN_TCP);                 //创建一个TCP链接
        netconn_bind(server_coon,IP_ADDR_ANY,TCP_SERVER_PORT);  //绑定端口
        netconn_listen(server_coon);                            //进入监听模式
        server_coon->recv_timeout = 10;                         //禁止阻塞线程 等待10ms
         
        while (1)   
        {
                  err = netconn_accept(server_coon,&client_conn);        //接收连接请求
                  //printf("\r\nerr=0x%x\r\n",err);
                if (err == ERR_OK)                                     //正确说明有客户端联入
                  {                                                
                          while(1)
                                {                                
                                        if((recv_err = netconn_recv(client_conn,&recvbuf)) == ERR_OK)          //接收到数据且正确
                                        {               
                                                bufptr=recvbuf->p;                                  //得到数据指针
                                                memcpy(Data_buff,bufptr->payload,bufptr->tot_len);  //拷贝数据                                       
                                                Data_buff[bufptr->tot_len]='\0';                        //加入结束符
                                                
                                                if(!memcmp(Data_buff,Video_Start,9))               //开始采集
                                                {                     
                                                        Video_flag=1;                                   //标志位值1
                                                        CamFrame=0;                                   //帧率清零
                                                        cam_start();                                   //开始采集
                                                        RTC_ITConfig(RTC_IT_WUT,ENABLE);
                                                }
                                                else if(!memcmp(Data_buff,Video_Stop,8))            //关闭采集
                                                {                     
                                                        Video_flag=0;                                     //标志位值0,自动采集完最后一帧,自动停止
                                                        RTC_ITConfig(RTC_IT_WUT,DISABLE);
                                                }
                                                
                                                netbuf_delete(recvbuf);                             //清除缓冲netbuf
                                        }
                                        else if(recv_err == ERR_CLSD)       //关闭连接
                                        {
                                                netconn_close(client_conn);     //关闭连接
                                                netconn_delete(client_conn);    //删除连接
                                                break;
                                        }
                                }
                                
                  }
        }
}

/*********************分割线*************************/

/**
  * @brief  发送数据任务
  * @param  
  * @retval None
  */
void CAM_Send_task(void *arg)
{                 
        u16  len,i,temp;
        u8  *ptr;
        u8   flag;
        
        while(1)
        {                                

                if(Buf_DoutPtr!=Buf_DinPtr)
                {
                        len=(*Buf_DoutPtr);                        
                        ptr=(u8 *)(Buf_DoutPtr+1);                  //指向CAMbuf
                        flag=0;
                        
                        for(i=0;i<len;i++)
                        {
                                if((ptr==0xFF)&&(ptr[i+1]==0xD9))      //找数据尾
                                {
                                        ptr[i+2]='\r';
                                        ptr[i+3]='\n';
                                        temp=i+4;                               //有效数据长度
                                        flag=1;
                                        break;
                                }
                        }
                        if(flag)
                        {        
                                netconn_write(client_conn ,ptr,temp,NETCONN_COPY);  //发送数据
                                CamFrame++;                                       //帧率+1
                        }
                        
                          Buf_DoutPtr+=BUFF_SIZE;                        
                          if(Buf_DoutPtr==Buf_EndPtr)  Buf_DoutPtr=Buf_StartPtr;  //到最后一个了
                                                          //回到开头                        
            }

                OSTimeDly(1);
        }
}

现象:
UC截图20161209153253.png

OV5642


UC截图20161027163031.png

OV2640



如果关注的人多的话,我就收拾收拾上位机的代码,发给你们玩玩[PS:用的是labview,其实也没什么好玩的]。

【】红龙429_网络摄像头TCP.rar (1.64 MB, 下载次数: 639)

评分

参与人数 2 ST金币 +30 收起 理由
wofei1314 + 10
zero99 + 20

查看全部评分

2 收藏 15 评论92 发布时间:2016-12-12 19:11

举报

92个回答
shanji 最优答案 回答时间:2019-2-20 11:33:03
本帖最后由 shanji 于 2019-2-20 11:34 编辑

有没有人会搞在网页上显示摄像头画面的,输入ip就能显示,我现在只会显示静态的图像。


QQ截图20190220113028.jpg



shanji 回答时间:2019-4-16 09:34:27
daodanjishui 发表于 2019-4-14 21:05
楼主技术不错啊,但是你这个项目也很复杂啊。

没有不难的,就是把jpg数据发出去,没有任何上层协议,看看你也会的。难一点的是这个https://www.stmcu.org.cn/module/forum/thread-620067-1-1.html
shanji 回答时间:2017-2-25 16:24:18
这名比较叼 发表于 2017-2-24 09:02
请问楼主,你网口传输速度是多少呢?我现在用的udp通信,传输速度只有几百K,要是在系统上跑的话会不会快一 ...

没去统计过具体速度。速度慢,上系统也是差不多的,关键还是要找到慢的原因
daodanjishui 回答时间:2019-5-11 12:23:07
shanji 发表于 2019-2-20 11:33
有没有人会搞在网页上显示摄像头画面的,输入ip就能显示,我现在只会显示静态的图像。

两个月以后真的被你做出摄像头视频显示了,人才啊!应该参考了mjpg-streamer工程
Paderboy 回答时间:2016-12-12 19:20:47
多谢分享。。学习了。。。
jackten 回答时间:2016-12-12 19:35:19
谢谢分享                        
Stm32McuLover 回答时间:2016-12-12 19:35:33

多谢分享。。学习了。。。
leo121_3006061 回答时间:2016-12-12 19:43:22
谢谢分享,学习
pythonworld 回答时间:2016-12-12 20:09:04
谢谢分享,学习
netlhx 回答时间:2016-12-12 21:29:51
赞赞赞,32个赞
jinglixixi 回答时间:2016-12-13 08:23:56
多谢分享。
wyxy163@126.com 回答时间:2016-12-13 08:34:06
提示: 作者被禁止或删除 内容自动屏蔽
小小超 回答时间:2016-12-13 08:57:14
多谢分享。。学习了。。。
andypanfan 回答时间:2016-12-13 09:05:12
多谢分享。。学习了。。。
斜阳 回答时间:2016-12-13 09:17:51
谢谢分享
294479435@qq.co 回答时间:2016-12-13 11:27:14
这个厉害了word哥
zhangxu56726 回答时间:2016-12-13 14:56:52
我最近也在搞网络摄像头,能否分享下你的上位机软件呢,谢谢!
wolfgang 回答时间:2016-12-13 15:03:45

赞赞赞,48个赞
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版