原子哥求助 !!! 关于0V7670摄像头采集的一帧数据,直接通过串口发送出来

2019-08-14 18:06发布

  最近在调试0V7670采集一帧的数据,然后通过串口发出来,在一帧数据发送到串口之前,我已经将BMP文件的文件头先发送到串口了,然后再发送一帧的图片数据,在串口助手上可以看到发过来的数据,但是保存为BMP的文件格式之后,再电脑上打开,并不能显示出。关键的代码如下 : 求原子哥帮帮忙void camera_refresh(void){
        u16 i;
        u32 j;
        u16 color;
        u16 bmpheadsize;                                  
        BITMAPINFO hbmp;               
        u16 *databuf;                                                  
        u16 pixcnt=0;               
        bmpheadsize=sizeof(hbmp);
        mymemset((u8*)&hbmp,0,sizeof(hbmp));   
        hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
        hbmp.bmiHeader.biWidth=320;                
        hbmp.bmiHeader.biHeight=240;        
        hbmp.bmiHeader.biPlanes=1;                        
        hbmp.bmiHeader.biBitCount=16;                
        hbmp.bmiHeader.biCompression=BI_BITFIELDS;
        hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmpêy¾YÇø′óD¡                          
        hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM&#184;&#241;ê&#189;±ê&#214;&#190;
        hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//&#213;&#251;&#184;&#246;bmpμ&#196;′óD&#161;
  hbmp.bmfHeader.bfOffBits=bmpheadsize;//μ&#189;êy&#190;Y&#199;&#248;μ&#196;&#198;&#171;ò&#198;
        hbmp.RGB_MASK[0]=0X00F800;                         //oìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[1]=0X0007E0;                         //&#194;ìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[2]=0X00001F;                         //à&#182;é&#171;&#209;ú&#194;&#235;
  for(i=0; i<sizeof(hbmp);i++)  //í¨1y′&#174;&#191;ú·¢&#203;í&#189;á11ì&#229;
        {
  USART_SendData(USART1,*((u8*)&hbmp+i));
        while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
   delay_ms(1);
        }               
        if(ov_sta)
        {
                OV7670_RRST=0;                                //&#191;aê&#188;&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                                //&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;&#189;áê&#248;
                OV7670_RCK_H;
                for(j=0;j<76800;j++)
                {
                        OV7670_RCK_L;
                        color=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;
                        color<<=8;  
                        OV7670_RCK_L;
                        color|=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;


       USART1->DR=color;
                   while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);       
                }  
  while(1);               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
肖金辉
2019-08-14 21:59
大致已经找到问题了 ,OV7670代码里面输出的是RGB565的格式就是说输出的来的是16为的数据,FIFO是以8个字节8字节输出的 所以程序里接收数据的时候color左移的8位,如果把color里面的数据直接送到串口,串口只能接收8为的数据,例外的8为数据会丢失,解决办法是有三个,第一种 改变OV7670的初始化序列,让ov7670输出8位的数据(具体是什么格式,我还要看看说明书),第二种,直接把color16位的数据保存到SD卡,自己填写BMP报头,保存之后图片会在SD卡里面 ,还有一种就是直接把接收数据的循环体代码改下,接收76800*2个数据,此时不要把COLOR进行移位操作,串口就是一个fifi的桥梁。然后在上位机上处理数据。。。

一周热门 更多>