程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 介紹一個Win32 API串口控制MFC打包類

介紹一個Win32 API串口控制MFC打包類

編輯:關於VC++

支持環境: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.。

注釋

該函數等待指定的間隔檢查數據是否到達串口。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved