Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1851996
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:39:03

一起学习
介绍一个 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
个人网站:
下载本文示例代码


介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类介绍一个 Win32 API 串口控制 MFC 打包类
阅读(515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~