基于C语言实现的单片机传输的VGA图像数据生成bmp文件
参考硬件:stm32(但其实是个能带动ov7725有串口的单片机就行)、ov7725,上位机(电脑)
实现原理:ov7725通常输出QVGA/VGA的240*320图像,一个像素点由RBG565(16bits)表示,但常用的电脑bmp像素由BGR888构成(又称bmp24),这需要小小的进行一下像素点的数据处理,然后就是编写电脑串口和bmp文件头实现串口数据接收以及自动生成bmp
建议搜索查阅:因为有点想偷懒,把编写时涉及到的知识点罗列一下(当初在csdn一个个查的,都可以查到很好的解说昂),不再详细解说,见谅
- c语言实现rgb565转bmp24(实现像素点的格式变化)
- c语言调用windows自带库编写串口(实现串口在c语言里的调用,可以存到想存的数组里,不然你把数据用串口助手传到txt里面还真不好弄,他那个是utf8格式)
- c语言生成bmp文件(教你打造bmp文件头,bmp24的文件头最简单了,所以建议先做好数据处理)
- 其他
下面是程序代码,需要更改的地方我用中文表达出来了
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <winnt.h>
#include "rgb2bmp.h"
int main()
{
int cnt;
//char* txtfile="C:\\Users\\17001\\Desktop\\compare2.txt" ;
DWORD dwLength;//unsigned long
unsigned short recvBuf[76800];//定义一个x个16位的数组
DWORD dwactlen;//unsigned long
char psendbuf[32] = "test\n";//定义字符串数组
char ch;//定义字符型变量ch
DCB myDCB;//结构体数组,常用来定义串口
HANDLE m_hComm;//定义一个句柄
m_hComm = CreateFile(
"COM3:",//要打开的文件的名字 (修改为com3)
GENERIC_READ | GENERIC_WRITE, //对设备允许读和写
0, //独占方式(非共享模式)
NULL,
OPEN_EXISTING, //打开而不是创建(创建方式),要求文件必须已存在
0,
NULL
);
if (m_hComm == (HANDLE)-1) //打开串口失败返回
{
printf("打开串口失败");
return 0;
}
//得到打开串口的当前属性参数,修改后再重新设置串口。
if (!GetCommState(m_hComm, &myDCB))
{
printf("GetCommState error");
return FALSE;
}
//设置串口参数
myDCB.BaudRate = CBR_115200; // 设置波特率115200
myDCB.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
myDCB.fParity = NOPARITY; // 修改为无奇偶校验
myDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
myDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
myDCB.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control
myDCB.fDsrSensitivity = FALSE; // DSR sensitivity
myDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
myDCB.fOutX = FALSE; // No XON/XOFF out flow control
myDCB.fInX = FALSE; // No XON/XOFF in f