使用Visual C++進行串口通信編程--1

 

利用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函數返回指向已打開串行口的句柄。第二個參數指向設備控制塊DCBDCB是一個非常重要的數據結構,幾乎所有的串行口屬性和狀態都存儲在該結構的成員變量中。

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函數返回指向已打開串行口的句柄。參數dwInQueuedwOutQueue分別指定應用程序推薦使用的接收緩衝區和發送緩衝區的大小。

n        清空接收和發送緩衝區

在進行串口所有的發送和接收數據操作之前,最好使用PurgeComm函數將串行口發送緩衝區和接收緩衝區中的數據清楚乾淨。PurgeComm函數原型如下:

BOOL PurgeComm

     HANDLE hFile

     DWORD   dwFlages

);

參數hFile是由CreateFile函數返回指向已打開串行口的句柄,參數dwFlags指明執行的動作。如果dwFlagsPURGE_TXCLEAR,則通知系統清空發送緩衝區;如果dwFlagsPURGE_RXCLEAR,則通知系統清空接收緩衝區;如果需要將發送緩衝區和接收緩衝區全部清空,可以把dwFlags設置爲PURGE_TXCLEAR|PURGE_RXCLEAR。如果PurgeComm函數調用成功,則返回值爲非0;若函數調用失敗,則返回值爲0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章