发 帖  
原厂入驻New
实战多通道高速精密测温仪的全系列设计教程,以实际项目为依托,提升工程师核心竞争力!→点击立即抢购←

[经验] 分享个用STM32F407做的网络摄像头

2016-11-21 13:56:11  11748 STM32F407 开发板
分享
13
先来看看硬件资源:         主控是STM32F407ZG,1MB flash,256KB RAM;外扩512KB SRAM,用于暂存camera 输出的JPEG数据,摄像头这块使用DCMI传输数据。

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


camera.JPG (22.22 KB, 下载次数: 0)
下载附件 保存到相册
2016-10-28 10:54 上传




关键代码:

     系统中建立了两个任务,task1用来处理服务器的一些周期性任务,task2用来发送JPEG数据流。
void TCP_Server_task1(void *arg)
{
        err_t err;
        err_t recv_err;
        struct netconn  *server_coon;

        struct netbuf  *recvbuf;            
        struct pbuf  *bufptr;      
        
        server_coon = netconn_new(NETCONN_TCP);                 //创建一个TCP链接
        netconn_bind(server_coon,IP_ADDR_ANY,8080);            //绑定端口
        netconn_listen(server_coon);                                           //监听
         
        while (1)   
        {
                  err = netconn_accept(server_coon,&client_conn);        //接收连接请求
                  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))                                   //是否为cam_start命令
                                                {                     
                                                        Video_flag=1;                                                                //标记开始采集
                                                        Frame=0;                                                                      //复位帧率
                                                        DCMI_Start();                                                               //开始采集
               
                                                }
                                                else if(!memcmp(Data_buff,Video_Stop,8))                          //是否为cam_stop命令
                                                {                     
                                                        Video_flag=0;                                                              //标记停止采集
                                               }
                                                
                                                netbuf_delete(recvbuf);                                                      //清除缓冲
                                        }
                                        else if(recv_err == ERR_CLSD)                                                    //关闭连接
                                        {
                                                netconn_close(client_conn);                                                
                                               netconn_delete(client_conn);                                                
                                                break;
                                        }
                                }
                                OStimeDly(2);
                  }
        }
}



void OV2640_Send_task2(void *pdata)
{                 
        u16  len,i,temp;
        u8  *ptr;
        u8   flag;
        
        while(1)
        {               
                if(Buf_DoutPtr!=Buf_DinPtr)
                {
                        len=(*Buf_DoutPtr);                        
                        ptr=(u8 *)(Buf_DoutPtr+1);                                 //指向2640数组
                        flag=0;
                        
                        for(i=0;i<len;i++)
                        {
                                if((ptr==0xFF)&&(ptr[i+1]==0xD9))           //查找JPEG数据尾部
                                {
                                        ptr[i+2]='\r';
                                        ptr[i+3]='\n';
                                        temp=i+4;                                             //数据长度
                                        flag=1;
                                        break;
                                }
                        }
                        if(flag)
                        {        
                                netconn_write(client_conn ,ptr,temp,NETCONN_COPY);  //发送数据
                                Frame++;                                       
                        }
                        
                        Buf_DoutPtr+=BUFF_SIZE;                        
                        if(Buf_DoutPtr==Buf_EndPtr)                                                    //到数据尾部了
                       Buf_DoutPtr=Buf_StartPtr;                                                         //重新开始               
            }
               
                OSTimeDly(1);
        }
}
105444locpjf6copofrxcf_png_thumb.png
zhifubao 2016-11-21 15:16:15
看图片拍摄挺清楚的。OV2640好像官方就有这个的驱动。
回复

举报

ruanshi 2016-11-21 15:38:21
zhifubao 发表于 2016-11-21 15:16
看图片拍摄挺清楚的。OV2640好像官方就有这个的驱动。

嗯,是的,OV2640
回复

举报

chenwei6991627 2016-11-21 16:04:38
哦,不错,有板子自己也玩玩
回复

举报

ruanshi 2016-11-21 16:07:02
chenwei6991627 发表于 2016-11-21 16:04
哦,不错,有板子自己也玩玩

确实还可以
回复

举报

猎国倾城 2016-11-21 16:31:17
bu cuo!
回复

举报

KYE_CQS 2016-11-21 18:26:26
谢谢大家的分享。谢谢。
回复

举报

chenfei11111111 2016-11-21 18:28:17
内容挺详细的,支持支持。
回复

举报

lee_st 2016-11-21 18:33:57
顶一下,很好的代码
1回复

举报

太子的空间 2016-11-21 19:44:04
代码看不懂,但图片是看的不错,
回复

举报

草房子 2016-11-22 11:03:10
不错,自己实际制作才能提高啊!
回复

举报

ruanshi 2016-11-22 15:30:25
草房子 发表于 2016-11-22 11:03
不错,自己实际制作才能提高啊!

对的,是的,实践出真理~~
回复

举报

xuchenwei_922 2016-11-22 17:49:18
码流、帧率是多少?
回复

举报

ruanshi 2016-11-22 17:55:13
太子的空间 发表于 2016-11-21 19:44
代码看不懂,但图片是看的不错,

呵呵确实不错
回复

举报

ruanshi 2016-11-22 17:56:40
xuchenwei_922 发表于 2016-11-22 17:49
码流、帧率是多少?

10
回复

举报

tcf895828806 2016-11-23 14:12:03
挺好的。。。。。。。。。。。。。
回复

举报

805570 2016-11-23 19:14:15
学习了,以后参照做一个
回复

举报

湘湘叶子 2016-11-24 13:49:49
谢谢楼主分享,学习了
回复

举报

ruanshi 2016-11-24 13:50:39
805570 发表于 2016-11-23 19:14
学习了,以后参照做一个

嗯嗯,可以保存下的
回复

举报

idianze 2016-11-24 14:15:31
谢谢楼主分享,学习了
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

12345下一页
发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表