CSerialPortsrc串口类PJNaughter.docx
- 文档编号:4738319
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:34
- 大小:25.70KB
CSerialPortsrc串口类PJNaughter.docx
《CSerialPortsrc串口类PJNaughter.docx》由会员分享,可在线阅读,更多相关《CSerialPortsrc串口类PJNaughter.docx(34页珍藏版)》请在冰豆网上搜索。
CSerialPortsrc串口类PJNaughter
最近因为工作的关系,要学习串口编程,在网上无意中发现了PJNaughter写的一个串口类(不知是何许人,孤陋寡闻,甚觉汗颜),感觉还可以,就抽了点时间把他网站上的有关此类的信息翻译了下,有时间研究下,说不定能用到项目中。
时间较为仓促,加上我也不想在咬文嚼字上较真,肯定有许多不足,望大家指正,同时也希望对串口有研究的同志们不吝赐教。
一、类源文件
1.SERIALPORT.H
/*
Module:
SERIALPORT.H
Purpose:
DeclarationforanMFCwrapperclassforserialports
Created:
PJN/31-05-1999
History:
None
Copyright(c)1999byPJNaughter.
Allrightsreserved.
*/
/////////////////////Macros/Structsetc//////////////////////////
#ifndef__SERIALPORT_H__
#define__SERIALPORT_H__
///////////////////////////Classes///////////////////////////////////////////
//////Serialportexceptionclass////////////////////////////////////////////
voidAfxThrowSerialException(DWORDdwError=0);
classCSerialException:
publicCException
{
public:
//Constructors/Destructors
CSerialException(DWORDdwError);
~CSerialException();
//Methods
#ifdef_DEBUG
virtualvoidDump(CDumpContext&dc)const;
#endif
virtualBOOLGetErrorMessage(LPTSTRlpstrError,UINTnMaxError, PUINTpnHelpContext=NULL);
CStringGetErrorMessage();
//Datamembers
DWORDm_dwError;
protected:
DECLARE_DYNAMIC(CSerialException)
};
////Theactualserialportclass/////////////////////////////////////////////
classCSerialPort:
publicCObject
{
public:
//Enums
enumFlowControl
{
NoFlowControl,
CtsRtsFlowControl,
CtsDtrFlowControl,
DsrRtsFlowControl,
DsrDtrFlowControl,
XonXoffFlowControl
};
enumParity
{
EvenParity,
MarkParity,
NoParity,
OddParity,
SpaceParity
};
enumStopBits
{
OneStopBit,
OnePointFiveStopBits,
TwoStopBits
};
//Constructors/Destructors
CSerialPort();
~CSerialPort();
//GeneralMethods
voidOpen(intnPort,DWORDdwBaud=9600,Parityparity=NoParity,BYTEDataBits=8,
StopBitsstopbits=OneStopBit,FlowControlfc=NoFlowControl,BOOLbOverlapped=FALSE);
voidClose();
voidAttach(HANDLEhComm);
HANDLEDetach();
operatorHANDLE()const{returnm_hComm;};
BOOLIsOpen()const{returnm_hComm!
=INVALID_HANDLE_VALUE;};
#ifdef_DEBUG
voidCSerialPort:
:
Dump(CDumpContext&dc)const;
#endif
//Reading/WritingMethods
DWORDRead(void*lpBuf,DWORDdwCount);
BOOLRead(void*lpBuf,DWORDdwCount,OVERLAPPED&overlapped);
voidReadEx(void*lpBuf,DWORDdwCount);
DWORDWrite(constvoid*lpBuf,DWORDdwCount);
BOOLWrite(constvoid*lpBuf,DWORDdwCount,OVERLAPPED&overlapped);
voidWriteEx(constvoid*lpBuf,DWORDdwCount);
voidTransmitChar(charcChar);
voidGetOverlappedResult(OVERLAPPED&overlapped,DWORD&dwBytesTransferred,BOOLbWait);
voidCancelIo();
//ConfigurationMethods
voidGetConfig(COMMCONFIG&config);
staticvoidGetDefaultConfig(intnPort,COMMCONFIG&config);
voidSetConfig(COMMCONFIG&Config);
staticvoidSetDefaultConfig(intnPort,COMMCONFIG&config);
//MiscRS232Methods
voidClearBreak();
voidSetBreak();
voidClearError(DWORD&dwErrors);
voidGetStatus(COMSTAT&stat);
voidGetState(DCB&dcb);
voidSetState(DCB&dcb);
voidEscape(DWORDdwFunc);
voidClearDTR();
voidClearRTS();
voidSetDTR();
voidSetRTS();
voidSetXOFF();
voidSetXON();
voidGetProperties(COMMPROP&properties);
voidGetModemStatus(DWORD&dwModemStatus);
//Timeouts
voidSetTimeouts(COMMTIMEOUTS&timeouts);
voidGetTimeouts(COMMTIMEOUTS&timeouts);
voidSet0Timeout();
voidSet0WriteTimeout();
voidSet0ReadTimeout();
//EventMethods
voidSetMask(DWORDdwMask);
voidGetMask(DWORD&dwMask);
voidWaitEvent(DWORD&dwMask);
voidWaitEvent(DWORD&dwMask,OVERLAPPED&overlapped);
//QueueMethods
voidFlush();
voidPurge(DWORDdwFlags);
voidTerminateOutstandingWrites();
voidTerminateOutstandingReads();
voidClearWriteBuffer();
voidClearReadBuffer();
voidSetup(DWORDdwInQueue,DWORDdwOutQueue);
//Overridables
virtualvoidOnCompletion(DWORDdwErrorCode,DWORDdwCount,LPOVERLAPPEDlpOverlapped);
protected:
HANDLEm_hComm; //Handletothecommsport
BOOL m_bOverlapped;//IstheportopeninoverlappedIO
staticvoidWINAPI_OnCompletion(DWORDdwErrorCode,DWORDdwCount,LPOVERLAPPEDlpOverlapped);
DECLARE_DYNAMIC(CSerialPort)
};
#endif//__SERIALPORT_H__
2.
/*
Module:
SERIALPORT.CPP
Purpose:
ImplementationforanMFCwrapperclassforserialports
Created:
PJN/31-05-1999
History:
PJN/03-06-19991.FixedproblemwithcodeusingCancelIowhichdoesnotexiston95.
2.Fixedleakswhichcanoccurinsampleappwhenanexceptionisthrown
PJN/16-06-19991.FixedabugwherebyCString:
:
ReleaseBufferwasnotbeingcalledin
CSerialException:
:
GetErrorMessage
PJN/29-09-19991.FixedasimplecopyandpastebuginCSerialPort:
:
SetDTR
Copyright(c)1999byPJNaughter.
Allrightsreserved.
*/
///////////////////////////////// Includes //////////////////////////////////
#include"stdafx.h"
#include"serialport.h"
#include"winerror.h"
/////////////////////////////////defines/////////////////////////////////////
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_charTHIS_FILE[]=__FILE__;
#endif
////////////////////////////////Implementation///////////////////////////////
//ClasswhichhandlesCancelIofunctionwhichmustbeconstructedatruntime
//sinceitisnotimeplementedonNT3.51orWindows95.Toavoidtheloader
//bringingupamessagesuchas"Failedtoloadduetomissingexport...",the
//functionisconstructedusingGetProcAddress.TheCSerialPort:
:
CancelIo
//functionthencheckstoseeifthefunctionpointerisNULLandifitisit
//throwsanexceptionusingtheerrorcodeERROR_CALL_NOT_IMPLEMENTEDwhich
//iswhat95wouldhavedoneifithadimplementedastubforitinthefirst
//place!
!
class_SERIAL_PORT_DATA
{
public:
//Constructors/Destructors
_SERIAL_PORT_DATA();
~_SERIAL_PORT_DATA();
HINSTANCEm_hKernel32;
typedefBOOL(CANCELIO)(HANDLE);
typedefCANCELIO*LPCANCELIO;
LPCANCELIOm_lpfnCancelIo;
};
_SERIAL_PORT_DATA:
:
_SERIAL_PORT_DATA()
{
m_hKernel32=LoadLibrary(_T("KERNEL32.DLL"));
VERIFY(m_hKernel32!
=NULL);
m_lpfnCancelIo=(LPCANCELIO)GetProcAddress(m_hKernel32,"CancelIo");
}
_SERIAL_PORT_DATA:
:
~_SERIAL_PORT_DATA()
{
FreeLibrary(m_hKernel32);
m_hKernel32=NULL;
}
//Thelocalvariablewhichhandlethefunctionpointers
_SERIAL_PORT_DATA_SerialPortData;
//////////Exceptionhandlingcode
voidAfxThrowSerialException(DWORDdwError/*=0*/)
{
if(dwError==0)
dwError=:
:
GetLastError();
CSerialException*pException=newCSerialException(dwError);
TRACE(_T("Warning:
throwingCSerialExceptionforerror%d\n"),dwError);
THROW(pException);
}
BOOLCSerialException:
:
GetErrorMessage(LPTSTRpstrError,UINTnMaxError,PUINTpnHelpContext)
{
ASSERT(pstrError!
=NULL&&AfxIsValidString(pstrError,nMaxError));
if(pnHelpContext!
=NULL)
*pnHelpContext=0;
LPTSTRlpBuffer;
BOOLbRet=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, m_dwError,MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT),
(LPTSTR)&lpBuffer,0,NULL);
if(bRet==FALSE)
*pstrError='\0';
else
{
lstrcpyn(pstrError,lpBuffer,nMaxError);
bRet=TRUE;
LocalFree(lpBuffer);
}
returnbRet;
}
CStringCSerialException:
:
GetErrorMessage()
{
CStringrVal;
LPTSTRpstrError=rVal.GetBuffer(4096);
GetErrorMessage(pstrError,4096,NULL);
rVal.ReleaseBuffer();
returnrVal;
}
CSerialException:
:
CSerialException(DWORDdwError)
{
m_dwError=dwError;
}
CSerialException:
:
~CSerialException()
{
}
IMPLEMENT_DYNAMIC(CSerialException,CException)
#ifdef_DEBUG
voidCSerialException:
:
Dump(CDumpContext&dc)const
{
CObject:
:
Dump(dc);
dc<<"m_dwError="< } #endif //////////Theactualserialportcode CSerialPort: : CSerialPort() { m_hComm=INVALID_HANDLE_VALUE; m_bOverlapped=FALSE; } CSerialPort: : ~CSerialPort() { Close(); } IMPLEMENT_DYNAMIC(CSerialPort,CObject) #ifdef_DEBUG voidCSerialPort: : Dump(CDumpContext&dc)const { CObject: : Dump(dc); dc<<_T("m_hComm=")< dc<<_T("m_bOverlapped=")< } #endif voidCSerialPort: : Open(intnPort,DWORDdwBaud,Parityparity,BYTEDataBits,StopBitsstopbits,FlowControlfc,BOOLbOverlapped) { //Validateourparameters ASSERT(nPort>0&&nPort<=255); //CallCreateopenupthecommsport CStringsPort; sPort.Format(_T("\\\\.\\COM%d"),nPort); m_hComm=Create,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,bOverlapped? : 0,NULL); if(m_hComm==INVALID_HANDLE_VALUE) { TRACE(_T("Failedtoopenupthecommsport\n")); AfxThrowSerialException(); } m_bOverlapped=bOverlapped; //Getthecurrentstatepriortochangingit DCBdcb; GetState(dcb); //Setupthebaudrate dcb.BaudRate=dwBaud; //SetuptheParity switch(parity) { caseEvenParity: dcb.Parity=EVENPARITY; break; caseMarkParity: dcb.Parity=MARKPARITY; break; caseNoParity: dcb.Parity=NOPARITY; break; caseOddParity: dcb.Parity=ODDPARITY; break; caseSpaceParity: dcb.Parity=SPACEPARITY;break; default: ASSERT(FALSE); break; } //Setupthedatabits dcb.ByteSize=DataBits; //Setupthestopbits switch(stopbits) { caseOneStopBit: dcb.StopBits=ONESTOPBIT; break; caseOnePointFiveStopBits: dcb.StopBits=ONE5STOPBITS;break; caseTwoStopBits: dcb.StopBits=TWOSTOPBITS; break; default: ASSERT(FALSE); br
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CSerialPortsrc 串口 PJNaughter