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