關于控件的一些說明_第1頁
關于控件的一些說明_第2頁
關于控件的一些說明_第3頁
關于控件的一些說明_第4頁
關于控件的一些說明_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、關于M 控件的一些說明的m 通信控件提供了一系列標準通信命令的接口,它允許建立串口連接,可以連接到其他通信設備(如 Modem)還可以發(fā)送命令、進行以及監(jiān)視和響應在通信過程中可能發(fā)生的各種錯誤和事件,從而可以用它創(chuàng)建全雙工 、事件驅動的、高效實用的通信程序。但在實際通信設計過程中,m 控件并非像想像中那樣完美和容易控制特別是在中文 Wln9598 下通信時更會出現問題。下面就從基礎開始介紹,然后逐步討淪控件在編程中出現的問題以及編程技巧。m一、用m 控件通信1串口通信基礎知識一般悅來,計算機都有一個或多個串行端口,它們依次為、2、,這些串口還提供了外部設備與進行數據傳輸和皿信的通道。這些串口在

2、 CPU 和外設之間充當解釋器的角色。當字符數據從 CPU發(fā)送給外設時,這些字符數據將被轉換成串行比特流數據;當接收數據時,比特流數據被轉換為字符數據傳遞給 CPU,再進一步說,在操作系統方面,Windows 用通信驅動程序(COMM.DRV)調用 API 函數發(fā)送和接收數據,當用通信控件或時,它門由 COMM. DRV 解釋并傳遞給設備驅動程序,調用 API 函數作為一個 vB 程序員,要編寫通信程序只需知道通信控件提供給 Windows 通信AP1 函數的接口即可換句話說,只需設定和監(jiān)視通信控件的屬性和事件即可。2使用在開始使用屬性 CommPort Settings PortOpen I

3、nput Outputm 控件m 控件之前。需要先了解其屬性、事件或錯誤描述設置或返回通信端以字符串的形式設置或返回波特率、奇偶校驗、數據位和停止位設置或返回通信端口的狀態(tài)。也可以打開和關閉端口返回和刪除接收緩沖區(qū)中的字符將字符串寫入發(fā)送緩沖區(qū)CommEvent 屬性為通信事件或錯誤返回下列值之一。在該控件的對象庫中也可以找到這些常量。常量 ComEventBreak ComEventCTSTO值10011002描述收到了斷開信號Clear To Send Timeout。在發(fā)送字符時,在系統指定的事 1 件內,CTS(Clear To Send)線是低電平ComEventDSRTO1003D

4、ata Set Ready Timeout。在發(fā)送字符時,在系統指 Set Ready)線是低電平數據幀錯誤。硬件檢測到一個數據幀錯誤端口溢出。硬件中的字符尚未讀,下一個字符又到達,定的事件內,DSR(DataComEventFrame1004ComEventOverrun 1006并且丟失ComEventCDTO1007Carrier Detect Time。在發(fā)送字符時,在系統指定 Detect)線是低電平。CD的事件內,CD(Carrier也稱為 RLSD(Receive Line Singal Detect,接收線信號檢測)ComEventRxOver1008ComEventRxPar

5、ity 1009ComEventTxFull1010接收緩沖區(qū)溢出。在接收緩沖區(qū)中沒有空間奇偶校驗錯。硬件檢測到奇偶校驗錯誤 7發(fā)送緩沖區(qū)滿。在對發(fā)送字符排隊時,發(fā)送緩沖區(qū)滿檢取端口 DCB(Device Control Blick)時發(fā)生了沒ComEventDCB有預料到的錯誤1011通信事件包含了下面的設置:常量 ComEvSend ComEvReceive值12描述發(fā)送緩沖區(qū)中的字符數比 Sthreshold 值低接收到了 Rthreshold 個字符。持續(xù)產生該事件,直到使用了 Input 屬性刪除了接收緩沖區(qū)中的數據ComEvCTS ComEvDSR 該事件發(fā)生 ComEvCD34C

6、TS(Clear To Send)線改變DSR(Data Set Ready)線改變。當 DSR 從 1 到 0 改變時,5CD(Carrier Detect)線改變 ComEvRing6 檢測到響鈴信號。一些 URAT(Universal AsynchronousReciver-Transmitters,通用異步收發(fā)器)不支持該事件ComEvEOF7收到了 EOF 字符(ASCII 字符 26)Error 消息(常量m 控件)下表列出了值m 控件可捕獲的錯誤消息:描述ComInvalidPropertyValue ComSetNotSupported ComGetNotSupported C

7、omPortOpen380383394800080018002800380048005800680078008800980108011801280138014801580168018無效的屬性值屬性只讀屬性只讀端口打開時該存在無效超時設置必須比 0 值大無效的端屬性只在運行時有效 屬性在運行時是只讀的端口已經打開設備標識符無效或不支持不支持設備的波特率指定的字節(jié)大小無效缺省參數錯誤硬件不可用(被其他設備鎖住)函數不能分配隊列設備沒有打開設備已經打開不能使用通信通知不能設置通信狀態(tài)不能設置通信事件該存在只在端口打開是有效ComPortInvalidComPortAleadyOpenComNoOp

8、enmSeFailedComPortNotOpen801980208021設備忙通信設備讀錯誤檢取端口設備控制塊時出現內部錯誤ComReadError ComDCBError搞清楚以上基本屬性后,就可以開始編寫通信許程序了。在 VB5.0/6.0 中新建一個工程文件。添加件,在簡體 Form1 中加入Comm Control 5.0 組d 命令按鈕并取名為 CmdTest,m 控件取名為m1,加入如下程序代碼。Private Sub cmdTestClick ( )mPort =2打開串口 設定 Com2Ifml.PortOpen = False Then m1.Settings = 9600

9、,n,8,19600 波特率,無校驗,8 位數據位,1 位停止位m1.PortOpen = True End ifm1.OutBufferCount = 0m1.InBufferCount = 0打開串口清空發(fā)送緩沖區(qū) 滑空接收緩沖區(qū)發(fā)送字符數據時注意必須用回車符(vbcr)結束 m1.Output=This is a qood book ! &vbCr潑打號碼或發(fā)送 AT 命令m1.Output = ATDT 05778191898 , & vbCr發(fā)送字符數組數據時注意 ByteArray 必須事先定義賦值Dim ByteArray as byte( )定義動態(tài)數組 ReDim ByteA

10、rray(1)重定義數組大小 ByteArray ( 0 ) =0ByteArray ( 1 ) = 1m1.Output End Sub=ByteArrayprivate Sub Select CasemEvent( )mEventCase comEvReceiveDim Buffer As Variant m1.InputLen = 0接收二進制數據m1.InputMode= ComInputModeBinary m1.Input接收字符數據InputModeText ml.InputBuffer = Case else End Select End sub( 程序 1)二、中文 Win

11、9598 下的通信問題與解決方法1接收的數據少于發(fā)送的數據如果通過m 控件傳送較多的二進制數據,那么,很可能收到的數據不足。例如在設置為 24oobps 傳輸率的情況下,可以傳輸 2048 個字符數據 那么在大多數情況下。一次只能收到 1200 個字符左右,這址出為新版的m32OCX 中存在一個影響傳輸二進制數據的臭蟲(bug)注意這不是特性。32 位 Windows API 函數(以下簡稱 API)使用了幾個用 COMMTIMEOUTS 結構表示的限時變量,WriteTotalTimeOonstant 即是其中的一個,它被Windows 內部設定為 5000(即 5 秒),這個常量決定了在通

12、信驅動程序停止傳輸之前花費在發(fā)送緩沖區(qū)中數據的時間的長短,5 秒鐘意味著通信速度為 1200bps 情況下僅能發(fā)送 600 個字符,24oobps情況下僅能發(fā)送 1200 個左右的字符。事實上,在一個緩沖區(qū)內發(fā)送的數據是非常可能的。這個 bug 同樣也能問題,甚至在高速串口門通信情況下,即使系統在使用流控制,無論叢流(XonXofI)還是硬件流(CTSRTS)。假如數據在發(fā)送緩沖區(qū)中時,流控制停止了傳輸,如果停止時間超過 5秒鐘則數據就會丟失。在某些環(huán)境下,5 秒鐘可能相當短不過也不必擔心,VB 5.0/6.0 版本的m 控件有一個新增的重要的屬性稱為 CommID, CommID 指的是當串

13、口被打開時,被 API 所調用的串口句柄或稱標志,這也意味著能利用 API 接口函數去修改這個常量。每次串口關閉后,Windows 會自動將之恢復為 5000,所以,每次打開串口后需要重斬設定以下 API Type COMMTIMEOUTS,其代碼見下程序。ReadervalTimeout AsLongr As LongReadTotalTimeoutMultipReadTotalTimeoonstantAs Longr As LongWriteTotalTimeoutMultipWriteTotalTimeoonstant As Long End TypeDeclare Function (

14、BYVal hFile As Long, Declare Function (ByVal hFile As Long,mTimeouts Lib Kernel32m TimeoutsAs COMMTIMEOUTS) As Long mTimeouts Lib Kernel32mTimeouts As COMMTIMEOUTS) As LongDim timeouts As COMMEOUTS Dim Ret As LongIf Comm1.PortOpen = False Then Comm1.PortOpen = TrueEnd ifmTimeouts (Set some default t

15、imeoutsmID , timeouts )timeOuts.ReadervalTimeout = 1timeouts.ReadTotalTimeoutMultipr =1=1r =1timeouts.ReadTotalTimeoonstanttimeouts.WriteTotalTimeoutMultiptimeouts.WriteTotalTimeoonstant=( Comm1.OutBufferSizeVal(Comm1.Settings)*10000mTimeouts(mID , timeouts )( 程序 2)2如何發(fā)送大于 128 的字符數據在通信程序中,以單字符方式逐個發(fā)送

16、數據時,每一個數據范圍 0-255(即進制的 00-FF)。在單字符版本的英文 Win95 或DOS 版的 BASIC 程序中,只需要將相應的數據轉換成相應的字符發(fā)送到通信端口即可。但在中文 Win95/98 下卻行不通,假設在中文Win9598 下運行以下程序:Dim iFor i=0 to 255m1.Outp Next ihr(i)希望在接收端得到預期的 0-255 之間的數據,結果卻是:前 129 個數據接收正確,為 0-128,后面 127 個數據為 126 個 0 和一個 255,造成這種給果的原因在于中文 Windows 使用的是雙字節(jié)字符集(DBCS)系統。DBCS系統使用 0

17、-128 之間的數字表示 ASCII 字符,大于128 的數字僅作為前導字符,它只是顯示是一個非拉丁語系的字符,而并不代表實際意義。上述程序在調用 CHR()函數時用到了DBCS 字符集,岡此產生了此類錯誤。那么,如何發(fā)送人于 128 的數據呢?是使用字符數組,將以上程序改為:Dim cc(255) As Byte For i = 0 To 255 cc(i) = iNext im1.Output= ccDo DoEvents Loop Until 接收過程Select Casem1.OutBufferCount = 0m() mEventCase comEvReceiveDim Buffer

18、 As Variant, b1,iInputModeBinerym1.InputLen = 0Buffer =m1.InputFor i=LBound (Buffer) To UBound (Buffer )Debug.Pr Next iBuffer ( i ) ;Case . . . . .3如何發(fā)送 0 字符(00H,NULL)在 VisuaI C中使用串口控件發(fā)送 0 字符有些麻煩,但在 VB5.0/6.0 中只要注意以下兩點即可:(1)設置m 控件的屬性 NullDiscard=False;。(2)使用二進制接收,即用解決問題;InputModeBinary 便可以4如何發(fā)送遞中文字符串(DBcS 字符)VB5.0/6.0 的各種參考書上均指明m 通信控件不能發(fā)送或接收雙字節(jié)字符集系統 DBCS)的二進制數據,這對于我國及亞洲一些使用 DBCS 字符集的國家不能不說是一大人遺憾。但是我在實踐中發(fā)現,用控

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論