PowerBuilder中串行通信編程技術研究

摘要:介紹了在PowerBuilder 中調用Win32 API函數、使用Mscomm32.ocx通信控件、利用VCL通信組件和調用DLL(動態鏈接庫)中的函數來實現串行通信的方法,分析總結了各種方法的優缺點。
關鍵詞:串行通信;事件驅動;應用程序接口;動態鏈接庫

0 引言
在自動控制中,用PC機對工程實現實時監控,通常要求PC機能在用戶界面上具有數據採集、數據處理以及控制信號的產生與傳輸等功能。在這種情況下,PC機 要與過程控制的信號相聯繫,就要求能實現對PC機的串行端口直接操作。串行通信具有傳輸距離長、連接簡單、使用靈活方便、數據傳輸可靠性高等特點,在工業監控、數據採集和實時控制系統中得到了廣泛應用。
PowerBuilder
(簡稱PB)是一種可視化的、面向對象的快速交互式應用開發工具。PB 以其簡潔高效的集成開發環境、強大的數據窗口技術、便捷的報表生成及打印功能,越來越受到廣大開發人員的青睞。在各種開發軟件中,PB對於數據庫的上層編 程支持是名列前茅的,但是,PB對計算機的底層支持略顯薄弱,沒有提供串行通信的命令、函數或控件,與其它設備之間進行數據通信較爲困難,筆者根據自己在 PB編程中積累的經驗,介紹了幾種在PB中實現串行通信的方法。

1 串行數據通信
1.1
工作原理

Windows
是一個事件驅動的與設備無關的多用戶操作系統,它禁止應用程序直接和硬件交互,程序員只能通過Windows提供的各類驅動程序來管理硬 件。Windows系統函數包含了通信支持中斷功能,Windows系統爲每個通信設備開闢了用戶定義的輸入輸出緩衝區(即讀寫緩衝區),數據進出通信口均由系統後臺來完成。應用程序只需完成對輸入輸出緩衝區操作就可以了。實際過程是每接收一個數據就產生一個低級硬件中斷,Windows系統中的串行驅動程序就取得了控制權,並將接收到的數據放入輸入數據緩衝區,然後將控制權返還正在運行的應用程序。如果緩衝區數據已滿,串行驅動程序用當前定義的流控制機制通知發送方停止發送數據。隊列中的數據按先進先出的次序處理。
1.2
通信方式
串行通信的數據是一位接一位順序地傳送下去,通信方式有以下幾種:
1)異步通信方式
異步通信方式中,數據是一幀一幀(包括一個字符或一字節數據)傳送的,每一串行幀的數據由起始位、數據位、奇偶校驗位和停止位組成。
2)同步通信方式
同步通信方式中,數據開始傳送前用同步字符來指示(常約定1-2個),並由時鐘來實現發送端和接收端同步,即檢測到規定的同步字符後,就連續按順序傳送數據,直到通信告一段落。
3)查詢方式
查詢方式是定時地查詢串口的接收緩衝區,如果接收緩衝區有數據,就讀取數據;若緩衝區中沒有數據,繼續執行,因此會佔用大量的CPU時間,它實際上是同步方式的一種派生。
4)事件驅動方式
事件驅動方式通過設置事件通知,當所希望的事件發生時,Windows發出通知,這與DOS環境下的中斷方式很相似。
採用異步方式可以提高系統的整體性能,在對系統強壯性要求較高的場合,建議採用這種方式。查詢方式是一種最直接的讀串口方式,但定時查詢存在一個致命的弱點,即查詢是定時發生的,可能發生得過早或過晚。在數據變化較快的情況下,特別是主控計算機的串口通過擴展板擴展到多個時,需定時地對所有串口輪流查詢,此時容易發生數據的丟失。雖然定時間隔越小,數據的實時性越高,但系統的資源也被佔去越多。事件驅動方式是一種高效的串口讀方式,這種方式的實時性較高,特別是對於擴展了多個串口的情況,只有當設定的事件發生時,應用程序得到消息後,才進行相應的處理,避免了數據丟失。事件驅動方式能夠更好地處理串行端口通信交互,其優點是程序響應及時,可靠性高。在實時性要求較高的場合建議採用事件驅動方式。
1.3
實現步驟
利用PC機的串口實現串行通信的一般步驟如下:
(1)
打開並配置串口
在應用程序中要使用串口進行通信,必須在使用前向操作系統提出資源申請,要求打開串口,爲了保證串口通信數據傳輸的可靠性,串口打開時一般都設置爲非共享模式,串口一旦被打開,其他的應用程序將無法打開或使用它。
在使用串口進行數據通信前必須對其進行配置,串口配置主要包括波特率、數據位數、停止位數、奇偶校驗、發送緩衝區大小、接收緩衝區大小等。
(2)
數據讀寫和超時設置
串口打開並配置好後即可對其進行讀寫操作了,對串口的讀寫操作可採用查詢、同步、異步和事件驅動等方式。
在串口通信時如果數據傳輸突然中斷,對串口的讀寫操作可能會進入無限期的等待狀態,爲避免這種情況發生,必須設置串口讀寫操作的等待時間,等待時間超過後,串口的讀寫操作將被主動放棄,這樣即使數據傳輸突然中斷,程序也不會被掛起或阻塞。
(3)
關閉串口
在串口使用完後應將其關閉,否則如果沒有關閉串口,該串口將始終處於打開狀態,其他的應用程序就無法打開或使用它。

2 PowerBuilder編程中實現串行通信的方法
利用PowerBuilder實現串行通信常用的方法主要有四種:一是使用通信控件,如MSComm控件;二是調用Win32 API函數;三是利用串行通信組件;四是調用DLL(動態連接庫)實現串行通信編程,下面就四種方法分別加以討論。
2.1
使用MSComm通信控件實現串行通信編程
2.1.1 MSComm
控件

PowerBuilder中可採用Mscomm32.ocx控件實現串行通信編程。串行通信控件Mscomm32.ocx(簡稱MSComm)是 Microsoft公司提供的Windows下串行通信編程的32ActiveX控件。該控件將串行通信的大部分操作都封裝到控件的內部,提供了一系列通信命令的接口屬性和事件,它允許建立串行口連接,可以連接到其他通信設備(如Modem)、還可以發送命令、進行數據交換以及監視和響應在通信過程中可能發生的各種錯誤和事件,從而可以用它創建全雙工的事件驅動的通信程序。
MSComm
控件提供兩種處理通信的方式:事件驅動方式和查詢方式。查詢方式通過檢查CommEvent屬性值來確定通訊事件和錯誤。事件驅動方式在串口接收到或發送完指定數量的數據時或狀態發生改變時,MSComm通信控件捕獲到這些事件和錯誤,觸發OnComm事件,通過檢查MSComm控件的 CommEvent屬性的值來獲得所發生的事件和錯誤代碼值,從而執行相應的處理。
2.1.2 MSComm
控件主要屬性和事件
CommPort:設置並返回通信端口號,選COM1時值爲1
Setting
:以字符串的形式設置並返回串口通信參數,格式爲波特率、奇偶校驗、數據位、停止位
PortOpen
:設置並返回通信端口的狀態,屬性爲True打開串口,爲False關閉串口並清除接收和傳輸緩衝區。
InputMode
:設置從緩衝區讀取數據的格式,0文本形式,1二進制形式;
Input
:從接收緩衝區讀取數據;
Output
:向發送緩衝區寫入數據;
InBufferCount
:設置接收緩衝區中的字節數;
OutBufferCount
:設置發送緩衝區中的字節數;
InputLen
:設置並返回Input屬性從接收緩衝區讀取的字節數;
Rthreshold
:當CommEvent 屬性爲ComEvReceive併產生OnComm之前設置並返回要接收的字符數
CommEvent
:返回最近的通信事件或錯誤;
OnComm
事件:無論何時當 CommEvent 屬性的值變化時,就產生 OnComm 事件,標誌發生了一個通信事件或一個錯誤。

2.2 調用Win32 API函數實現串行通信編程
Windows
操作系統對系統底層操作採取了屏蔽的策略,禁止應用程序直接訪問計算機I/O端口,而由設備驅動程序統一管理,Windows封裝了 Windows的通信機制,這種方式稱爲通信應用程序接口API(Application Programming Interfaces)Windows 9x/NT/2000提供的API一般都支持32位的操作,又稱爲Win32 API,程序員可以利用Win32 API的通信函數進行編程,不用對硬件直接進行操作,使得應用程序的編制更加方便。
2.2.1 Win32 API
常用通信函數
在進行串口通信時,經常需要用到下列一些API函數:
CreateFile()
:用於打開一個文件訪問串口;
GetCommState()
:獲取串口的當前配置,放入設備控制塊DCB中;
SetCommState():
根據DCB重新配置串口參數;
SetCommTimeouts()
:設置串口讀寫操作的溢出時間;
ReadFile()
:從串口的輸入緩衝區讀取數據;
WriteFile()
:向串口的輸出緩衝區寫入數據;
SetCommMask()
:監視指定通信資源上的事件;
WaitCommEvent()
:等待通信事件發生;
CloseHandle()
:關閉由CreateFile函數打開的串口。
以上這些函數的原形可在參考文獻[1]中找到。
2.2.2 API
函數在PowerBuilder中的聲明
PB支持對Win32 API函數的調用,在PB中使用Win32 API函數時,首先要將它們聲明爲外部全局函數,然後在腳本中調用。在PB中聲明外部函數的語法爲:
{Access} FUNCTION ReturnDataType FunctionName( {REF} {DataType1 Arg1,…,DataTypeN ArgN}) LIBRARY LibraryName
其中各參數的含義是:
Access
:訪問級別,可以是PublicPrivateProtected,缺省爲Public
ReturnDataType
:返回函數類型;
FunctionName
:函數名,存儲在DLL中的函數名。
DataType
:參數的數據類型;
Arg
:參數名;
LibraryName
:動態連接庫名。
PB中聲明時數據類型必須換成PB中相應的數據類型,而在聲明或者調用到的結構類型(如DCB結構)和一些常量也應在PB中創建或聲明。ReadFile()函數在PB下的聲明爲:
FUNCTION ulong ReadFile(ulong hFile,ref Any lpBuffer,ulong nNumberOfBytesToRead,ref ulong lpNumberOfBytesRead,ref OVERLAPPED lpOverlapped) LIBRARY "kernel32.dll"
2.2.3
調用Win32 API函數實現串行通信主要步驟
PB中將Win32 API函數申明爲外部函數之後,就可以像調用PB自身的函數一樣調用它們。在PB編程中調用Win32 API函數實現串行通信主要步驟如下:
1)打開串口
調用CreateFile()函數打開並初始化串口,以確定本應用程序對此串口的佔有權並封鎖其他應用程序對此串口的操作。成功打開串口後,函數返回標誌該串口資源的句柄,以後對串口的讀寫操作都是通過該句柄實現的。
2)配置串口
Windows
的串口和串行通信驅動程序是通過一個被稱爲設備控制塊(DCB)的數據結構進行配置的,Windows爲獲取通信端口的狀態提供了重要的 GetCommState()函數。使用GetCommState()函數獲取串口的當前配置,即獲得當前的設備控制塊DCB結構,更改DCB結構中的參 數,再調用SetCommState()函數重新設置串口的波特率、數據位、檢驗位與停止位來配置串口。通過SetComm()函數設置串行通信端口的輸入和輸出緩衝區的大小,通過SetCommTimeouts()函數設置串口讀寫操作的溢出時間。如果不對串行口資源進行設置,將使用系統的缺省配置。
3)對串口進行讀寫操作
當採用事件驅動I/O設備時,用SetCommMask()來監視指定通信資源上的事件,用WaitCommEvent()來等待通信事件發生。在此基礎上就可以在相應的串口上作數據的傳輸。通過ReadFile()函數或ReadFileEx()函數對串口進行讀操作,通過WriteFile()WriteFileEx()函數對串口進行寫操作。
4)關閉串口
串行通信結束時調用CloseHandle函數關閉由CreateFile函數打開的串口,釋放串口資源。
2.3
利用通信組件實現串行通信編程
2.3.1
利用SPComm組件實現串行通信編程

串行口VCL組件SPComm封裝有豐富的與串口通信密切相關的屬性和事件,是目前功能比較完善的串行通信組件,提供有完整的源代碼。
1SPComm的主要屬性
CommName
:填寫所要打開的串口名字,如“COM1”
RaudRate
:設定實際的串行通信波特率。
ParityCheek
:奇偶校驗。
ByteSize
:設定字節長度。
Parity
:奇偶校驗位。
StopBits
:停止位。
SendDataEmpty
:布爾屬性,爲True時表示發送緩存爲空,或者發送隊列裏沒有信息;爲False時表示發送緩存不爲空,或者發送隊列裏有信息。
2SPComm的主要方法和事件
StartComm()
過程用於打開串口,當操作失敗時通常會報錯,錯誤主要有7種:串口已經打開;打開串口錯誤;文件句柄不是通訊句柄;不能安裝通訊緩存;不能產生事件;不能產生讀進程;不能產生寫進程。
StopComm()
過程用於關閉串口,沒有返回值。
WriteCommData()
函數把要發送的字符串寫入發送緩衝區,發送成功返回True,發送失敗返回False。執行此函數將立即得到返回值,發送 操作隨後執行。此函數有兩個參數:pDataToWrite是要發送的字符串;dwSixeofDataToWrite是發送數據幀的長度。
OnReceiveData(Tobject * Sender, Pointer Buffer, WORD BufferLength)
事件的功能是當輸入緩存有數據時將觸發該事件,可在該事件中對從串口收到的數據進行處理。參數Buffer是接收到的數據,BufferLength是接 收到的數據長度。
OnReceiveError(Tobject * Sender,DWORD EventMask)
事件功能是當接收數據時出現錯誤將觸發該事件,EventMask是錯誤事件的代碼。
OnSendDataEmpty(Tobject * Sender)
事件的功能是當發交通安全數據完成時將觸發該事件。
SPComm
組件的應用與MSComm控件相似,基本編程時只要給組件的相關屬性正確賦值就可配置串行通信參數,通過組件的方法打開/關閉串口和發送數據,在組件相應的通信事件處理函數中接收數據和處理通信事件。與MSComm ActiveX控件不同的是,SPComm組件是標準的VCL組件,提供多線程編程的支持,能夠更可靠地進行串行數據通信。
2.3.2
利用其它第三方組件實現串行通信編程
某些公司根據實際的需要爲Windows環境提供了不同的開發工具。如TurboPower公司出品的Async Professional VCL組件包,功能更具體和完善,完全支持COM端口控制和WinSock協議,支持與ISDN ModemRS485等硬件接口交互等功能,程序員可以選用其VCL組件進行串行通信程序開發。
2.4
利用DLL實現串行通信編程
MOXA
AdvantechNI等公司在提供串行通信接口硬件板卡產品的同時,提供了相應的DLLDynamic Link Libraries動態鏈接庫)文件,程序員可以根據實際情況選用對應的DLL文件進行串行通信程序的二次開發;另外,程序員也可先用VC或其他高級編程 語言將通信程序編寫成DLL文件,然後在PB中調用此DLL中的函數實現串行通信。編程中應特別注意要對DLL文件中的函數進行聲明。

 

 

3 串行通信編程實例
通過PC機的串行口與單片機系統進行通信,完成對單片機系統的控制和數據的接收處理。PC機通信程序採用PB8.0MSComm通信控件編寫。
在通信窗口中插入MSCOMM32.OCX通信控件,控件名爲Ole_MSC,添加讀數據按鈕,名爲cb_read。通信控件用於訪問串口、發送和接收數據,數據傳輸採用二進制方式。
1)打開並配置串口
在通信窗口的Open()事件中編程,完成對串口的打開和配置,程序如下:
Ole_MSC.object.CommPort=1 //
設置通訊端口號爲COM1
Ole_MSC.object.Settings = "4800,n,8,1" //
波特率4800 bps,無奇偶校驗,8位數據位,1位停止位。
Ole_MSC.object.InBufferSize =600 //
設置接收緩衝區的字節數
Ole_MSC.object.OutBufferSize =600 //
設置發送緩衝區的字節數
If Ole_MSC.object.PortOpen <> True Then
Ole_MSC.object.PortOpen = True //
打開串口
End If
Ole_MSC.object.InputMode =1 //
二進制方式讀取數據
Ole_MSC.object.SThreshold = 0 //
數據傳輸事件不產生 OnComm 事件
Ole_MSC.object.RThreshold = 400 //
400個字節的數據到緩衝區都觸發OnComm 事件。
2)數據的發送
通過Output屬性向傳輸緩衝區發送讀數據命令“ReadData”。數據的傳輸採用二進制方式,PB中發送和接收二進制數據,採用blob類型的變量。cb_readclick()事件程序如下:
blob bufferout
Ole_MSC.object.OutBufferCount=0 //
清空發送緩衝區
Ole_MSC.object.InBufferCount=0 //
清空接收緩衝區
bufferout=blob("ReadData")
Ole_MSC.object.Output =bufferout //
向傳輸緩衝區發送讀數據命令
3)數據的接收處理
當單片機接收到讀數據的通信命令後,向緩衝區發送數據,進入通信狀態。數據的傳輸採用定長的二進制方式,單片機向緩衝區發送400個字節長的數據,當 400個字節的數據到緩衝區則觸發Ole_MSCOnComm()事件。通信控件Ole_MSCOnComm事件程序如下(數據處理程序略):
blob buffer
choose Case ole_1.object.CommEvent
Case 2 // CommEvent
屬性爲ComEvReceive
ole_1.object.InputLen =0 //
讀入整個緩衝區中的數據
buffer=ole_1.object.Input //
從接收緩衝區讀取全部數據
……
end choose
4)關閉串口
在串口使用完後應將其關閉,釋放串口資源。
If Ole_ MSC.object.PortOpen <> False Then
Ole_ MSC.object.PortOpen = False //
關閉串口
End If
4
結束語
比較以上實現串行通信的方法可知,使用MSComm控件或SPComm組件編程比較簡單,對硬件掌握的程度要求不高,容易掌握,開發週期短,更適合於快速開發串口通信程序,MSComm控件通信的實時性不高,高速通信時準確性和處理速度一般,只能應用於相對比較簡單的小型控制系統和通信系統,SPComm 組件支持多線程,通信的實時性和可靠性均可得到保證。調用Win32 API函數來實現串行通信,程序編寫較爲複雜,需要掌握大量通信知識,其優點是可實現的功能更強大,應用面更廣泛,更適合於面向具體要求編寫靈活多變的底層通信程序,常應用於響應要求嚴格、數據量大的系統中。在不同的應用中要視串口通信任務的要求,採用不同的方法開發通信程序,才能取得較好的效果。文中所給程序在PB8.0環境中運行通過。

發佈了51 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章