?? serialport.cpp
字號:
#include "StdAfx.h"
#include ".\serialport.h"
#include <cassert>
CSerialPort::CSerialPort(void)
: m_bOpen(false)
{
::ZeroMemory(&m_Dcb,sizeof(m_Dcb));
m_Dcb.DCBlength = sizeof(m_Dcb);
m_hCommu = INVALID_HANDLE_VALUE;
m_nBufferIn = m_nBufferOut = 512;
::ZeroMemory(&m_nTimeOut,sizeof(m_nTimeOut));
m_nTimeOut.ReadIntervalTimeout = 100;
m_nTimeOut.ReadTotalTimeoutMultiplier = 150;
m_nTimeOut.WriteTotalTimeoutConstant = 1000;
m_nTimeOut.WriteTotalTimeoutMultiplier = 1000;
m_nTimeOut.WriteTotalTimeoutConstant = 1000;
::ZeroMemory(&m_OvlpWrite,sizeof(m_OvlpWrite));
m_OvlpWrite.hEvent = CreateEvent(NULL, true, false, NULL);
assert(m_OvlpWrite.hEvent != INVALID_HANDLE_VALUE);
::ZeroMemory(&m_OvlpRead,sizeof(m_OvlpRead));
m_OvlpRead.hEvent = CreateEvent(NULL,true,false,NULL);
}
CSerialPort::~CSerialPort(void)
{
if(m_bOpen) Close();
}
void CSerialPort::Init(void)
{
}
void CSerialPort::Close(void)
{
if(m_bOpen)
::CloseHandle(m_hCommu);
m_bOpen = false;
m_hCommu = INVALID_HANDLE_VALUE;
::ResetEvent(m_OvlpWrite.hEvent);
::CloseHandle(m_OvlpWrite.hEvent);
::ResetEvent(m_OvlpRead.hEvent);
::CloseHandle(m_OvlpRead.hEvent);
}
bool CSerialPort::Open(UINT nPort,DWORD BaudRate,
BYTE ByteSize,BYTE Parity, BYTE StopBits)
{
m_nPort = nPort;
if(m_bOpen) Close();
char com_str[10];
strcpy(com_str, "COM");
ltoa(m_nPort, com_str + 3, 10);
m_hCommu = CreateFile(
com_str,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重疊I/O
NULL
);
if(m_hCommu == INVALID_HANDLE_VALUE) return false;
BOOL tempBit;
//----------------------------------------------------------------------
//設(shè)置緩沖區(qū)
tempBit = SetupComm(m_hCommu,m_nBufferIn,m_nBufferOut);
if(!tempBit) return false;
//-----------------------------------------------------------------------
//設(shè)置串口參數(shù):波特率,數(shù)據(jù)位......等等
tempBit = GetCommState(m_hCommu,&m_Dcb);
if(!tempBit) return false;
m_Dcb.BaudRate = BaudRate;
m_Dcb.ByteSize = ByteSize;
m_Dcb.Parity = NOPARITY;//MODBUS的特殊需要
m_Dcb.StopBits = StopBits;
tempBit = SetCommState(m_hCommu,&m_Dcb);
if(!tempBit) return false;
//------------------------------------------------------------------------------
//設(shè)置超時時間
tempBit = SetCommTimeouts(m_hCommu, &m_nTimeOut);
if(!tempBit) return false;
//--------------------------------------------------------------------------------
//清空串口緩沖區(qū)
tempBit = PurgeComm(m_hCommu,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
if(!tempBit) return false;
//-----------------------------------------------------------------------------------
m_bOpen = true;
return true;
}
//用于多機通信
bool CSerialPort::SetParityBit(BYTE nParity)
{
m_Dcb.Parity = nParity;
if(SetCommState(m_hCommu,&m_Dcb)) return true;
return false;
}
//在開串口之前調(diào)用有效
void CSerialPort::InitBufferSize(UINT nBufferIn, UINT nBufferOut)
{
m_nBufferIn = nBufferIn;
m_nBufferOut = nBufferOut;
}
//異步寫數(shù)據(jù)
bool CSerialPort::WriteData(BYTE* pWriteBuff, WORD nWrite)
{
if(!m_bOpen) return false;
assert(pWriteBuff);
m_OvlpWrite.Offset = 0;
m_OvlpWrite.OffsetHigh = 0;
DWORD dwError;
COMSTAT state;
::ClearCommError(m_hCommu,&dwError,&state);//清除錯誤標(biāo)志
PurgeComm(m_hCommu, PURGE_TXABORT | PURGE_TXCLEAR
|PURGE_TXCLEAR | PURGE_RXCLEAR);//清空緩沖區(qū)和終止發(fā)送與接收
DWORD nRealWrite = 0;
BOOL bResult;
bool bWrite = true;
bResult = WriteFile(m_hCommu,pWriteBuff,nWrite,&nRealWrite,&m_OvlpWrite);//異步寫
if(!bResult)
{
dwError = ::GetLastError();
switch(dwError)
{
case ERROR_IO_PENDING:
{
bWrite = false;
break;
}
default:return false;
}
}
if(!bWrite)
{
bResult = ::GetOverlappedResult(m_hCommu,&m_OvlpWrite,&nRealWrite,true);
if(!bResult) return false;
bWrite = true;
}
return true;
}
//異步讀數(shù)據(jù)
DWORD CSerialPort::ReadData(BYTE* pReadBuff, WORD nRead)
{
COMSTAT state;
BOOL bResult;
DWORD dwError = 0;
DWORD nRealRead = 0;
bool bRead = true;
::ClearCommError(m_hCommu,&dwError,&state);
bResult = ::ReadFile(m_hCommu,pReadBuff,nRead,&nRealRead,&m_OvlpRead);
if(!bResult)
{
dwError = ::GetLastError();
switch(dwError)
{
case ERROR_IO_PENDING:
{
bRead = false;
break;
}
default:return false;
}
}
if(!bRead)
{
bResult = ::GetOverlappedResult(m_hCommu,&m_OvlpRead,&nRealRead,true);
if(!bResult) return false;
bRead = true;
}
return nRealRead;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -