⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagedisview.cpp

📁 串口通信显示图像
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ImageDisView.cpp : implementation of the CImageDisView class
//

#include "stdafx.h"
#include "ImageDis.h"

#include "ImageDisDoc.h"
#include "ImageDisView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImageDisView

IMPLEMENT_DYNCREATE(CImageDisView, CView)

BEGIN_MESSAGE_MAP(CImageDisView, CView)
	//{{AFX_MSG_MAP(CImageDisView)
	ON_COMMAND(ID_OPEN_PORT, OnOpenPort)
	ON_WM_CREATE()
	ON_COMMAND(ID_DIS_IMAGE, OnDisImage)
	ON_COMMAND(ID_MENU_CHAZHI, OnMenuChazhi)
	ON_COMMAND(ID_INI_IMAGE, OnIniImage)
	ON_COMMAND(ID_SAVE_IMAGE, OnSaveImage)
	ON_UPDATE_COMMAND_UI(IDR_COM_INF,OnUpdateCom)
	ON_UPDATE_COMMAND_UI(ID_COM_DATA_NUM,OnUpdateComData)
	ON_COMMAND(ID_INI_COLOR_IMAGE, OnIniColorImage)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CImageDisView, CView)
//{{AFX_EVENTSINK_MAP(CAboutDlg)
  ON_EVENT(CImageDisView, IDC_MSCOMM1, 1 , OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageDisView construction/destruction

CImageDisView::CImageDisView()
{
	// TODO: add construction code here
    m_ptrData=NULL;
	m_ptrDisMemory=NULL;
	m_ptrInteData=NULL;
	m_bPortOpen=false;
	m_strChuankou="";
	m_intDataCount=0;
    m_bSingleEnd=false;
	m_nxPos=401;
	m_nyPos=0;
	m_nScount=0;
	m_bIniColorImage=false;
}
void CImageDisView::OnUpdateCom(CCmdUI *pCmdUI)
{   

    CString s;
	if(m_bPortOpen)
	{
		if(m_nComNum==1) s.Format("COM1:Open,%d,8,n,1",m_nBaud);
        if(m_nComNum==2) s.Format("COM2:Open,%d,8,n,1",m_nBaud);
		pCmdUI->SetText(s);
	}
}
void CImageDisView::OnUpdateComData(CCmdUI *pCmdUI)
{   

    CString s;
	float m=0;
    int m1=0;
	if(m_bPortOpen)
	{
		m=100*(float)m_intDataCount/(float)(m_nRowNum*m_nColumnNum);
		m1=m;
		s.Format("进度: %d/100",m1);
		pCmdUI->SetText(s);
	}
}

CImageDisView::~CImageDisView()
{
	if(m_ptrData!=NULL) delete m_ptrData;
	if(m_ptrDisMemory!=NULL) delete m_ptrDisMemory;
	if(m_ptrInteData!=NULL) delete m_ptrInteData;
}

BOOL CImageDisView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageDisView drawing

void CImageDisView::OnDraw(CDC* pDC)
{
	CImageDisDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	_disbmp(m_bPortOpen,pDC);
	
	_texttoview();
   
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CImageDisView diagnostics

#ifdef _DEBUG
void CImageDisView::AssertValid() const
{
	CView::AssertValid();
}

void CImageDisView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CImageDisDoc* CImageDisView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDisDoc)));
	return (CImageDisDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CImageDisView message handlers

void CImageDisView::OnOpenPort() 
{	
	CDlgPortSetClass pdlg;
	int nComNum=0;
	int nBaud=0;
	int nRowOrColu=0;
	int nRowNum=0;
	int nColumnNum=0;
	int nFrame=0;
	CString ss;
	
	if(pdlg.DoModal()==IDOK)
	{
	   nComNum=pdlg.m_nComNum;
	   nBaud=pdlg.m_nBaud;
       nRowOrColu=pdlg.m_nRowOrColu;
	   nRowNum=pdlg.m_nRowNum;
	   nColumnNum=pdlg.m_nColumnNum;
	   nFrame=pdlg.m_nFrame;
	   //判断
	   
	   m_nComNum=nComNum+1;
	   if(nBaud==id_baud_9600) m_nBaud=9600;
       if(nBaud==id_baud_19200) m_nBaud=19200;
       m_nRowOrColu=nRowOrColu;
       m_nRowNum=nRowNum;
       m_nColumnNum=nColumnNum;
       m_nFrame=nFrame;
       
       //  
	   if(m_nRowNum>0&&m_nColumnNum>0)
	   {
          int row=0,column=0;
		  int len=0;
		  len=m_nRowNum*m_nColumnNum;
		  m_ptrData=new BYTE[len];
		  memset(m_ptrData,0,len);
		  len=3*m_nRowNum*m_nColumnNum;
          m_ptrInteData=new BYTE[len];
          memset(m_ptrInteData,0,len);
          len=3*m_nRowNum*m_nColumnNum+54;
	      m_ptrDisMemory=new BYTE[len];
		  memset(m_ptrDisMemory,0,len);
		  //构造信息头
	
	      m_pBmpFile.bfType=19778;
	      m_pBmpFile.bfSize=m_nRowNum*m_nColumnNum;
	      m_pBmpFile.bfReserved1=0;
          m_pBmpFile.bfReserved2=0;
          m_pBmpFile.bfOffBits=54;
    	
	      m_pBmpInf.biSize=40;
          m_pBmpInf.biWidth=m_nColumnNum;
          m_pBmpInf.biHeight=m_nRowNum;
          m_pBmpInf.biPlanes=1;
          m_pBmpInf.biBitCount=24;
          m_pBmpInf.biCompression=0;
          m_pBmpInf.biSizeImage=m_nRowNum*m_nColumnNum;
          m_pBmpInf.biXPelsPerMeter=0;
          m_pBmpInf.biYPelsPerMeter=0;
          m_pBmpInf.biClrUsed=0;
          m_pBmpInf.biClrImportant=0;

          BYTE* pg=(BYTE*)&m_pBmpFile;
	      for(int k=0;k<14;k++)
		  {m_ptrDisMemory[k]=pg[k];}
	      pg=(BYTE*)&m_pBmpInf;
	      for(k=0;k<40;k++)
		  {m_ptrDisMemory[k+14]=pg[k];}
		   
		  m_bPortOpen=true;
		  Invalidate();
	   }
      
       m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
	   if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
          m_MSComm.SetPortOpen(FALSE);
	   m_MSComm.SetCommPort(m_nComNum); //选择COM2
       m_MSComm.SetInBufferSize(1024); //接收缓冲区
       m_MSComm.SetOutBufferSize(1024);//发送缓冲区
       m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
       m_MSComm.SetInputMode(1);//以二进制方式读写数据
       m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
       ss.Format("%d,n,8,1",m_nBaud);
	   //m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
       m_MSComm.SetSettings(ss);
       if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
       m_MSComm.SetPortOpen(TRUE);//打开串口
       else
       AfxMessageBox("Open Serial Port Failure!");
        m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
		
	}
	
}

int CImageDisView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
/*
	m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
    if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
    m_MSComm.SetPortOpen(FALSE);

    m_MSComm.SetCommPort(2); //选择COM2
    m_MSComm.SetInBufferSize(1024); //接收缓冲区
    m_MSComm.SetOutBufferSize(1024);//发送缓冲区
    m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
    m_MSComm.SetInputMode(1);//以二进制方式读写数据
    m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
    m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位

    if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
    m_MSComm.SetPortOpen(TRUE);//打开串口
    else
    AfxMessageBox("Open Serial Port Failure!");
     m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
	 */
}
void CImageDisView::OnComm() 
{
    VARIANT variant_inp;
	COleSafeArray safearray_inp;
	long k,len;
	int m_cot=0;
	//BYTE rxdata[2048];
    BYTE rxdata[490000];
	CString strtemp;

	CString sHex;

	if(m_MSComm.GetCommEvent()==id_recive_data) 
	{
	    variant_inp=m_MSComm.GetInput();
		safearray_inp=variant_inp;
		len=safearray_inp.GetOneDimSize();
	    for(k=0;k<len;k++)
        	safearray_inp.GetElement(&k,rxdata+k);
			
		for(k=0;k<len;k++)             //将数组转换为Cstring型变量
		{
				
			    BYTE bt=*(char*)(rxdata+k);      //字符型
				strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
				m_strChuankou=m_strChuankou+strtemp+"  ";    //加入接收编辑框对应字符串    				
			    char s0,s1;    //t3,t2,t1,t0依次为存储一个字符串从左至右每个位上字符的字符变量
				int T0,T1;     //  T0,T1,T2,T3分别为t3,t2,t1,t0所对应的十进制数
				unsigned int T;               // T 为合并完成的十进制数
		        
				s1=strtemp.GetAt(0);    // 把16进制字符串的第一个字符存放到t1里
				T1=Hex_To_Dec(s1);           //  把16进制数转化成相应的10进制数 
	                                  //把10进制数存到T1里                    
				s0=strtemp.GetAt(1);
				T0=Hex_To_Dec(s0);
                
				T=(T1*16+T0);  // T存储转化完成的十进制数
				///记录数据
				
				
				if(T==255)  
				{m_intDataCount=0;m_strChuankou="";}
				else
				{
				    if(m_nScount==0&&m_nFrame==id_single_frame)
					{
					  if(m_intDataCount<m_nColumnNum*m_nRowNum) m_ptrData[m_intDataCount]=T;
					  m_intDataCount++;
					  if(m_intDataCount==m_nColumnNum*m_nRowNum)
					  {
						m_bSingleEnd=true;
                        m_nScount=1;
					    Invalidate();
					  }
					}
					if(m_nFrame==id_multi_frame)
					{
					   if(m_intDataCount<m_nColumnNum*m_nRowNum) m_ptrData[m_intDataCount]=T;
					   m_intDataCount++;
					   if(m_intDataCount==m_nColumnNum*m_nRowNum)
					   {
						m_bSingleEnd=true;
           
					    Invalidate();
					   }	 
					}
					
				}
			}
	}
}

void CImageDisView::_disbmp(bool bPortOpen,CDC *pDC)
{
    if(bPortOpen)
	{
	   int nXPos=0;
	   int nYPos=0;
	   long width=m_nColumnNum;
	   long height=m_nRowNum;
	   long nBytesPerRow=width*3;
	   BYTE C=0;
	   LPBITMAPINFO  ptrInf=(LPBITMAPINFO)&m_pBmpInf;
	   if(!m_bIniColorImage) 
	   {
		   for(int row=0;row<m_nRowNum;row++)
		    for(int column=0;column<m_nColumnNum;column++)
			{
             C=m_ptrData[row*m_nColumnNum+column];
			 m_ptrInteData[row*nBytesPerRow+3*column+0]=C;
			 m_ptrInteData[row*nBytesPerRow+3*column+1]=C;
			 m_ptrInteData[row*nBytesPerRow+3*column+2]=C;
           
			} 
	   }

	   StretchDIBits(pDC->m_hDC,0,0,width+nXPos,height-nYPos,nXPos,0,width+nXPos,height-nYPos,(void*)m_ptrInteData,ptrInf,DIB_RGB_COLORS,SRCCOPY); 
	  
	}
}

void CImageDisView::_texttoview()
{
      
	  CClientDC dc(this);
	  int len=0;
	  int m=0;
	  CString ss;
	  CString ss1;
      int row=0,column=0;
	  dc.MoveTo(400,0);
	  dc.LineTo(400,800);
	  if(m_bSingleEnd)
	  {
	   for(row=0;row<m_nRowNum;row++)
		  for(column=0;column<m_nColumnNum;column++)
		  {
			     m=m_ptrData[row*m_nColumnNum+column];
				 ss.Format("%02x ",m+"%");
				 dc.TextOut(401+20*column,20*row,ss);
		  }
		  m_bSingleEnd=false;
	  }
		
     
}

int CImageDisView::Hex_To_Dec(char ss)
{
     int nDec=0;
	 if (ss=='0')
		 nDec=0;
	 else if (ss=='1')
		 nDec=1;
	 else if (ss=='2')
		 nDec=2;
	 else if (ss=='3')
		 nDec=3;
	 else if (ss=='4')
		 nDec=4;
	 else if (ss=='5')
		 nDec=5;
	 else if (ss=='6')
		 nDec=6;
	 else if (ss=='7')
		 nDec=7;
	 else if (ss=='8')
		 nDec=8;
	 else if (ss=='9')
		 nDec=9;
	 else if (ss=='A')
		 nDec=10;
	 else if (ss=='B')
		 nDec=11;
	 else if (ss=='C')
		 nDec=12;
	 else if (ss=='D')
		 nDec=13;
	 else if (ss=='E')
		 nDec=14;
	 else 
		 nDec=15;
	 return nDec;
}

void CImageDisView::OnDisImage() 
{
	// TODO: Add your command handler code here
	Invalidate();
}

void CImageDisView::OnMenuChazhi() 
{
	
	int row=0,column=0;
	int columnEge=0;
	int rowEge=0;
	BYTE R=0,G=0,B=0;
	int nBytesPerRow=m_nColumnNum*3;
	int x=0,y=0;
	int x0=0,y0=0;
    int c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0;
	if(m_nRowOrColu==id_odd)
	{
       	//奇奇
		columnEge=(m_nColumnNum-3)/2;
	    rowEge=(m_nRowNum-3)/2;
		
		for(row=0;row<rowEge;row++)
			for(column=0;column<columnEge;column++)
			{
				//获得8临域 
                //处理蓝色分量(2n+1,2n+1)
                x0=2*column+1;
				y0=2*row+1;
				B=m_ptrData[y0*m_nColumnNum+x0];
                x=x0-1;
				y=y0-1;
				c1=m_ptrData[y*m_nColumnNum+x];//R
                x=x0-1;
				y=y0;
				c2=m_ptrData[y*m_nColumnNum+x];//G
				x=x0-1;
				y=y0+1;
				c3=m_ptrData[y*m_nColumnNum+x];//R

				x=x0;
				y=y0-1;
				c4=m_ptrData[y*m_nColumnNum+x];//G
                x=x0;
				y=y0+1;
				c5=m_ptrData[y*m_nColumnNum+x];//G
				
				x=x0+1;
				y=y0-1;
				c6=m_ptrData[y*m_nColumnNum+x];//R
				x=x0+1;
				y=y0;
				c7=m_ptrData[y*m_nColumnNum+x];//G
				x=x0+1;
				y=y0+1;
				c8=m_ptrData[y*m_nColumnNum+x];//R

				R=(c1+c3+c6+c8)/4;
				G=(c2+c4+c5+c7)/4;
				B=B;

                m_ptrInteData[y0*nBytesPerRow+3*x0+0]=B;
				m_ptrInteData[y0*nBytesPerRow+3*x0+1]=G;
				m_ptrInteData[y0*nBytesPerRow+3*x0+2]=R;
			}

			for(row=0;row<rowEge;row++)
			for(column=0;column<columnEge;column++)
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -