利用Visual C++在windows環境下設計異步串行通信程序可以使用不同的方法。一種方法可以使用windows系統提供的串行口API函數;另一種方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX。利用MSCOMM.OCX控件進行串行口程序設計相對比較簡單,只要對該控件的屬性、事件和方法進行設置和操作,就能完成簡單的串行通信功能。而直接使用windows系統提供的串行口API函數則相對較爲靈活。試驗中,可根據自己的情況任意其中一種進行編程。以下針對如何使用windows系統提供的串行口API函數進行編程做簡要介紹
在windows系統,串行口和其它通信設備都是作爲文件進行處理的。串行口的打開、關閉、發送和接收所用的函數都與操作文件的函數相同。總體來說,利用Visual C++進行異步串行通信程序設計通常可以分爲4個大階段,它們是串行口打開階段、串行口狀態值讀取和屬性設置階段、串行數據的發送與接收階段,以及串行口關閉階段。
(1) 打開串行口
在對串行口進行所有的操作之前,首先要將其打開。串行口的打開可以使用CreateFile函數,CreateFile函數將返回一個句柄,在隨後與該串行口相關的各種操作中使用。與文件操作相同,在利用CreateFile打開串行口時,也可以將串行口指定爲“讀訪問權限”、“寫訪問權限”或“讀寫訪問權限”。
HANDLE CreateFile(
LPCTSTR lpFileName
DWORD dwDesiredAccess
DWORD dwSharedMode
LPSECURITY_ATTRIBUTES lpSecurityAttributes
DWORD dwCreationDisposition
DWORD dwFlagsAndAttributes
HANDLE hTemplateFile
);
在調用成功時,CreateFile返回打開文件的句柄,該句柄將在以後與該串口相關的各個調用函數中使用。如果調用失敗,則CreateFile返回INVALID_HANDLE_VALUE。
(2) 串行口的狀態讀取和屬性設置
一旦將串口打開,就可以對該串口的屬性進行設置。由於串口的屬性非常複雜,因此通常採用讀取該串口當前狀態值,然後在此基礎上進行修改的方法。
n 獲取串行口當前狀態
windows系統使用GetCommState函數獲取串行口的當前配置,GetCommState的聲明如下:
BOOL GetCommState(
HANDLE hFile
LPDCB lpDCB
);
GetCommState函數的第一個參數hFile是由CreateFile函數返回指向已打開串行口的句柄。第二個參數指向設備控制塊DCB。DCB是一個非常重要的數據結構,幾乎所有的串行口屬性和狀態都存儲在該結構的成員變量中。
n 對串口進行設置
windows系統利用SetCommState函數修改串行口的當前參數配置。SetCommState函數聲明如下:
BOOL SetCommState(
HANDLE hFile
LPDCB lpDCB
);
GetCommState函數的第一個參數hFile是由CreateFile函數返回指向已打開串行口的句柄。第二個參數指向設備控制塊DCB。如果函數調用成功,則返回值爲非0;若函數調用失敗,則返回值爲0。當應用程序僅僅需要修改一部分串行口的配置值時,可以通過GetCommState函數獲得當前的DCB結構,然後更改參數,再調用SetCommState函數設置修改過的DCB來配置串行口。
n 爲串口分配接收和發送緩衝區
當一個串行口打開時,可以爲該串口分配一個發送緩衝區和一個接收緩衝區。串行口發送緩衝區和接收緩衝區的配置可以由函數SetupComm實現。如果不調用SetupComm,系統會爲該串口分配默認的發送緩衝區和接收緩衝區。但是爲了保證緩衝區的大小與實際需要的一致,最好調用該函數進行設置。SetupComm函數原型如下:
BOOL SetupComm(
HANDLE hFile
DWORD dwInQueue
DWORD dwOutQueue
);
其中hFile是由CreateFile函數返回指向已打開串行口的句柄。參數dwInQueue和dwOutQueue分別指定應用程序推薦使用的接收緩衝區和發送緩衝區的大小。
n 清空接收和發送緩衝區
在進行串口所有的發送和接收數據操作之前,最好使用PurgeComm函數將串行口發送緩衝區和接收緩衝區中的數據清楚乾淨。PurgeComm函數原型如下:
BOOL PurgeComm(
HANDLE hFile
DWORD dwFlages
);
參數hFile是由CreateFile函數返回指向已打開串行口的句柄,參數dwFlags指明執行的動作。如果dwFlags爲PURGE_TXCLEAR,則通知系統清空發送緩衝區;如果dwFlags爲PURGE_RXCLEAR,則通知系統清空接收緩衝區;如果需要將發送緩衝區和接收緩衝區全部清空,可以把dwFlags設置爲PURGE_TXCLEAR|PURGE_RXCLEAR。如果PurgeComm函數調用成功,則返回值爲非0;若函數調用失敗,則返回值爲0。