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

📄 testview.cpp

📁 在vc下写的串口通讯程序
💻 CPP
字号:
// testView.cpp : implementation of the CTestView class
//

#include "stdafx.h"
#include "test.h"

#include "testSet.h"
#include "testDoc.h"
#include "testView.h"
#include "io.h"
#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTestView

IMPLEMENT_DYNCREATE(CTestView, CRecordView)

BEGIN_MESSAGE_MAP(CTestView, CRecordView)
	//{{AFX_MSG_MAP(CTestView)
	ON_BN_CLICKED(IDC_CHECK_AUTOSAVE, OnCheckAutosave)
	ON_COMMAND(ID_START_RECEIVE, OnStartReceive)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()
/*UINT CTestView:: ThreadFunc(LPVOID pParam)   //辅助线程
{
	((CTestView*)pParam)->OnComm(); 
    ((CTestView*)pParam)->addRecordset();
   
   return 0;
}*/
/////////////////////////////////////////////////////////////////////////////
// CTestView construction/destruction

CTestView::CTestView()
	: CRecordView(CTestView::IDD)
{
	//{{AFX_DATA_INIT(CTestView)
	m_pSet = NULL;
	m_strreceived = _T("");
	count=0;
	m_strCurPath = _T("");
	m_ok = _T("");
    
    
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CTestView::~CTestView()
{
}

void CTestView::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestView)
	DDX_Control(pDX, IDC_EDIT_SAVEPATH, m_ctrlSavePath);
	DDX_Control(pDX, IDC_EDIT_RECEIVE, m_ctrlReceiveData);
	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlcom);
	DDX_Text(pDX, IDC_EDIT_RECEIVE, m_strreceived);
    DDX_Control(pDX, IDC_DBGRID1, m_dbGrid);
	DDX_Text(pDX, IDC_EDIT_SAVEPATH, m_strCurPath);
	DDX_Control(pDX, IDC_REMOTEDATACTL1, m_Rdc);
	DDX_Text(pDX, IDC_EDIT_TEST, m_ok);
	//}}AFX_DATA_MAP
}
/*UINT CTestView::ThreadFunc(LPVOID  pParam)
{
        ((CTestView*)pParam)->OnComm();
		((CTestView*)pParam)->addRecordset();
		return 0;

}*/

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

	return CRecordView::PreCreateWindow(cs);
}
//Add code by Fu Yong Chao 2005.11.20
unsigned char    FuYongChao[256];
static long lengthmistake=0;
static long mcrcmistake=0,maddressmistake=0,mreceivemistake=0,mterminalmistake=0, mothermistake=0, mnoreturn=0;
static long mcrcmistake1 = 0, mdatamistake = 0;
static long id=0;

BOOL startreceivedata;
//Add code by Fu Yong Chao 2005.11.20

void CTestView::OnInitialUpdate()
{
	m_pSet = &GetDocument()->m_testSet;
	CRecordView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();


    m_ctrlcom.SetCommPort(1);                //选择COM1
	m_ctrlcom.SetInputMode(1);              //输入方式为二进制方式
	m_ctrlcom.SetInBufferSize(1024);        //设置输入缓冲区大小
	m_ctrlcom.SetOutBufferSize(512);        //设置输出缓冲区大小
	m_ctrlcom.SetSettings("19200,n,8,1");   //设置波特率19200,无效验,8个数据位,1个停止位
	if(!m_ctrlcom.GetPortOpen())          
	    m_ctrlcom.SetPortOpen(TRUE);        //打开串口
	m_ctrlcom.SetRThreshold(1);
	m_ctrlcom.SetInputLen(0);               //设置当前接收区数据长度为0
	m_ctrlcom.GetInput();                   //先与读缓冲区以清除残留数据
    
	
      
}

/////////////////////////////////////////////////////////////////////////////
// CTestView printing

BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CTestView diagnostics

#ifdef _DEBUG
void CTestView::AssertValid() const
{
	CRecordView::AssertValid();
}

void CTestView::Dump(CDumpContext& dc) const
{
	CRecordView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CTestView database support
CRecordset* CTestView::OnGetRecordset()
{
	return m_pSet;
}


/////////////////////////////////////////////////////////////////////////////
// CTestView message handlers

BEGIN_EVENTSINK_MAP(CTestView, CRecordView)
    //{{AFX_EVENTSINK_MAP(CTestView)
	ON_EVENT(CTestView, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
 int index;
 int num;
 unsigned char data[1024];
 unsigned char m_Inbuff[512];
 unsigned int     m_ndata,m_nLen;
 CString str;
void CTestView::OnComm() 
{
	// TODO: Add your control notification handler code here
    // TODO: Add your command handler code here
	

	VARIANT       variant_inp;
	COleSafeArray  safearray_inp;
    LONG      len,k;
	BYTE      rxdata[2048];
	CString   strtemp;
	CString   strtempch;
    CString   m_strReceive;
  
	if(m_ctrlcom.GetCommEvent()==2)
	{   
		
	    SetTimer(1,1000,0);
		variant_inp=m_ctrlcom.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++)
		{
             
		    BYTE bt=*(char*)(rxdata+k);
			strtemp.Format("%x",bt);
            strtempch.Format("%c",bt);
			m_strreceived+=' '+strtemp;
	        
            UpdateData(FALSE);
            m_strReceive= strtempch;
               switch(m_ndata) {
			    case 0:
					
					if (bt == '$'){
                        id++;
						FuYongChao[0]=bt;
						
                        m_ndata=1;
					}
				    break;
				case 1:
					
					if (bt == 'C'){
						FuYongChao[1]=bt;
                        id++;
                        m_ndata=2;
					}
					else if (bt == '$'){
                        FuYongChao[0]=bt;
                        m_ndata=1;
					}
					else{
                        m_ndata=0;
					}
					break;
				default:

                    FuYongChao[m_ndata]=bt;
                    
                    m_ndata++;
			
					if (m_ndata==6){
					  m_nLen=FuYongChao[5]+11;
					  
					}
					if(FuYongChao[m_nLen-2]==19)
					{   
                        switch(FuYongChao[m_nLen-3])
						 {
						    case 0x00:

                                 maddressmistake++;
						         break;
					       case 0x11:
                         
                                 mreceivemistake++;
							     break;
					        case 0x12:
                         
                                mterminalmistake++;
						        break;
					        case 0x15:
                        
                                mcrcmistake++;
						        break;
					        case 0x16:
                         
                                mnoreturn++;
						        break;
					        case 0x06:
						        break;
					       default:
                                mothermistake++;
					            break;
						 }  
					}
	                else
					{

                     lengthmistake++;
					}
				     CString str,strSql;
					 str=m_Rdc.GetDataSourceName();
                     //str="select mcrcmistake,maddressmistake,mreceivemistake,mterminalmistake,mothermistake,mnoreturn";
					 strSql.Format("Insert into  Data VAULES('ID',id)");
                     //mcrcmistake,maddressmistake,mreceivemistake,mterminalmistake,mothermistake,mnoreturn);

    /*CTestView*  pView=(CTestView*)this->GetActiveWindow();
    CTestSet*   pSet=pView->m_pSet;
	pSet->Update();
	pSet->AddNew();
	pSet->CanUpdate();
	pSet->m_lengthmistake=lengthmistake;
	pSet->m_maddressmistake=maddressmistake;
	pSet->m_mcrcmistake=mcrcmistake;
	pSet->m_mdatamistake=mdatamistake;
	pSet->m_mnoreturn=mnoreturn;
	pSet->m_mothermistake=mothermistake;
	pSet->m_mterminalmistake=mterminalmistake;
	if(pSet->CanUpdate())
	{
      pSet->Update();
	}
    //
	if(!pSet->IsEOF())
	{
      pSet->MoveLast();
	}
    pView->m_dbGrid.Refresh();
	pView->UpdateData(FALSE);
    }*/

					
                    /*if(!m_pSet->IsEOF())  m_pSet->MoveLast();
                    m_pSet->Update();
                    
					m_pSet->AddNew();
                    m_pSet->m_lengthmistake=lengthmistake;
					m_pSet->m_maddressmistake=maddressmistake;
					m_pSet->m_mcrcmistake=mcrcmistake;
					m_pSet->m_mnoreturn=mnoreturn;
					m_pSet->m_ID=id;
                    UpdateData(FALSE);
					if(m_pSet->CanUpdate())
					{
						if(!m_pSet->Update()) AfxMessageBox(_T("             "));
					}
					if(!m_pSet->IsEOF()) {
						m_pSet->MoveLast();
					}*/
					break;
			   }

			   }

		}	
		  
        
		
		  UpdateData(FALSE);
	
}
	

BOOL CTestView::OnMove(UINT nIDMoveCommand) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch (nIDMoveCommand)
	{
	case ID_RECORD_PREV:
		if (!m_pSet->IsBOF())
		{
			m_pSet->MovePrev();
			
		}
		break;

	case ID_RECORD_FIRST:
		m_pSet->MoveFirst();
		break;

	case ID_RECORD_NEXT:
		if (!m_pSet->IsEOF())
			m_pSet->MoveNext();
		break;
	
		if (!m_pSet->CanScroll())
		{
		// Clear out screen since we're sitting on EOF
			m_pSet->SetFieldNull(NULL);
			break;
		}

	case ID_RECORD_LAST:
		m_pSet->MoveLast();
		break;

	default:
	// unexpected case value
	ASSERT(FALSE);
	}
	
	// show results of move operation
	UpdateData(FALSE);
	return TRUE;	
}

void CTestView::OnCheckAutosave() 
{
	// TODO: Add your control notification handler code here
	CButton *Autosave=(CButton*)GetDlgItem(IDC_CHECK_AUTOSAVE);
	if(Autosave->GetCheck())
	{
      

	UpdateData(TRUE);

	int  nLength;
	nLength=m_strCurPath.GetLength();
	for(int nCount=0;nCount<nLength;nCount++)
	{
		 if(m_strCurPath.GetAt(nCount)=='\\')
		    CreateDirectory(m_strCurPath.Left(nCount+1),NULL);
	}
	CreateDirectory(m_strCurPath,NULL);

	CFile   m_rFile;
	LPCSTR  lpszPath=m_strCurPath;  //"c:\\test";
	SetCurrentDirectory(lpszPath);
	//自动递增,如test00.txt text01.txt,程序自动为正要保存的文件名为
	char  buf[20];
	for(int j=0;j<100;j++)
	{
		sprintf(buf,"test%02d.txt",j);
		if((access(buf,0))==-1)

		   break;
	}
	if(!m_rFile.Open(buf,CFile::modeCreate |CFile::modeWrite))
	{
		AfxMessageBox("创建文件失败 ");
		return;
	}
	if((access(buf,0))==-1)
	{
		AfxMessageBox("failed");
	    return;
	}
	//文件开始处写上保存日期
	CTime t=CTime::GetCurrentTime();
	CString str=t.Format("%Y年%m月%d日%H时%M分%S秒\r\n ");
	m_rFile.Write((LPCTSTR)str,str.GetLength());
	//保存显示数据
	m_rFile.Write((LPCTSTR)m_strreceived,m_strreceived.GetLength());
	m_rFile.Flush();
	m_rFile.Close();   //关闭文件
	str="OK,";
	for(int i=0;i<5;i++)
	   str+=buf[i];
	 str+=".txt saved";
	 m_ctrlSavePath.SetWindowText(str);
	 SetTimer(2,60000,0);             //
	   
	}
}

void CTestView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
    /*time_over++;
	if(time_over>1000)
		time_over=0;
	AfxBeginThread(ThreadFunc,(LPVOID)this);*/
    switch(nIDEvent)
	{
	case 0:
		OnComm();
	    break;
	case 1:
        addRecordset();
		break;
	}
	CRecordView::OnTimer(nIDEvent);
}
void CTestView::addRecordset()
{   

	int i;
    m_Time=COleDateTime::GetCurrentTime();
	i=m_Time.GetMinute();
	if(i!=m_Minute)
	{
	CTestView*  pView=(CTestView*)this->GetActiveWindow();
    CTestSet*   pSet=pView->m_pSet;
	pSet->Update();
	pSet->AddNew();
	pSet->m_lengthmistake=lengthmistake;
	pSet->m_maddressmistake=maddressmistake;
	pSet->m_mcrcmistake=mcrcmistake;
	pSet->m_mdatamistake=mdatamistake;
	pSet->m_mnoreturn=mnoreturn;
	pSet->m_mothermistake=mothermistake;
	pSet->m_mterminalmistake=mterminalmistake;
	if(pSet->CanUpdate())
	{
      pSet->Update();
	}
    //
	if(!pSet->IsEOF())
	{
      pSet->MoveLast();
	}
    pView->m_dbGrid.Refresh();
	pView->UpdateData(FALSE);
    }
}

void CTestView::OnStartReceive() 
{
	// TODO: Add your command handler code here
    	CTestView*  pView=(CTestView*)this->GetActiveWindow();
    CTestSet*   pSet=pView->m_pSet;
	pSet->Update();
	pSet->AddNew();
	pSet->m_lengthmistake=lengthmistake;
	pSet->m_maddressmistake=maddressmistake;
	pSet->m_mcrcmistake=mcrcmistake;
	pSet->m_mdatamistake=mdatamistake;
	pSet->m_mnoreturn=mnoreturn;
	pSet->m_mothermistake=mothermistake;
	pSet->m_mterminalmistake=mterminalmistake;
	if(pSet->CanUpdate())
	{
      pSet->Update();
	}
    //
	if(!pSet->IsEOF())
	{
      pSet->MoveLast();
	}
    pView->m_dbGrid.Refresh();
	pView->UpdateData(FALSE);
    
}

⌨️ 快捷键说明

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