📄 rs232.cpp
字号:
// Rs232.cpp: implementation of the CRs232 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Rs232.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRs232::CRs232(void)
{
memset(&m_osWrite,0,sizeof(OVERLAPPED));
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_bConnected = FALSE;
m_hThreadTerm = CreateEvent(NULL,FALSE,FALSE,NULL);
m_osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
m_osWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
}
CRs232::~CRs232(void)
{
if(m_bConnected)//如果已打开串口
CloseConnection();//关闭、释放串口
CloseHandle(m_hThreadTerm);
CloseHandle(m_osRead.hEvent);
CloseHandle(m_osWrite.hEvent);
}
int CRs232::OpenConnection(LPCTSTR szComPort,DWORD dwBaudRate,BYTE cByteSize,BYTE cStopBits,BYTE cParity,BOOL bDTR_DSR,BOOL bRTS_CTS,BOOL bXON_XOFF)
{
BOOL e_InitializeComm = TRUE;
BOOL e_OpenComm = FALSE;
if(m_bConnected)//已经打开
return 0;
SetEvent(m_osWrite.hEvent);
m_hComDev = CreateFile(szComPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(m_hComDev == INVALID_HANDLE_VALUE)
return e_OpenComm;//返回不能打开串口错误代码
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComDev,&dcb);
dcb.BaudRate = dwBaudRate;
dcb.ByteSize = cByteSize;
dcb.Parity = cParity;
dcb.StopBits = cStopBits;
//硬件流控制. bDTR_DSR、bRTS_CTS一般取默认值0,有Modem时应取1
dcb.fOutxDsrFlow = (bDTR_DSR!=0);
if(bDTR_DSR)
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
else
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fOutxCtsFlow = (bRTS_CTS!=0);
if(bRTS_CTS)
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
else
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fInX = dcb.fOutX = (bXON_XOFF!=0);//软件流控制
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
if(SetCommState(m_hComDev,&dcb))
{
//配置串口参数成功
SetCommMask(m_hComDev,EV_RXCHAR);
//设置接收、发送缓冲区大小
SetupComm(m_hComDev,RXQUEUE,TXQUEUE);
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 10;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(m_hComDev,&CommTimeOuts);
m_bConnected = TRUE;
return TRUE;
}
m_bConnected = FALSE;
CloseHandle(m_hComDev);
return FALSE;
}
int CRs232::ReadCommBlock(unsigned char* lpszBlock,int nMaxLength)
{
COMSTAT ComStat;//串口状态结构
DWORD dwLength,dwErrorFlags,m_dwLength;
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
m_dwLength = min((DWORD)nMaxLength,ComStat.cbInQue);//将要读取的数据字节数
if(m_dwLength> 0)
{
if(!ReadFile(m_hComDev, lpszBlock,m_dwLength,&dwLength,&m_osRead))//从串口读入数据
{
if(GetLastError() == ERROR_IO_PENDING)
{
if(!GetOverlappedResult(m_hComDev,&m_osRead,&dwLength,TRUE))//挂起,直到操作完成
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
WaitForSingleObject(m_osWrite.hEvent,1000);
return dwLength;//正在后台发送
}
}
}
return dwLength;//返回已读入的数据字节数
}
int CRs232::WriteCommBlock(LPCVOID lpByte,UINT nBytesToWrite)
{
int e_NotConnected =0;
int e_TransmitError =0;
int e_TransmitNotFinished =0;
DWORD dwBytesWritten, dwErrorFlags;
COMSTAT ComStat;
if(!m_bConnected)//串口没有打开
return e_NotConnected;
if(WaitForSingleObject(m_osWrite.hEvent,0) != WAIT_OBJECT_0)
return e_TransmitNotFinished;
ResetEvent(m_osWrite.hEvent);
if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite))
{
//往串口发送数据
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
return dwBytesWritten;//正在后台发送
}
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);//出现错误,清除错误标志
return e_TransmitError;//发送出错
}
return 0;//WriteFile返回1,发送成功}
}
BOOL CRs232::CloseConnection()
{
if(!m_bConnected)
return FALSE;
SetEvent(m_hThreadTerm);
m_bConnected = FALSE;
SetCommMask(m_hComDev,0);
EscapeCommFunction(m_hComDev,CLRDTR);
CloseHandle(m_hComDev);//关闭、释放串口
return TRUE;
}
BOOL CRs232::IsConnected()
{
if(!m_bConnected)
return FALSE;
else
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -