亚博k210 按键 存储图片到sd卡中

亚博k210 按键 存储图片到sd卡中

目前只完成了初步功能,存储到sd卡过程中有时候会卡死在f_open函数中。
如果有大佬知道咋解决问题,麻烦告诉我一下,万分感激。

#include
#include
#include
#include “unistd.h”
#include “rgb2bmp.h”
#include “ff.h”
#include “sdcard.h”
#include “lcd.h”

BmpHead m_BMPHeader;
InfoHead m_BMPInfoHeader;

FIL file;
FRESULT ret = FR_OK;
unsigned char bmp_buffer[CAM_WIDTH_PIXELCAM_HIGHT_PIXEL3]; //bmp图像数据地址

int sd_check_(void)
{
if (check_sdcard())
{
lcd_draw_string(16, 120, “sdcard err”, RED);
return -1;

}

if (check_fat32())
{
    lcd_draw_string(16, 120, "fat32 err", RED);
    return -2;
}
bmp_init();
return 0;

}

void bmp_init(void) //初始化bmp图像头
{
m_BMPHeader.bfType[0]=‘B’;
m_BMPHeader.bfType[1]=‘M’;
m_BMPHeader.imageSize=CAM_WIDTH_PIXELCAM_HIGHT_PIXEL3+54;
m_BMPHeader.blank=0;
m_BMPHeader.startPosition=54;

 m_BMPInfoHeader.Length=40;
 m_BMPInfoHeader.width=CAM_WIDTH_PIXEL;
 m_BMPInfoHeader.height=-CAM_HIGHT_PIXEL; //正负可以改变图片的上颠倒  -值为正向
 m_BMPInfoHeader.colorPlane=1;
 m_BMPInfoHeader.bitColor=24;
 m_BMPInfoHeader.zipformat=0;
 m_BMPInfoHeader.realSize=3*CAM_WIDTH_PIXEL*CAM_HIGHT_PIXEL;
 m_BMPInfoHeader.xPels=0;
 m_BMPInfoHeader.yPels=0;
 m_BMPInfoHeader.colorUse=0;
 m_BMPInfoHeader.colorImportant=0;

}

void rgb2bmparry(uint32_t rgb_buffer)
{
//rgb 转数组 找出rgb数据
long nData = (CAM_WIDTH_PIXEL
CAM_HIGHT_PIXEL)/2;//这里的rgb_buffer为32位存储有两个rgb565数据
unsigned char* pVisit = bmp_buffer;

long i =0;
unsigned char R,G,B;
uint16_t  rgb_buffer_tmp;
printf("****save end1***\n");
while(i>5)&0x3f;
   B = (rgb_buffer_tmp>>11)&0x1f;
   B = B<<3;
   G = G<<2;
   R = R<<3;
  *pVisit=R;pVisit++;
  *pVisit=G;pVisit++;
  *pVisit=B;pVisit++;

   rgb_buffer_tmp = *rgb_buffer>>16; //取出高16位
   R = rgb_buffer_tmp&0x1f;
   G = (rgb_buffer_tmp>>5)&0x3f;
   B = (rgb_buffer_tmp>>11)&0x1f;
   B = B<<3;
   G = G<<2;
   R = R<<3;
  *pVisit=R;pVisit++;
  *pVisit=G;pVisit++;
  *pVisit=B;pVisit++;

  rgb_buffer++;
  i++;
 }

}
int rgb2bmp_save(uint32_t *rgb_buffer,TCHAR path)
{
uint32_t v_ret_len = 0;
rgb2bmparry(rgb_buffer);
//文件存储
// printf(“/sd_write_file/\n”);
/
打开文件,如果文件不存在,则新建 */
printf(“xxx%d\r\n”,ret);
if ((ret = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE)) != FR_OK) //BUG点
{
printf(“open file %s err[%d]\n”, path, ret);
return ret;
}
else
{
// printf(“Open %s ok\n”, path);
}

printf("yyy%d\r\n",ret);
ret = f_write(&file,  &m_BMPHeader.bfType,sizeof(m_BMPHeader.bfType), &v_ret_len);
ret = f_write(&file, &m_BMPHeader.imageSize, sizeof(m_BMPHeader.imageSize), &v_ret_len);
ret = f_write(&file, &m_BMPHeader.blank, sizeof(m_BMPHeader.blank),&v_ret_len);
ret = f_write(&file, &m_BMPHeader.startPosition, sizeof(m_BMPHeader.startPosition), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.Length,sizeof(m_BMPInfoHeader.Length), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.width,sizeof(m_BMPInfoHeader.width), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.height,sizeof(m_BMPInfoHeader.height), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.colorPlane,sizeof(m_BMPInfoHeader.colorPlane), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.bitColor,sizeof(m_BMPInfoHeader.bitColor), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.zipformat,sizeof(m_BMPInfoHeader.zipformat), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.realSize,sizeof(m_BMPInfoHeader.realSize), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.xPels,sizeof(m_BMPInfoHeader.xPels), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.yPels,sizeof(m_BMPInfoHeader.yPels), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.colorUse,sizeof(m_BMPInfoHeader.colorUse), &v_ret_len);
 ret = f_write(&file, &m_BMPInfoHeader.colorImportant,sizeof(m_BMPInfoHeader.colorImportant), &v_ret_len);
 uint32_t mul_write_cnt=0;  //多次写入  避免栈溢出   CAM_WIDTH_PIXEL*CAM_HIGHT_PIXEL
 for(mul_write_cnt=0;mul_write_cnt*CAM_WIDTH_PIXEL<3*CAM_WIDTH_PIXEL*CAM_HIGHT_PIXEL;mul_write_cnt++) //崩溃 点  原因  送入的数据大于栈的大小要分开写进去
 {
      ret = f_write(&file,bmp_buffer+mul_write_cnt*CAM_WIDTH_PIXEL,CAM_WIDTH_PIXEL, &v_ret_len);
 }
f_close(&file);
return 0;

}

FRESULT sd_write_file(TCHAR *path,uint8_t *data)
{
FIL file;
FRESULT ret = FR_OK;
uint32_t v_ret_len = 0;

/* 打开文件,如果文件不存在,则新建 */
if ((ret = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE)) != FR_OK)
{
    printf("open file %s err[%d]\n", path, ret);
    return ret;
}
else
{
    printf("Open %s ok\n", path);
}
/* 写入数据 */
ret = f_write(&file, data, sizeof(data), &v_ret_len);
if (ret != FR_OK)
{
    printf("Write %s err[%d]\n", path, ret);
}
else
{
    printf("Write %d bytes to %s ok\n", v_ret_len, path);
}
/* 关闭文件 */
f_close(&file);
return ret;

}

FRESULT sd_read_file(TCHAR *path)
{
FIL file;
FRESULT ret = FR_OK;
uint32_t v_ret_len = 0;

/* 检测文件状态 */
FILINFO v_fileinfo;
if ((ret = f_stat(path, &v_fileinfo)) == FR_OK)
{
    printf("%s length is %lld\n", path, v_fileinfo.fsize);
}
else
{
    printf("%s fstat err [%d]\n", path, ret);
    return ret;
}

/* 只读方式打开文件 */
if ((ret = f_open(&file, path, FA_READ)) == FR_OK)
{
    char v_buf[64] = {0};
    ret = f_read(&file, (void *)v_buf, 64, &v_ret_len);
    if (ret != FR_OK)
    {
        printf("Read %s err[%d]\n", path, ret);
    }
    else
    {
        printf("Read :> %s \n", v_buf);
        printf("total %d bytes lenth\n", v_ret_len);
    }
    /* 关闭文件 */
    f_close(&file);
}
return ret;

}
.h文件

//rgb2bmp.h文件
#include
#include “ff.h”
#include “dvp_cam.h”
typedef unsigned char BYTE;
typedef unsigned short WORD;
// BMP图像各部分说明如下
/***********
第一部分 位图文件头
该结构的长度是固定的,为14个字节,各个域的依次如下:
2byte :文件类型,必须是0x4d42,即字符串"BM"。
4byte :整个文件大小
4byte :保留字,为0
4byte :从文件头到实际的位图图像数据的偏移字节数。
/
typedef struct
{
char bfType[2];
int imageSize;
int blank;
int startPosition;
}BmpHead;
/
********
/*********************
第二部分 位图信息头
该结构的长度也是固定的,为40个字节,各个域的依次说明如下:
4byte :本结构的长度,值为40
4byte :图像的宽度是多少象素。
4byte :图像的高度是多少象素。
2Byte :必须是1。
2Byte :表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。
4byte :指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。
4byte :指定实际的位图图像数据占用的字节数,可用以下的公式计算出来:
图像数据 = Width’ * Height * 表示每个象素颜色占用的byte数(即颜色位数/8,24bit图为3,256色为1)
要注意的是:上述公式中的biWidth’必须是4的整数倍(不是biWidth,而是大于或等于biWidth的最小4的整数倍)。
如果biCompression为BI_RGB,则该项可能为0。
4byte :目标设备的水平分辨率。
4byte :目标设备的垂直分辨率。
4byte :本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的(颜色位数)次幂,如颜色位数为8,2^8=256,即256色的位图
4byte :指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。
***********************************/
typedef struct

{
int Length;
int width;
int height;
WORD colorPlane;
WORD bitColor;
int zipformat;
int realSize;
int xPels;
int yPels;
int colorUse;
int colorImportant;
/* void show()

{
    printf("infoHead Length:%dn",Length);
    printf("width&height:%d*%dn",width,height);
    printf("colorPlane:%dn",colorPlanE);
    printf("bitColor:%dn",bitColor);
    printf("Compression Format:%dn",zipformat);
    printf("Image Real Size:%dn",realSizE);
    printf("Pels(X,Y):(%d,%d)n",xPels,yPels);
    printf("colorUse:%dn",colorUsE);
    printf("Important Color:%dn",colorImportant);
}*/

}InfoHead;
/***************************
/***************************
第三部分 调色盘结构 颜色表
对于256色BMP位图,颜色位数为8,需要2^8 = 256个调色盘;
对于24bitBMP位图,各象素RGB值直接保存在图像数据区,不需要调色盘,不存在调色盘区
rgbBlue: 该颜色的蓝色分量。
rgbGreen: 该颜色的绿色分量。
rgbRed: 该颜色的红色分量。
rgbReserved:保留值。
/
typedef struct
{ BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
/
void show(void)
{
printf(“Mix Plate B,R:%d %d %dn”,rgbBlue,rgbGreen,rgbRed);
}
/
}RGBMixPlate;
/
******
RGB加上头部信息转换成BMP
参数說明:
rgb_buffer :rGB数据文件中的信息
nData :rGB数据的长度
nWidth :图像宽度的像素数
nHeight :图像高度的像素数
fp1 :所存放的文件
*****************************/

int rgb2bmp_save(uint32_t *rgb_buffer,TCHAR *path);
void rgb2bmparry(uint32_t *rgb_buffer);
FRESULT sd_read_file(TCHAR *path);
FRESULT sd_write_file(TCHAR *path,uint8_t *data);
int sd_check_(void);//综合到一个函数的sd卡检测
void bmp_init(void);

你可能感兴趣的:(c++,c语言,开发语言)