分享
 
 
 

介绍一个 Win32 API 串口控制 MFC 打包类

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

介绍一个 Win32 API 串口控制 MFC 打包类

作者:PJ Naughter

例子程序和类源代码下载

支持环境:Windows 9x、Windows ME、Windows NT、Windows2000

简介:这是一个Win32 API的打包类,对处理串口的Win32 API类进行了封装,借助这个类可以很方便地对串口进行操作。

特性:

C++接口简洁易用

使用C++异常时,首选 Win32 常规的返回值机制。保证使用CSerialPort的代码更加健壮。

支持UNICODE,支持MFC静态链接并且所有代码都在 warning level 4 级别上进行洁净编译。

支持串口模块使用重叠、阻塞和回调(只能在NT中使用)

注意事项:

请随时跟踪作者个人网站,以便获得最新版本。

版权声明:

你可以在任何以二进制形式发布的产品(包括商业的、共享的、自由的或其它的)中包含此源代码

在不修改每个模块(*.h、*.cpp)最上方版权细则的前提下,你可以用任何方式修改源代码

如果你想要与自己的应用程序一起分发源代码,只允许分发作者最新发布的版本,以便保证源代码的出处是唯一的

使用方法:

在工程中添加SerialPort.cpp文件,并在任何要调用这个类的模块中#include SerialPort.h文件。

实现细节请参考例子程序的源代码

API 参考: 接口由两个类组成:CSerialException、CSerialPort。其成员函数和成员变量清单如下:

CSerialException::CSerialException

CSerialException::GetErrorMessage

CSerialException::m_dwError

CSerialPort::CSerialPort

CSerialPort::~CSerialPort

CSerialPort::Open

CSerialPort::Close

CSerialPort::Attach

CSerialPort::Detach

CSerialPort::operator HANDLE

CSerialPort::IsOpen

CSerialPort::Dump

CSerialPort::Read

CSerialPort::ReadEx

CSerialPort::Write

CSerialPort::WriteEx

CSerialPort::TransmitChar

CSerialPort::GetOverlappedResult

CSerialPort::CancelIo

CSerialPort::GetConfig

CSerialPort::GetDefaultConfig

CSerialPort::SetConfig

CSerialPort::SetDefaultConfig

CSerialPort::ClearBreak

CSerialPort::SetBreak

CSerialPort::ClearError

CSerialPort::GetStatus

CSerialPort::GetState

CSerialPort::SetState

CSerialPort::Escape

CSerialPort::ClearDTR

CSerialPort::ClearRTS

CSerialPort::SetDTR

CSerialPort::SetRTS

CSerialPort::SetXOFF

CSerialPort::SetXON

CSerialPort::GetProperties

CSerialPort::GetModemStatus

CSerialPort::SetTimeouts

CSerialPort::GetTimeouts

CSerialPort::Set0Timeout

CSerialPort::Set0WriteTimeout

CSerialPort::Set0ReadTimeout

CSerialPort::SetMask

CSerialPort::GetMask

CSerialPort::WaitEvent

CSerialPort::Flush

CSerialPort::Purge

CSerialPort::TerminateOutstandingWrites

CSerialPort::TerminateOutstandingReads

CSerialPort::ClearWriteBuffer

CSerialPort::ClearReadBuffer

CSerialPort::Setup

CSerialPort::OnCompletion

CSerialPort::BytesWaiting

CSerialPort::DataWaiting

CSerialException::CSerialException

CSerialException( DWORD dwError

= 0);

参数

dwError 导致异常的错误。

注释

当创建CSerialExceptionThis对象时,此成员函数被调用。为了丢出 CSerialException,必须调用全程函数 AfxThrowSerialException。如果调用时 dwError

使用缺省值,则内部则会调用GetLastError。

CSerialException::GetErrorMessage

virtual BOOL GetErrorMessage( LPTSTR lpszError,

UINT nMaxError,

PUINT pnHelpContext

= NULL );

CString GetErrorMessage();

返回值

1) 如果函数调用成功,返回非零;否则,如果没有得到错误信息文本,则返回0。

2) 表示错误的一个 CString

参数

lpszError 接收出错信息的缓冲指针。

nMaxError 缓冲能容纳的最大字符数,包括NULL终结符。

pnHelpContext 接收帮助上下文ID的UINT的地址,不返回ID。

注释

调用此成员函数获取有关出错信息。

CSerialException::m_dwError

注释

导致异常错误。此错误值为一系统错误代码,类似WINERROR.H文件中的定义。Win32

的错误代码清单请参考Win32 SDK中的 Error Codes。

CSerialPort::CSerialPort

CSerialPort();

注释

标准 C++ 类构造函数。在内部将成员变量置为缺省值。

CSerialPort::~CSerialPort

virtual ~CSerialPort();

注释

标准 C++ 类析构函数。它确保关闭打开的通讯端口。

CSerialPort::Open

void Open( int nPort, DWORD

dwBaud = 9600, Parity parity = NoParity, BYTE

DataBits

= 8, StopBits stopbits = OneStopBit, FlowControl

fc = NoFlowControl, BOOL bOverlapped = FALSE);

throw(

CSerialException );

参数

nPort 拟打开的通讯端口。

dwBaud 使用的波特率

parity 使用的校验位。取下列枚举值:

enum Parity

{

EvenParity,

MarkParity,

NoParity,

OddParity,

SpaceParity

};

Databits 使用的数据位。

stopbits 使用的停止位。取下列枚举值:

enum StopBits

{

OneStopBit,

OnePointFiveStopBits,

TwoStopBits

};fc 使用的流控制方法。取下列枚举值:

enum FlowControl

{

NoFlowControl,

CtsRtsFlowControl,

CtsDtrFlowControl,

DsrRtsFlowControl,

DsrDtrFlowControl,

XonXoffFlowControl

};

bOverlapped TRUE 以重叠模式打开端口,否则为 FALSE 表示使用阻塞调用。

注释

调用这个成员函数打开通讯端口。内部将使用CreateFile打开comm端口,然后根据函数参数的说明用SetState对各种不同的RS-232进行设置。如果出错,则会丢出一个CSerialException异常。

CSerialPort::Close

Close();

注释

必须与Open函数配对使用。关闭已经打开的通讯端口。

CSerialPort::Attach

void Attach(HANDLE hComm, BOOL bOverlapped = FALSE);

参数

hComm 打开通讯端口的SDK句柄。

bOverlapped 如果端口以重叠模式打开为 TRUE,否则为 FALSE。

注释

允许将某个CSerialPort实例捆绑到现存的SDK通讯端口句柄。该函数的行为类似于MFC中CWnd::Attach函数。

CSerialPort::Detach

HANDLE Detach();

返回值

SDK 通讯端口句柄 HANDLE.

注释

必须与 Attach 函数配对使用。该函数的行为类似于MFC中的 CWnd::Detach函数。

CSerialPort::operator HANDLE

operator HANDLE();

返回值

SDK 通讯端口句柄 HANDLE。

注释

使用此操作符获取通讯端口对应的句柄。用该句柄可以直接调用Windows APIs。

CSerialPort::IsOpen

BOOL IsOpen() const

返回值

如果通讯端口处于打开状态则返回 TRUE,否则返回 FALSE。

CSerialPort::Dump

void Dump(CDumpContext& dc) const

注释

标准的MFC诊断支持函数。

CSerialPort::Read \ ReadEx

DWORD Read(void* lpBuf, DWORD dwCount);

BOOL Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesRead = NULL);

void ReadEx(void* lpBuf, DWORD dwCount);

throw( CSerialException );

返回值

1) 读取的字节数。

2) 如果是重叠读取全同步完成返回 TRUE ,如果此操作是异步完成,则返回 FALSE 。

参数

lpBuf 缓冲指针,从串口读取的数据将被缓冲到此地址。

dwCount 指定从串口读取的字节数。

overlapped 引用 OVERLAPPED 结构,

如果端口以重叠模式打开,则此为必须的参数。

pBytesRead 如果该值非空,则为存放所读字节数的地址。

注释

这三个函数包装了 SDK 的 ReadFile 和 ReadFileEx,第二个Read版本用于重叠模式。

CSerialPort::Write \ WriteEx

DWORD Write(const void* lpBuf, DWORD dwCount);

BOOL Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesWritten =

NULL);

void WriteEx(const void* lpBuf, DWORD dwCount);

throw( CSerialException );

返回值

1) 所写的字节数

2) 如果为完全同步的重叠写入则为 TRUE,如果操作以异步方式完成则为FALSE。

参数

lpBuf 该指针指向要写入串口的数据缓冲。

dwCount 指定要写入串口的字节数

overlapped 引用 OVERLAPPED

结构。如果以重得叠模式打开端口,此参数是必须的。

pBytesWritten 如果该值非空,则为存放所写字节数的地址。

注释

这三个函数包装了 SDK 的 WriteFile 和 WriteFileEx,第二个Read版本用于重叠模式。

CSerialPort::TransmitChar

void TransmitChar(char cChar) const

throw( CSerialException );

注释

对TransmitCommChar SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::GetOverlappedResult

void GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait)

throw( CSerialException );

注释

对GetOverlappedResult SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::CancelIo

void CancelIo()

throw( CSerialException );

注释

对CancelIo SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。注意此函数只能在NT

4+或者Windows 98+中使用。Windows 95中使用该类的1.0版本将产生错误。该问题已在CSerialPort 的1.01版本中更正。

CSerialPort::GetConfig

void GetConfig(COMMCONFIG& config)

throw( CSerialException );

注释

对GetCommConfig SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::GetDefaultConfig

static void GetDefaultConfig(int nPort, COMMCONFIG& config)

throw( CSerialException );

注释

对GetDefaultCommConfig SDK 函数进行简单打包。具体细节请参考Win32

SDK文档。

CSerialPort::SetConfig

void SetConfig(COMMCONFIG& config)

throw( CSerialException );

注释

对SetCommConfig SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::SetDefaultConfig

static void SetDefaultConfig(int nPort, COMMCONFIG& config)

throw( CSerialException );

注释

对SetDefaultCommConfig SDK 函数进行简单打包。具体细节请参考Win32

SDK文档。

CSerialPort::ClearBreak

void ClearBreak()

throw( CSerialException );

注释

对ClearCommBreak SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::SetBreak

void SetBreak()

throw( CSerialException );

注释

对SetCommBreak SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::ClearError

void ClearError(DWORD& dwErrors)

throw( CSerialException );

注释

对ClearCommError SDK 函数进行简单打包。具体细节请参考Win32

SDK文档。

CSerialPort::GetStatus

void GetStatus(COMMSTAT& stat)

throw( CSerialException );

注释

对GetCommStatus SDK 函数进行简单打包。具体细节请参考Win32

SDK文档。

CSerialPort::GetState

void GetState(DCB& dcb)

throw( CSerialException );

注释

对GetCommState SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::SetState

void SetState(DCB& dcb)

throw( CSerialException );

注释

对SetCommState SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::Escape

void Escape(DWORD dwFunc)

throw( CSerialException );

注释

对EscapeCommFunction SDK 函数进行简单打包。具体细节请参考Win32

SDK文档。

CSerialPort::ClearDTR

void ClearDTR()

throw( CSerialException );

注释

用低于DTR行的CLRDTR常量调用 Escape 函数。

CSerialPort::ClearRTS

void ClearRTS()

throw( CSerialException );

注释

用低于RTR行的CLRRTR常量调用 Escape 函数。

CSerialPort::SetDTR

void SetDTR()

throw( CSerialException );

注释

用发出DTR行的SETDTR常量调用 Escape 函数。

CSerialPort::SetRTS

void SetRTS()

throw( CSerialException );

注释

用发出RTR行的SETRTR常量调用 Escape 函数。

CSerialPort::SetXOFF

void SetXOFF()

throw( CSerialException );

注释

使用SETXOFF常量调用 Escape 函数,该常量导致传送行为接收XOFF字符。

CSerialPort::SetXON

void SetXON()

throw( CSerialException );

注释

使用SETXON常量调用 Escape 函数,该常量导致传送行为接收XON字符。

CSerialPort::GetProperties

void GetProperties(COMMPROP& properties)

throw( CSerialException );

注释

对GetCommProperties SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::GetModemStatus

void GetModemStatus(DWORD& dwModemStatus)

throw( CSerialException );

注释

对GetCommModemStatus SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::SetTimeouts

void SetTimeouts(COMMTIMEOUTS& timeouts)

throw( CSerialException );

注释

对SetCommTimeouts SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::GetTimeouts

void GetTimeouts(COMMTIMEOUTS& timeouts)

throw( CSerialException );

注释

对GetCommTimeouts SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::Set0Timeout

void Set0Timeout()

throw( CSerialException );

注释

将发送和接收的超时配置为 0

。这样将导致写操作立即返回,读操作时不论接收缓冲等待什么数据都返回,而不是等待指定的字节数到达后返回。

CSerialPort::Set0WriteTimeout

void Set0WriteTimeout()

throw( CSerialException );

注释

将发送的超时配置为 0 。这样将导致写操作立即返回。

CSerialPort::Set0ReadTimeout

void Set0ReadTimeout()

throw( CSerialException );

注释

将接收的超时配置为 0 。这样将导致读操作不论接收缓冲等待什么数据都返回,而不是等待指定的字节数到达后返回。

CSerialPort::SetMask

void SetMask(DWORD dwMask)

throw( CSerialException );

注释

对SetCommMask SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::GetMask

void GetMask(DWORD& dwMask)

throw( CSerialException );

注释

对GetCommMask SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::WaitEvent

void WaitEvent(DWORD& dwMask)

BOOL WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped)

throw( CSerialException );

返回值

如果为完全同步的重叠读操作则为 TRUE,如果操作是异步完成的则为FALSE。

注释

对WaitCommEvent SDK

函数进行简单打包。第二个为重叠版本,它会立即返回,并可在代码中手工重新设置OVERLAPPED结构 hEvent 成员以信号方式通知。具体细节请参考Win32

SDK文档。

CSerialPort::Flush

void Flush()

throw( CSerialException );

注释

对FlushFileBuffers SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::Purge

void Purge(DWORD dwFlags)

throw( CSerialException );

注释

对PurgeComm SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::TerminateOutstandingWrites

void TerminateOutstandingWrites()

throw( CSerialException );

注释

用 PURGE_TXABORT 常量调用 Purge

函数,该常量终止所有将要进行的写操作并立即返回,即便是正在进行的还没有完成的写操作。

CSerialPort::TerminateOutstandingReads

void TerminateOutstandingReads()

throw( CSerialException );

注释

用 PURGE_TXABORT 常量调用 Purge

函数,该常量终止所有将要进行的读操作并立即返回,即便是正在进行的还没有完成的读操作。

CSerialPort::ClearWriteBuffer

void ClearWriteBuffer()

throw( CSerialException );

注释

用 PURGE_TXCLEAR 常量调用 Purge

函数,该常量清除输出缓冲(如果设备驱动程序有一个这样的缓冲的话)。

CSerialPort::ClearReadBuffer

void ClearReadBuffer()

throw( CSerialException );

注释

用 PURGE_RXCLEAR 常量调用 Purge

函数,该常量清除输入缓冲(如果设备驱动程序有一个这样的缓冲的话)。

CSerialPort::Setup

void Setup(DWORD dwInQueue, DWORD dwOutQueue)

throw( CSerialException );

注释

对SetupComm SDK 函数进行简单打包。具体细节请参考Win32 SDK文档。

CSerialPort::OnCompletion

virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped);

throw( CSerialException );

参数

dwErrorCode

指定I/O完成状态。该参数可为下列值之一:

意义

0

I/O 成功

ERROR_HANDLE_EOF

ReadFileEx 函数试图读到文件尾。

dwCount 指定传输的字节数。如果发生错误,则此参数为 0。

lpOverlapped OVERLAPPED 结构指针,由异步I/O函数指定。

注释

当任何WriteEx 或 ReadEx异步调用例程完成时,该函数被调用。在CSerialPort派生类中,该写此函数用自己特定的代码来反映异步调用完成时的行为。注意在对为 lpOverlapped

参数分配的内存进行清除处理时不要忘记调用此函数的父类版本CSerialPort::OnCompletion。

CSerialPort::BytesWaiting

DWORD BytesWaiting();

throw( CSerialException );

返回值

等待从串口读取的字节数。

注释

该函数返回等待从串口读取的字节数。

CSerialPort::DataWaiting

BOOL DataWaiting(DWORD dwTimeout);

throw( CSerialException );

参数

dwTimeout

在确定数据是否到达时,指定一个等待超时的毫秒值。

返回值

如果在指定的超时间隔内数据到达则为 TRUE,否则为 FALSE.。

注释

该函数等待指定的间隔检查数据是否到达串口。

作者的联系方式:

PJ Naughter

个人网站:http://www.naughter.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有