📄 comtest.cpp
字号:
// ComTest.cpp : implementation file
//
#include "stdafx.h"
#include "ComTest.h"
#include "ComVS_2005Dlg.h"
// CComTest
IMPLEMENT_DYNCREATE(CComTest, CWinThread)
CComTest::CComTest()
{
}
CComTest::~CComTest()
{
}
BOOL CComTest::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
int CComTest::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CComTest, CWinThread)
END_MESSAGE_MAP()
// CComTest message handlers
void CComTest::SetParentWnd(CDialog * pwnd)
{
m_pwnd=pwnd;
}
int CComTest::Run()
{
// TODO: Add your specialized code here and/or call the base class
DWORD dwEvtMask;
DWORD nLength;
BYTE abln[80];
//创建事件句柄
//osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
//if(osRead.hEvent==NULL)
//{
// AfxMessageBox(_T("建立事件失败"));
// return(FALSE);
//}
//设置串口事件
if(!SetCommMask(COMFile,EV_RXCHAR))
{
return(FALSE);
}
//bCONNECTED串连接标记
while(bCONNECTED)
{
dwEvtMask=EV_RXCHAR;
//等待事件
WaitCommEvent(COMFile,&dwEvtMask,NULL);
if((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
{
do
{
//读取传中字符
nLength=ReadCommBlock((LPSTR)abln);
BOOL bRes = ::ReadFile(COMFile, abln, sizeof(abln), &nLength, NULL);
DWORD dw = ::GetLastError();
//输出字符
if(nLength>0)
{
CString str;
for(int i=0;i<(int)nLength;i++)
{
str+=abln[i];
}
//把得到的信息添加到编辑框
CString strread;
((CComVS_2005Dlg*)m_pwnd)->m_ReadEdit.GetWindowTextW(strread);
strread+=str;
((CComVS_2005Dlg*)m_pwnd)->m_ReadEdit.SetWindowTextW(strread+_T("\r\n"));
int nCount=((CComVS_2005Dlg*)m_pwnd)->m_ReadEdit.GetLineCount();
((CComVS_2005Dlg*)m_pwnd)->m_ReadEdit.LineScroll(nCount);
}
}
while(nLength>0);
}
}
//结束事件
CloseHandle(osRead.hEvent);
return CWinThread::Run();
}
BOOL CComTest::OnIdle(LONG lCount)
{
// TODO: Add your specialized code here and/or call the base class
return CWinThread::OnIdle(lCount);
}
BOOL CComTest::OpenConnection(CString strPort,UINT nBaudRate)
{
//BYTE bSet;
DCB dcb;
//BOOL fRetVal;
COMMTIMEOUTS CommTimeOuts,meOuts;
COMFile=CreateFile(strPort,GENERIC_READ|GENERIC_WRITE,/*可读可写*/0,/*不共享*/NULL,/*无安全描述*/OPEN_EXISTING,
/*打开已存在文件*/
0/*|FILE_FLAG_OVERLAPPED*/,//文件属性
NULL);
if(COMFile==(HANDLE)(-1))
{
return(FALSE);
}
//指定监视事件
SetCommMask(COMFile,EV_RXCHAR);
//设置缓存区
SetupComm(COMFile,4096,4096);
//刷新缓冲区
PurgeComm(COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
meOuts.ReadIntervalTimeout=0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=1000;
CommTimeOuts.WriteTotalTimeoutConstant=0;
//给定窜口读与操作限时
SetCommTimeouts(COMFile,&CommTimeOuts);
//设置窜口参数:波特率300;停止位1个;起始位1个;无校验位;8位;
dcb.DCBlength=sizeof(DCB);
GetCommState(COMFile,&dcb);
dcb.BaudRate=nBaudRate;
dcb.StopBits=ONESTOPBIT;
dcb.Parity=NOPARITY;
dcb.ByteSize=8;
dcb.fBinary=TRUE;
dcb.fOutxDsrFlow=0;
dcb.fDtrControl=DTR_CONTROL_ENABLE;
dcb.fOutxCtsFlow=0;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fInX=dcb.fOutX=1;
//dcb.XonChar=ASCII_XON;
//dcb.XoffChar=ASCII_XOFF;
//dcb.XonLim=100;
//dcb.XoffLim=100;
//dcb.fBinary=TRUE;
//dcb.fParity=TRUE;
//根据设备控制块配置通信设备
BOOL fPrtVal=SetCommState(COMFile,&dcb);
if(!fPrtVal)
{
return(TRUE);
}
//指定串口执行扩展功能
EscapeCommFunction(COMFile,SETDTR);
return(TRUE);
}
//关闭串行端口
BOOL CComTest::CloseConnection()
{
bCONNECTED=FALSE;
//禁止串行端口所有事件
SetCommMask(COMFile,0);
//清除数据端就绪信号
EscapeCommFunction(COMFile,CLRDTR);
//丢弃通信资源的输出或输入缓冲区字符并终止在通信资源上挂起的读写操作
PurgeComm(COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(COMFile);
return(TRUE);
}
//读串行端口数据
int CComTest::ReadCommBlock(LPSTR lpszBlock)
{
DWORD dwErrorFlags;
COMSTAT ComStat;
DWORD dwLength;
ClearCommError(COMFile,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue;
if(dwLength>0)
{
ReadFile(COMFile,lpszBlock,dwLength,&dwLength,&osRead);
return(dwLength);
}
else
{
return(0);
}
}
//写数据到串行端口
int CComTest::WriteTTYBlock(CString strWrite,int bufLen)
{
DWORD dwNumBytesWritten=0;
DWORD dwHaveNumWritten=0;//had wrote
TCHAR buf;
int j=0;
for(int i=0;i<(int)bufLen;i++)
{
buf=strWrite.GetAt(i);
if(!::WriteFile(COMFile,&buf,1,&dwNumBytesWritten,NULL))
{
return dwHaveNumWritten;
}
dwHaveNumWritten=dwHaveNumWritten+dwNumBytesWritten;
}
return(dwHaveNumWritten);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -