【VC开源代码栏目提醒】:本文主要为网学会员提供YsComm.cpp,希望对需要YsComm.cpp网友有所帮助,学习一下!
// YsAT.cpp: implementation of the CYsComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "YsComm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CYsComm::CYsComm()
{
//ifdef _BALANCE
m_bSemiduplex=FALSE;
//#else
// m_bSemiduplex=TRUE;//半双工
//#endif
m_hFileHandle = NULL;
//m_overlappedWrite={0, 0, 0, 0, NULL};
memset(&m_overlappedWrite,0,sizeof(OVERLAPPED));
//m_overlappedRead = {0, 0, 0, 0, NULL};
memset(&m_overlappedRead,0,sizeof(OVERLAPPED));
memset(&m_overlappedEvent,0,sizeof(OVERLAPPED));
// Needed for overlapped I/O.
m_overlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
if (m_overlappedWrite.hEvent == NULL)
{
TRACE(_TEXT("Unable to CreateEvent:\n "));
}
// Lets put an event in the Read overlapped structure.
m_overlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
if (m_overlappedRead.hEvent == NULL)
{
TRACE(_TEXT("Unable to CreateEvent: \n"));
}
m_overlappedEvent.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
if (m_overlappedEvent.hEvent == NULL)
{
TRACE(_TEXT("Unable to CreateEvent: \n"));
}
m_hStopReadEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if (m_hStopReadEvent== NULL)
{
TRACE(_TEXT("Unable to CreateEvent: \n"));
}
m_hStopWriteEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if (m_hStopWriteEvent== NULL)
{
TRACE(_TEXT("Unable to CreateEvent: \n"));
}
m_nPort=0;
m_hWnd=NULL;
}
CYsComm::~CYsComm()
{
StopComm();
CloseHandle(m_overlappedRead.hEvent);
CloseHandle(m_overlappedWrite.hEvent);
CloseHandle(m_overlappedEvent.hEvent);
CloseHandle(m_hStopWriteEvent);
CloseHandle(m_hStopReadEvent);
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: BOOL CYsComm::Create(UINT port,HWND hWnd)
PURPOSE: 创建串口文件句柄
PARAMETERS:
port:串口的串口号
hWnd:用来接收消息的窗口句柄
RETURN VALUE:
如果操作成功,返回TRUE,如果失败返回FALSE
COMMENTS:
**********************************************************************/
BOOL CYsComm::Create(UINT port,BOOL bSemiduplex,HWND hWnd)
{
m_bSemiduplex=bSemiduplex;
CString sBuff;
DWORD dwError = 0;
if(m_hFileHandle!=NULL)
{
StopComm();
}
sBuff.Format(_TEXT("COM%d"),port);
m_hFileHandle = CreateFile(sBuff,
GENERIC_READ|GENERIC_WRITE,
0,//exclusive access
NULL,
OPEN_EXISTING, //必须
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hFileHandle == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
TRACE(_TEXT("Open COM%d Error code %d,Please check if the port is usable.\n"),port,dwError);
return FALSE;
}
m_hWnd=hWnd;
m_nPort=port;
return TRUE;
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: void CYsComm::StopComm()
PURPOSE: 关闭串口句柄
PARAMETERS:
RETURN VALUE:
COMMENTS:
**********************************************************************/
void CYsComm::StopComm()
{
// No need to continue if we're not communicating.
if (m_hFileHandle == NULL)
return;
//Purge(PURGE_ALL);
TRACE(_TEXT("Stopping the Comm\n"));
// Now close the comm port handle.
CloseHandle(m_hFileHandle);
m_hFileHandle = NULL;
}
/*************************2001.10.31 ycat *********************************************
/*************************2001.11.06 ycat *********************************************
FUNCTION: int CYsComm::ReadIn(LPTSTR lpszInputBuffer,
DWORD dwCount,
DWORD dwReadTimeOut)
PURPOSE: 在dwReadTimeOut里读到dwCount个字符,否则出错
PARAMETERS:
lpszInputBuffer: 存放返回数据的字符串缓冲区
dwCount: 希望要读到的字符个数
dwReadTimeOut: 超时的时间
RETURN VALUE:
-1: 除-2,-3之外的其它错误
1:表示写com口成功
-2: 表示timeout
-3: 表示读操作被停止
COMMENTS:
不能支持多线程
如果读出的数和dwCount不一样,那么将返回超时
读出来的数没有意义
注意和ReadComm()的区别
*****************************************