世紀長秋基於VC++6.0的串口通信開發方法

   時間:2014-03-13 23:02:22
世紀長秋基於VC++6.0的串口通信開發方法簡介
1 引言 在當今的工業控制領域,串口通信是計算機與其他設備進行數據通信時經常使用的方法,具有實現簡單、使用靈活、數據傳輸可靠等幾個優點,特別是在實時監控系統中得到廣泛應用,在我們……
世紀長秋基於VC++6.0的串口通信開發方法正文

1 引言

在當今的工業控制領域,串口通信是計算機與其他設備進行數據通信時經常使用的方法,具有實現簡單、使用靈活、數據傳輸可靠等幾個優點,特別是在實時監控系統中得到廣泛應用,在我們使用的計算機上使用的串口一般是RS232,使用RS232介面只能進行一對一的通信,然而在工業控制領域往往是一台工控機和多台智能設備進行通信,並且要求傳輸距離遠,因為這些需求,在工控領域一般使用RS485。

在Win32下,可以使用兩種編程方式實現串口通信,其一是使用MScomm控制項,這種方法程序簡單,但欠靈活。其二是調用Windows的API函數,這種方法可以清楚地掌握串口通信的機制,並且自由靈活。使用控制項的方法在本質上也是使用API進行串口通信,控制項只不過是對API的一個封裝處理,本文只介紹使用API進行串口通信編程的方法。

2 串口通信的一般步驟

2.1 打開串口

在32位Windows中,串口和其他通信設備(如磁碟等)都被作為文件進行處理,在使用前必須先將其打開,為保證串口通信數據傳輸的可靠性,串口一般以非共享模式打開,也就是在被串口打開后,其他程序不能在去打開此設備。

2.2 配置串口

在使用串口進行數據通信前必須對其進行正確的配置,串口需要配置的主要參數有波特率、數據位、停止位、奇偶校驗、收發數據緩衝區大小。除此之外還要對串口進行超時設置,以防止在串口通信時數據傳輸突然中斷而導致讀寫操作進入無限期等待的狀態,設置了超時,如果在指定時間內沒有完成所進行的操作,則此操作被自動放棄。

2.3 讀寫串口

在串口被打開並設置好后,就可以使用串口進行讀寫數據了,讀寫數據可以採用同步、非同步及事件驅動等多種方式。

2.4 關閉串口

在使用完串口后應該將其關閉,如果沒有關閉,該串口會處於打開狀態,其他的應用程序便無法打開使用該串口。

3 利用API函數實現串口通信

3.1 打開串口

Win32系統把文件的概念進行了擴展。無論是文件、通信設備、命名管道、郵件槽、磁碟、還是控制台,都是用API函數CreateFile來打開或創建的。該函數的原型為:

HANDLE CreateFile( LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);

各個參數說明如下:

lpFileName:將要打開的串口邏輯名,如「COM1」;

dwDesiredAccess:指定串口訪問的類型,可以是讀取、寫入或二者並列;

dwShareMode:指定共享屬性,由於串口不能共享,該參數必須置為0; 

lpSecurityAttributes:引用安全性屬性結構,預設值為NULL;

dwCreationDistribution:創建標誌,對串口操作該參數必須置為OPEN_EXISTING;

dwFlagsAndAttributes:屬性描述,用於指定該串口是否進行非同步操作,該值FILE_FLAG_OVERLAPPED,表示使用非同步的I/O;該值為0,表示同步I/O操作;

hTemplateFile:對串口而言該參數必須置為NULL;

3.2 配置串口

在打開通訊設備句柄后,常常需要對串口進行一些初始化配置工作。這需要通過一個DCB結構來進行。DCB結構包含了諸如波特率、數據位數、奇偶校驗和停止位數等信息。在查詢或配置串口的屬性時,都要用DCB結構來作為緩衝區。在打開串口后,可以調用GetCommState函數來獲取串口的默認配置,該函數獲取一個DCB結構體,只要在該結構內對應該先修改DCB結構,然後再調用SetCommState函數以修改後的DCB結構設置串口。DCB主要有以下幾個重要的成員:

BYTE ByteSize; // 通信位元組位數

BYTE Parity;  //指定奇偶校驗方法。此成員可以有下列值:

//EVENPARITY 偶校驗  NOPARITY 無校驗

//MARKPARITY 標記校驗  ODDPARITY 奇校驗

BYTE StopBits; //指定停止位的位數。此成員可以有下列值:

//ONESTOPBIT  1位停止位 

//TWOSTOPBITS  2位停止位

//ONE5STOPBITS 1.5位停止位

除了使用BCD設置串口的一些基本參數外,一般還需要設置串口收發數據緩衝區的大小和超時,超時的作用是在指定的時間內沒有讀入或發送指定數量的字元,讀寫操作仍然會結束。Windows用I/O緩衝區來暫存串口輸入和輸出的數據,如果通信的速率較高,則應該設置較大的緩衝區。我們可以使用API函數SetupComm設置串口的輸入和輸出緩衝區的大小,其原型如下:

BOOL SetupComm(

HANDLE hFile,  // 串口句柄

DWORD dwInQueue,  // 輸入緩衝區的大小(位元組數)

DWORD dwOutQueue );  // 輸出緩衝區的大小(位元組數)

關於讀寫串口的超時設置,windows給我們提供一個專門的結構體COMMTIMEOUTS,其定義如下:

typedef struct _COMMTIMEOUTS { 

DWORD ReadIntervalTimeout;  //讀間隔超時

DWORD ReadTotalTimeoutMultiplier;  //讀時間係數

DWORD ReadTotalTimeoutConstant;  //讀時間常量

DWORD WriteTotalTimeoutMultiplier;  // 寫時間係數

DWORD WriteTotalTimeoutConstant;  //寫時間常量

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS結構的成員都以毫秒為單位。總超時的計算公式是:總超時=時間係數×要求讀/寫的字元數+時間常量

例如,要讀入10個字元,那麼讀操作的總超時的計算公式為:

讀總超時=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant

通過該結構體windowsAPI為我們提供兩個函數:GetCommTimeouts和SetCommTimeouts,前者獲取當前的超時設置,後者使用修改後的COMMTIMEOUTS設置超時,與設置串口闡述類似。

在讀寫串口之前,還要用PurgeComm(…)函數清空緩衝區,該函數原型:

BOOL PurgeComm(

HANDLE hFile,  //串口句柄

DWORD dwFlags );  // 需要完成的操作

參數dwFlags指定要完成的操作,可以是下列值的組合:

PURGE_TXABORT  中斷所有寫操作並立即返回,即使寫操作還沒有完成。

PURGE_RXABORT  中斷所有讀操作並立即返回,即使讀操作還沒有完成。

PURGE_TXCLEAR  清除輸出緩衝區

PURGE_RXCLEAR  清除輸入緩衝區

3.3 讀寫串口

讀寫串口使用ReadFile和WriteFile兩個函數,其原型如下:

BOOL ReadFile(

HANDLE hFile,  //串口的句柄

LPVOID lpBuffer,  // 保存讀入數據的指針, 

DWORD nNumberOfBytesToRead,  // 要讀入的數據的位元組數

LPDWORD lpNumberOfBytesRead,  //實際讀入的位元組數

LPOVERLAPPED lpOverlapped );  // OVERLAPPED,同步為NULL

BOOL WriteFile(

HANDLE hFile,  //串口的句柄

LPCVOID lpBuffer,  // 要寫入數據的地址

DWORD nNumberOfBytesToWrite,  // 要寫入數據的位元組數

LPDWORD lpNumberOfBytesWritten,  //實際寫入的位元組數

LPOVERLAPPED lpOverlapped);  // OVERLAPPED,同步為NULL

在進行同步操作時,讀寫函數要等到執行完才返回,而在非同步操作時函數立即返回,但不保證讀寫操作完成,這時候就需要使用OVERLAPPED結構進行非同步控制,該結構體有一個重要的成員hEvent,該成員是windows事件對象的句柄在控制線程同步及非同步操作時常用到,如果是非同步操作,我們可以使用CreateEvent(…)創建事件對象並將返回值賦給hEvent,然後使用WaitForSingleObject或GetOverlappedResult等待讀寫操作完成,進而達到控制非同步操作的目的。

3.4閉串口

在不使用串口的時候應該將其關閉,以釋放windows的資源供其他程序使用,關閉串口只需調用CloseHandle(hComm/*串口句柄*/)即可。 

4 串列通信在世紀星組態軟體中的應用

作為通用的組態軟體,世紀星要與其他PLC、智能儀錶等設備進行通信,串列通信是主要的方式之一,基於前面所述使用API進行串列通信開發的優點,並考慮程序開發的便捷和可重用等,在世紀星中,我們將串列通信API進行封裝,以類的方式對串口進行操作,其中打開串口及配置串口參數的操作我們通過可視化窗口進行設定,然後在封裝類中實現,相關的操作處理讀寫數據外基本都已實現,因為不同的設備有不同的協議,因而讀寫串口的操作在驅動程序中完成,這樣我們的開發人員就不必關注太多其他的相關操作,只需根據實際設備重寫讀寫串口的成員函數即可。

5 結論

Windows是當前應用程序開發的主流平台,VC++6.0是該平台強大的開發工具,使用windowsAPI開發串口通信的程序可是使我們更加清晰的了解串口通信的機制,並且開發人員可以根據需要使用API進行靈活的程序設計,在SCADA中串列通信是必不可少的技術,所以掌握串列通信的開發方法具有現實意義。

[世紀長秋基於VC++6.0的串口通信開發方法],你可能也喜歡

  • 機械加工方法
  • 機械錶上鍊方法
  • 機械百家樂作弊方法
  • 機械製造方法
  • 機械安全防護方法
  • 基於裝配之設計
  • 模具開發設計流程
  • 模具開發流程
  • 產品設計與開發
  • 產品開發設計流程圖
  • 模具開發
  • 21世紀電工識圖叢書
  • 世紀龍 pe保溫材料
  • 光電通信是什麼
  • 新世紀gpx
  • e世紀十萬個為什麼
  • 歐洲中世紀建築
  • 無線電通信輔助設備
  • 信捷流通
  • 信捷流通快遞
  • 三菱plc通信控制手冊
Bookmark the permalink ,來源:
One thought on “世紀長秋基於VC++6.0的串口通信開發方法