powerbuilder串列埠程式設計的實現
因公司軟體產品需要和pos機進行通訊,所以筆者研究了一下pb串列埠程式設計的實現方式。
pb是乙個非常好的資料庫管理系統的開發工具,但在web和計算機介面通訊等方面pb就不是很好用了。幸好我們有ole和com這些很牛的技術,可以讓我們非常容易的使用一些元件的功能,而不用自己去開發去關心底層的業務邏輯。使用pb進行串列埠程式設計有兩種途徑,一種是使用微軟提供的通訊控制項(mscomm控制項),另一種是用win32 api函式。下面主要講解使用mscomm控制項實現串列埠程式設計的方法。
序列通訊控制項mscomm32.ocx(簡稱mscomm)是 microsoft公司提供的windows下序列通訊程式設計的32位activex控制項。該控制項將序列通訊的大部分操作都封裝到控制項的內部,提供了一系列通訊命令的介面屬性和事件,它允許建立序列口連線,可以連線到其他通訊裝置(如modem)、還可以傳送命令、進行資料交換以及監視和響應在通訊過程中可能發生的各種錯誤和事件,從而可以用它建立全雙工的事件驅動的通訊程式。mscomm控制項提供兩種處理通訊的方式:事件驅動方式和查詢方式。查詢方式通過檢查commevent屬性值來確定通訊事件和錯誤。事件驅動方式在串列埠接收到或傳送完指定數量的資料時或狀態發生改變時,mscomm通訊控制項捕獲到這些事件和錯誤,觸發oncomm事件,通過檢查mscomm控制項的 commevent屬性的值來獲得所發生的事件和錯誤**值,從而執行相應的處理。
1、mscomm32.ocx的註冊
我們可以單獨製做乙個註冊程式,並打包到您的應用程式中。如果需要安裝的目標計算機已經有「mscomm」控制項,則不需要進行任何工作。如果沒有「mscomm」控制項,則需要執行這個註冊程式。
程式的pb編碼如下:
registryset("hkey_classes_root\licenses\4250e830-6ac2-11cf-8adb-00aa00c00905","",regstring!,"kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun")
run("regsvr32 mscomm32.ocx")
messagebox('提示','請重新啟動計算機')
這只是簡單的編碼,並且mscomm32.ocx檔案在當前執行目錄,註冊成功即出現系統訊息。為了使介面更友好,您可以做一步修飾,例如「run("regsvr32/s mscomm32.ocx")」,這樣就可以使螢幕上不出現系統訊息了。
您還可以利用api函式,通過「exitwindow***」函式(user32.dll)可以實現重新啟動windows系統。
2、使用mscomm32控制項進行串列埠通訊
mscomm32控制項的常用屬性如下:
commport:設定或返回串口號,預設為1
setting:設定或返回序列端的波特率、奇偶校驗位、 資料位數、停止位。預設值為"9600,n,8,1"。
portopen:設定它為true則開啟埠,設定它為false則關閉埠。
inbuffersize:設定或返回接收緩衝區的大小,預設為1024 字 節。
inbuffercount:返回接收緩衝區內的等代讀取的位元組個數,設屬性為0清除接收緩衝區。
outbuffersize:設定或返回傳送緩衝區,預設為512位元組。
outbuffercounter:返回傳送緩衝區內等待傳送的字元數,可用0來清空緩衝區。
output:向傳送緩衝區傳送資料
rthreshold: 該屬性確定當接收緩衝區內位元組個數達或超過該值後就產生**為comeventreceive
的oncomm事件,設定位0,則不產生oncomm事件。
commevent:有通訊錯誤或事件發生時產生oncomm事件,commevent事件的值可以用來確定引
發oncomm事件的具體的錯誤或事件常用的有以下幾種(更詳細的資料可參考mscomm控制項幫助檔案)
comeventbreak:接受到中斷訊號
comeventframe:硬體檢測到幀錯誤。
comeventrxover:接收緩衝區溢位。
comeventtxfull:傳送緩衝區溢位。
comeventreceive:接受到規定的字元數。
inputlen:設定或返回接收緩衝區內用input讀入的個數。若取0,則讀取整個緩衝區的內容。
input:返回並刪除接受緩衝區的資料。
3、pb的例項**
我們可以根據我們程式的需要來設定上面的屬性。mscomm控制項提供下列兩種處理通訊的方式:事件驅動方式和查詢方式。由於筆者只需要和pos機進行簡單的通訊,所以我使用比較簡單的查詢方式。對於查詢方式,我們只要使用pb操作mscomm32的output和input兩個屬性就可以了。下面是示例**:
oleobject i_ole_comm //宣告ole物件,用來連線mscomm控制項
i_ole_comm=create oleobject
vresult=i_ole_comm.connecttonewobject('mscommlib.mscomm')
//下面初始化mscomm32的引數,並開啟串列埠
if p_comport=1 then
i_ole_comm.commport = 1 //1代表com1口,2代表com2口
elseif p_comport=2 then
i_ole_comm.commport = 2
else
i_errcode=-1
i_errtext='uo_rs232ld.f_setdevice:開啟串列埠com'+string(p_comport)+'埠出錯,請確認此埠存在且沒有被其他程式使用'
return i_errcode
end if
i_ole_comm.settings="9600,n,8,1" //波特率這裡設定成了9600,這個要與pos機設定的波特率一直
i_ole_comm.inputlen=0
i_ole_comm.inbuffersize=90
i_ole_comm.outbuffersize=60
i_ole_comm.sthreshold=0
i_ole_comm.rthreshold=9
i_ole_comm.handshaking=0
i_ole_comm.inbuffercount=0
i_ole_comm.dtrenable=true
if not i_ole_comm.portopen then
i_ole_comm.portopen=true
end if
//向串列埠傳送報文
i_ole_comm.output=「hello world」
//接受串列埠報文,迴圈等待接收pos機上傳的報文,超時則返回
do while true
yield()
sleep(20)
vinput +=i_ole_comm.input //從com埠取資料
if pos(vinput,vend) > 0 then exit //如果存在訊息結束符,則推出迴圈
loop
PB中實現串列埠通訊
在窗 口上加入ole控制項,選擇mscomm32。程式設計舉例如下 ole comm1.object.commport 1 ole comm1是ole控制項的名稱,commport是埠。ole comm1.object.settings 4800,n,8,1 設定通訊協議 ole comm1.obj...
qt串列埠程式設計
本帖被 xchinux 執行加亮操作 2008 04 22 serial.cpp int main int argc,char argv mainwindow.h ifndef main window h define main window h include class qlabel class...
Windows串列埠程式設計
一 基本知識 win32下串列埠通訊與16位串列埠通訊有很大的區別。在win32下,可以使用兩種程式設計方式實現串列埠通訊,其一是呼叫的windows的api函式,其二是使用activex控制項。使用api 呼叫,可以清楚地掌握串列埠通訊的機制,熟悉各種配置和自由靈活採用不同的流控進行串列埠通訊。下...