爱板网论坛

查看: 596|回复: 4

[资料] 分享个用STM32F407做的网络摄像头

[复制链接]

15

主题

0

好友

404

积分

秀才

Rank: 3Rank: 3

该用户从未签到

发表于 2016-11-21 14:03:35 |显示全部楼层
先来看看硬件资源:         主控是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);
        }
}
回复

使用道具 举报

167

主题

1

好友

3332

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    昨天 08:48
  • 签到天数: 829 天

    连续签到: 7 天

    [LV.10]以坛为家III

    发表于 2016-11-21 19:36:10 |显示全部楼层
    好像在别的论坛见过
    回复

    使用道具 举报

    15

    主题

    0

    好友

    404

    积分

    秀才

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2016-11-22 14:36:20 |显示全部楼层
    stary666 发表于 2016-11-21 19:36
    好像在别的论坛见过

    嗯,我觉得还可以,就分享过来了
    回复

    使用道具 举报

    167

    主题

    1

    好友

    3332

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    昨天 08:48
  • 签到天数: 829 天

    连续签到: 7 天

    [LV.10]以坛为家III

    发表于 2016-11-23 09:04:24 |显示全部楼层
    哦,我说见过了
    回复

    使用道具 举报

    2

    主题

    0

    好友

    43

    积分

    白丁

    Rank: 1

    该用户从未签到

    发表于 2016-12-8 15:17:43 |显示全部楼层
    值得收藏,学习。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-12-18 05:32 , Processed in 0.137233 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部