📄 testview.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 + -