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

📄 dspctldoc.cpp

📁 动态图形显示程序源码
💻 CPP
字号:
// DspCtlDoc.cpp : implementation of the CDspCtlDoc class
//

#include "stdafx.h"
#include "DspCtl.h"

#include "DspCtlDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDspCtlDoc

IMPLEMENT_DYNCREATE(CDspCtlDoc, CDocument)

BEGIN_MESSAGE_MAP(CDspCtlDoc, CDocument)
	//{{AFX_MSG_MAP(CDspCtlDoc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDspCtlDoc construction/destruction

CDspCtlDoc::CDspCtlDoc()
{
	// TODO: add one-time construction code here
m_bConnected=false;
}

CDspCtlDoc::~CDspCtlDoc()
{
}


BOOL CDspCtlDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	// 为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号的
	if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
		return FALSE;
	memset(&m_osRead, 0, sizeof(OVERLAPPED));
	memset(&m_osWrite, 0, sizeof(OVERLAPPED));
	// 为重叠读创建事件对象,手工重置,初始化为无信号的
	if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		return FALSE;
	// 为重叠写创建事件对象,手工重置,初始化为无信号的
	if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		return FALSE;
	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDspCtlDoc serialization

void CDspCtlDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDspCtlDoc diagnostics

#ifdef _DEBUG
void CDspCtlDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDspCtlDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDspCtlDoc commands
BOOL CDspCtlDoc::CreateComm()
{
//在文档中得到视图指针  ,及视图的窗口句柄  
	POSITION firstViewPos;
	CView* pView;//CView* pView; 
	firstViewPos=GetFirstViewPosition();
	pView=GetNextView(firstViewPos);
	m_hTermWnd=pView->GetSafeHwnd();

	DCB Dcb;
	COMMTIMEOUTS Timeouts;
	m_hCom=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,
		0, NULL, OPEN_EXISTING, 0, NULL );
	if (m_hCom == INVALID_HANDLE_VALUE) 
	{
		char str1[]="错误";
		char str2[]="无法初始化串口,通讯中断!";
			AfxMessageBox(str2,MB_OK | MB_ICONSTOP);
        return false;
	}
	SetupComm(m_hCom,1201,64);
//设置监视事件EV_RXCHAR
	SetCommMask(m_hCom, EV_RXCHAR);
	GetCommState(m_hCom, &Dcb);
	Dcb.BaudRate =115200;
	Dcb.ByteSize = 8;
	Dcb.fParity =1;
	Dcb.Parity = ODDPARITY;
	Dcb.StopBits = ONESTOPBIT;
	SetCommState(m_hCom, &Dcb);
	GetCommTimeouts(m_hCom,&Timeouts);
	Timeouts.ReadIntervalTimeout=MAXDWORD;
	Timeouts.ReadTotalTimeoutMultiplier=0;
	Timeouts.ReadTotalTimeoutConstant=0;
	SetCommTimeouts(m_hCom,&Timeouts);
//启动监视线程
	m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 
				0, CREATE_SUSPENDED, NULL); 
		if(m_pThread==NULL)
		{
			CloseHandle(m_hCom);
			return FALSE;
		}
		else
		{
			m_bConnected=TRUE;
			m_pThread->ResumeThread(); // 恢复线程运行
		}
	return TRUE;
}

void CDspCtlDoc::WriteData(unsigned char *BufferOut,int Count)
{
	DWORD num;
	WriteFile( m_hCom, BufferOut, Count, &num, NULL);
}
///////////////////////////////////////

DWORD CDspCtlDoc::WaitData(unsigned char *BufferIn,int Count,DWORD ms)//125,160
{
	DWORD num;
	int Cb=0;			//读入数据计数/
	for (int i=0;i<9;i++)
	{
		Sleep(ms);
		ReadFile(m_hCom, BufferIn+Cb, 1, &num, NULL);
		Cb++;
		if(Cb>=Count) 
			return Count;
	}
	return 0;
}
// 工作者线程,负责监视串行口
UINT CommProc(LPVOID pParam)
{	CDspCtlDoc *pDoc=(CDspCtlDoc*)pParam;
	unsigned char x1[2],x2[2];
	x1[0]=0x3;
	x1[1]=0x1;
	pDoc->WriteData(x1,2);
	DWORD dwMask=0,dwErrorFlags,dwLength;
	 x2[0]=0x99;
	   //一直监视串口设备,直到串口连接被挂断
	while(pDoc->m_bConnected)
	{		
		if(WaitCommEvent(pDoc->m_hCom, &dwMask, NULL)) // 重叠操作
		{
			pDoc->WaitData(pDoc->buf,1,110);
			if(pDoc->buf[0]==0x99)
			{	dwMask=0;
		  PurgeComm(pDoc->m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清干净输入、输出缓冲区 
				pDoc->WriteData(x2,1);
				COMSTAT ComStat;
			  PurgeComm(pDoc->m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清干净输入、输出缓冲区 
					if(WaitCommEvent(pDoc->m_hCom, &dwMask, NULL)) 
					{		Sleep(120);	//等待读入数据计数/
							ClearCommError(pDoc->m_hCom, &dwErrorFlags, &ComStat ) ; 
							dwLength=ComStat.cbInQue;//输入缓冲区有多少数据?
							DWORD num;
							num=6001;
							ReadFile(pDoc->m_hCom, (pDoc->buf),dwLength,&dwLength,NULL);
						  PurgeComm(pDoc->m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清干净输入、输出缓冲区 
					}
			 SendMessage(pDoc->m_hTermWnd,WM_COMMNOTIFY,0, 0);
			}
		}
		dwMask=0;
	}	
return 0;
}

⌨️ 快捷键说明

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