19,502
社区成员
发帖
与我相关
我的任务
分享
#include "StdAfx.h"
#include "CECommmPort.h"
#include <memory.h>
///////////////////////////////////////////////////////////////////////////////
//CComm
CComm::CComm()
{
m_com_adr = _T("COM1:");
m_baud = 9600;
m_hComDev = NULL;
m_bPortOpened = FALSE;
}
CComm::~CComm()
{
ClosePort();
}
BOOL CComm::OpenPort()
{
CString strComm = m_com_adr;
if(!m_bPortOpened)
{
m_hComDev = CreateFile(strComm,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
0, // 不支持 overlapped I/O
NULL );
if(m_hComDev == INVALID_HANDLE_VALUE )
{
m_bPortOpened = FALSE;
}
else
{
if (!InitDCB())
{
m_bPortOpened = FALSE;
}
SetCommMask (m_hComDev, EV_RXCHAR|EV_RXFLAG);
//分配设备缓冲区
SetupComm(m_hComDev,16384,16384);
if(!InitCommTimeout())
m_bPortOpened = FALSE;
//EscapeCommFunction(m_hComDev,SETDTR);
//EscapeCommFunction(m_hComDev,SETRTS);
//初始化缓冲区中的信息
PurgeComm(m_hComDev, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲区 */
}
}
return m_bPortOpened;
}
BOOL CComm::ClosePort()
{
if(m_bPortOpened && m_hComDev != NULL && m_hComDev != INVALID_HANDLE_VALUE)
{
PurgeComm(m_hComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
CloseHandle(m_hComDev) ;
m_hComDev = NULL;
}
m_bPortOpened = FALSE;
return TRUE;
}
BOOL CComm::Write(BYTE *pBuf,int nLen)
{
BOOL bWriteStat ;
DWORD dwBytesWritten=0;
COMSTAT ComStat;
DWORD dwCommError;
//ClearCommError(m_hComDev,&dwCommError,&ComStat);
// bWriteStat = WriteFile(m_hComDev, pBuf, sizeof(TCHAR)*nLen,&dwBytesWritten,NULL) ;
bWriteStat = WriteFile(m_hComDev, pBuf, nLen,&dwBytesWritten,NULL) ;
if(dwBytesWritten != nLen )
{
return FALSE;
}
if(bWriteStat <= 0)
{
return FALSE;
}
return TRUE;
}
int CComm::Read(BYTE *pBuf,int nLen,BOOL bFlag)
{
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
BOOL bReadStat ;
//ClearCommError(m_hComDev, &dwErrorFlags, &ComStat ) ;
//dwLength=ComStat.cbInQue;
bReadStat = ReadFile(m_hComDev,pBuf,nLen/*dwLength*/,&dwLength,NULL);
if(!bReadStat)
{
dwLength = 0;
}
return dwLength;
}
BOOL CComm::InitCommTimeout()
{
memset(&m_CommTimeOuts,0,sizeof(COMMTIMEOUTS));
GetCommTimeouts(m_hComDev,&m_CommTimeOuts);
m_CommTimeOuts.ReadIntervalTimeout = 10000;
m_CommTimeOuts.ReadTotalTimeoutConstant = 10000;
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 50000;
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 10000;
m_CommTimeOuts.WriteTotalTimeoutConstant = 50000;
if(!SetCommTimeouts(m_hComDev,&m_CommTimeOuts))
{
CString strError;
strError.Format(_T("SetCommTimeouts failed . %d"),GetLastError());
return FALSE;
}
return true;
}
BOOL CComm::InitDCB()
{
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComDev,&dcb);
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = m_baud;
dcb.ByteSize = 8; // 数据位 8
dcb.Parity = 0;
dcb.fParity = FALSE; // 奇偶校验
dcb.StopBits = 0; // 停止位
dcb.fBinary = TRUE;
// dcb.fDtrControl = 0; /* 禁止流量控制 */
/* dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;*/
m_bPortOpened = TRUE;
if(!SetCommState(m_hComDev,&dcb))
{
CString strError;
strError.Format(_T("SetCommState failed . %d"),GetLastError());
m_bPortOpened = FALSE;
}
return TRUE;
}
void CComm::clearSendBuf()
{
PurgeComm(m_hComDev, PURGE_TXCLEAR | PURGE_TXABORT);
}
void CComm::clearRecvBuf()
{
PurgeComm(m_hComDev, PURGE_RXABORT | PURGE_RXCLEAR);
}