




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、關(guān)于M 控件的一些說(shuō)明的m 通信控件提供了一系列標(biāo)準(zhǔn)通信命令的接口,它允許建立串口連接,可以連接到其他通信設(shè)備(如 Modem)還可以發(fā)送命令、進(jìn)行以及監(jiān)視和響應(yīng)在通信過(guò)程中可能發(fā)生的各種錯(cuò)誤和事件,從而可以用它創(chuàng)建全雙工 、事件驅(qū)動(dòng)的、高效實(shí)用的通信程序。但在實(shí)際通信設(shè)計(jì)過(guò)程中,m 控件并非像想像中那樣完美和容易控制特別是在中文 Wln9598 下通信時(shí)更會(huì)出現(xiàn)問(wèn)題。下面就從基礎(chǔ)開(kāi)始介紹,然后逐步討淪控件在編程中出現(xiàn)的問(wèn)題以及編程技巧。m一、用m 控件通信1串口通信基礎(chǔ)知識(shí)一般悅來(lái),計(jì)算機(jī)都有一個(gè)或多個(gè)串行端口,它們依次為、2、,這些串口還提供了外部設(shè)備與進(jìn)行數(shù)據(jù)傳輸和皿信的通道。這些串口在
2、 CPU 和外設(shè)之間充當(dāng)解釋器的角色。當(dāng)字符數(shù)據(jù)從 CPU發(fā)送給外設(shè)時(shí),這些字符數(shù)據(jù)將被轉(zhuǎn)換成串行比特流數(shù)據(jù);當(dāng)接收數(shù)據(jù)時(shí),比特流數(shù)據(jù)被轉(zhuǎn)換為字符數(shù)據(jù)傳遞給 CPU,再進(jìn)一步說(shuō),在操作系統(tǒng)方面,Windows 用通信驅(qū)動(dòng)程序(COMM.DRV)調(diào)用 API 函數(shù)發(fā)送和接收數(shù)據(jù),當(dāng)用通信控件或時(shí),它門(mén)由 COMM. DRV 解釋并傳遞給設(shè)備驅(qū)動(dòng)程序,調(diào)用 API 函數(shù)作為一個(gè) vB 程序員,要編寫(xiě)通信程序只需知道通信控件提供給 Windows 通信AP1 函數(shù)的接口即可換句話說(shuō),只需設(shè)定和監(jiān)視通信控件的屬性和事件即可。2使用在開(kāi)始使用屬性 CommPort Settings PortOpen I
3、nput Outputm 控件m 控件之前。需要先了解其屬性、事件或錯(cuò)誤描述設(shè)置或返回通信端以字符串的形式設(shè)置或返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位設(shè)置或返回通信端口的狀態(tài)。也可以打開(kāi)和關(guān)閉端口返回和刪除接收緩沖區(qū)中的字符將字符串寫(xiě)入發(fā)送緩沖區(qū)CommEvent 屬性為通信事件或錯(cuò)誤返回下列值之一。在該控件的對(duì)象庫(kù)中也可以找到這些常量。常量 ComEventBreak ComEventCTSTO值10011002描述收到了斷開(kāi)信號(hào)Clear To Send Timeout。在發(fā)送字符時(shí),在系統(tǒng)指定的事 1 件內(nèi),CTS(Clear To Send)線是低電平ComEventDSRTO1003D
4、ata Set Ready Timeout。在發(fā)送字符時(shí),在系統(tǒng)指 Set Ready)線是低電平數(shù)據(jù)幀錯(cuò)誤。硬件檢測(cè)到一個(gè)數(shù)據(jù)幀錯(cuò)誤端口溢出。硬件中的字符尚未讀,下一個(gè)字符又到達(dá),定的事件內(nèi),DSR(DataComEventFrame1004ComEventOverrun 1006并且丟失ComEventCDTO1007Carrier Detect Time。在發(fā)送字符時(shí),在系統(tǒng)指定 Detect)線是低電平。CD的事件內(nèi),CD(Carrier也稱為 RLSD(Receive Line Singal Detect,接收線信號(hào)檢測(cè))ComEventRxOver1008ComEventRxPar
5、ity 1009ComEventTxFull1010接收緩沖區(qū)溢出。在接收緩沖區(qū)中沒(méi)有空間奇偶校驗(yàn)錯(cuò)。硬件檢測(cè)到奇偶校驗(yàn)錯(cuò)誤 7發(fā)送緩沖區(qū)滿。在對(duì)發(fā)送字符排隊(duì)時(shí),發(fā)送緩沖區(qū)滿檢取端口 DCB(Device Control Blick)時(shí)發(fā)生了沒(méi)ComEventDCB有預(yù)料到的錯(cuò)誤1011通信事件包含了下面的設(shè)置:常量 ComEvSend ComEvReceive值12描述發(fā)送緩沖區(qū)中的字符數(shù)比 Sthreshold 值低接收到了 Rthreshold 個(gè)字符。持續(xù)產(chǎn)生該事件,直到使用了 Input 屬性刪除了接收緩沖區(qū)中的數(shù)據(jù)ComEvCTS ComEvDSR 該事件發(fā)生 ComEvCD34C
6、TS(Clear To Send)線改變DSR(Data Set Ready)線改變。當(dāng) DSR 從 1 到 0 改變時(shí),5CD(Carrier Detect)線改變 ComEvRing6 檢測(cè)到響鈴信號(hào)。一些 URAT(Universal AsynchronousReciver-Transmitters,通用異步收發(fā)器)不支持該事件ComEvEOF7收到了 EOF 字符(ASCII 字符 26)Error 消息(常量m 控件)下表列出了值m 控件可捕獲的錯(cuò)誤消息:描述ComInvalidPropertyValue ComSetNotSupported ComGetNotSupported C
7、omPortOpen380383394800080018002800380048005800680078008800980108011801280138014801580168018無(wú)效的屬性值屬性只讀屬性只讀端口打開(kāi)時(shí)該存在無(wú)效超時(shí)設(shè)置必須比 0 值大無(wú)效的端屬性只在運(yùn)行時(shí)有效 屬性在運(yùn)行時(shí)是只讀的端口已經(jīng)打開(kāi)設(shè)備標(biāo)識(shí)符無(wú)效或不支持不支持設(shè)備的波特率指定的字節(jié)大小無(wú)效缺省參數(shù)錯(cuò)誤硬件不可用(被其他設(shè)備鎖?。┖瘮?shù)不能分配隊(duì)列設(shè)備沒(méi)有打開(kāi)設(shè)備已經(jīng)打開(kāi)不能使用通信通知不能設(shè)置通信狀態(tài)不能設(shè)置通信事件該存在只在端口打開(kāi)是有效ComPortInvalidComPortAleadyOpenComNoOp
8、enmSeFailedComPortNotOpen801980208021設(shè)備忙通信設(shè)備讀錯(cuò)誤檢取端口設(shè)備控制塊時(shí)出現(xiàn)內(nèi)部錯(cuò)誤ComReadError ComDCBError搞清楚以上基本屬性后,就可以開(kāi)始編寫(xiě)通信許程序了。在 VB5.0/6.0 中新建一個(gè)工程文件。添加件,在簡(jiǎn)體 Form1 中加入Comm Control 5.0 組d 命令按鈕并取名為 CmdTest,m 控件取名為m1,加入如下程序代碼。Private Sub cmdTestClick ( )mPort =2打開(kāi)串口 設(shè)定 Com2Ifml.PortOpen = False Then m1.Settings = 9600
9、,n,8,19600 波特率,無(wú)校驗(yàn),8 位數(shù)據(jù)位,1 位停止位m1.PortOpen = True End ifm1.OutBufferCount = 0m1.InBufferCount = 0打開(kāi)串口清空發(fā)送緩沖區(qū) 滑空接收緩沖區(qū)發(fā)送字符數(shù)據(jù)時(shí)注意必須用回車符(vbcr)結(jié)束 m1.Output=This is a qood book ! &vbCr潑打號(hào)碼或發(fā)送 AT 命令m1.Output = ATDT 05778191898 , & vbCr發(fā)送字符數(shù)組數(shù)據(jù)時(shí)注意 ByteArray 必須事先定義賦值Dim ByteArray as byte( )定義動(dòng)態(tài)數(shù)組 ReDim ByteA
10、rray(1)重定義數(shù)組大小 ByteArray ( 0 ) =0ByteArray ( 1 ) = 1m1.Output End Sub=ByteArrayprivate Sub Select CasemEvent( )mEventCase comEvReceiveDim Buffer As Variant m1.InputLen = 0接收二進(jìn)制數(shù)據(jù)m1.InputMode= ComInputModeBinary m1.Input接收字符數(shù)據(jù)InputModeText ml.InputBuffer = Case else End Select End sub( 程序 1)二、中文 Win
11、9598 下的通信問(wèn)題與解決方法1接收的數(shù)據(jù)少于發(fā)送的數(shù)據(jù)如果通過(guò)m 控件傳送較多的二進(jìn)制數(shù)據(jù),那么,很可能收到的數(shù)據(jù)不足。例如在設(shè)置為 24oobps 傳輸率的情況下,可以傳輸 2048 個(gè)字符數(shù)據(jù) 那么在大多數(shù)情況下。一次只能收到 1200 個(gè)字符左右,這址出為新版的m32OCX 中存在一個(gè)影響傳輸二進(jìn)制數(shù)據(jù)的臭蟲(chóng)(bug)注意這不是特性。32 位 Windows API 函數(shù)(以下簡(jiǎn)稱 API)使用了幾個(gè)用 COMMTIMEOUTS 結(jié)構(gòu)表示的限時(shí)變量,WriteTotalTimeOonstant 即是其中的一個(gè),它被Windows 內(nèi)部設(shè)定為 5000(即 5 秒),這個(gè)常量決定了在通
12、信驅(qū)動(dòng)程序停止傳輸之前花費(fèi)在發(fā)送緩沖區(qū)中數(shù)據(jù)的時(shí)間的長(zhǎng)短,5 秒鐘意味著通信速度為 1200bps 情況下僅能發(fā)送 600 個(gè)字符,24oobps情況下僅能發(fā)送 1200 個(gè)左右的字符。事實(shí)上,在一個(gè)緩沖區(qū)內(nèi)發(fā)送的數(shù)據(jù)是非??赡艿?。這個(gè) bug 同樣也能問(wèn)題,甚至在高速串口門(mén)通信情況下,即使系統(tǒng)在使用流控制,無(wú)論叢流(XonXofI)還是硬件流(CTSRTS)。假如數(shù)據(jù)在發(fā)送緩沖區(qū)中時(shí),流控制停止了傳輸,如果停止時(shí)間超過(guò) 5秒鐘則數(shù)據(jù)就會(huì)丟失。在某些環(huán)境下,5 秒鐘可能相當(dāng)短不過(guò)也不必?fù)?dān)心,VB 5.0/6.0 版本的m 控件有一個(gè)新增的重要的屬性稱為 CommID, CommID 指的是當(dāng)串
13、口被打開(kāi)時(shí),被 API 所調(diào)用的串口句柄或稱標(biāo)志,這也意味著能利用 API 接口函數(shù)去修改這個(gè)常量。每次串口關(guān)閉后,Windows 會(huì)自動(dòng)將之恢復(fù)為 5000,所以,每次打開(kāi)串口后需要重?cái)卦O(shè)定以下 API Type COMMTIMEOUTS,其代碼見(jiàn)下程序。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 的字符數(shù)據(jù)在通信程序中,以單字符方式逐個(gè)發(fā)送
16、數(shù)據(jù)時(shí),每一個(gè)數(shù)據(jù)范圍 0-255(即進(jìn)制的 00-FF)。在單字符版本的英文 Win95 或DOS 版的 BASIC 程序中,只需要將相應(yīng)的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的字符發(fā)送到通信端口即可。但在中文 Win95/98 下卻行不通,假設(shè)在中文Win9598 下運(yùn)行以下程序:Dim iFor i=0 to 255m1.Outp Next ihr(i)希望在接收端得到預(yù)期的 0-255 之間的數(shù)據(jù),結(jié)果卻是:前 129 個(gè)數(shù)據(jù)接收正確,為 0-128,后面 127 個(gè)數(shù)據(jù)為 126 個(gè) 0 和一個(gè) 255,造成這種給果的原因在于中文 Windows 使用的是雙字節(jié)字符集(DBCS)系統(tǒng)。DBCS系統(tǒng)使用 0
17、-128 之間的數(shù)字表示 ASCII 字符,大于128 的數(shù)字僅作為前導(dǎo)字符,它只是顯示是一個(gè)非拉丁語(yǔ)系的字符,而并不代表實(shí)際意義。上述程序在調(diào)用 CHR()函數(shù)時(shí)用到了DBCS 字符集,岡此產(chǎn)生了此類錯(cuò)誤。那么,如何發(fā)送人于 128 的數(shù)據(jù)呢?是使用字符數(shù)組,將以上程序改為:Dim cc(255) As Byte For i = 0 To 255 cc(i) = iNext im1.Output= ccDo DoEvents Loop Until 接收過(guò)程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 中只要注意以下兩點(diǎn)即可:(1)設(shè)置m 控件的屬性 NullDiscard=False;。(2)使用二進(jìn)制接收,即用解決問(wèn)題;InputModeBinary 便可以4如何發(fā)送遞中文字符串(DBcS 字符)VB5.0/6.0 的各種參考書(shū)上均指明m 通信控件不能發(fā)送或接收雙字節(jié)字符集系統(tǒng) DBCS)的二進(jìn)制數(shù)據(jù),這對(duì)于我國(guó)及亞洲一些使用 DBCS 字符集的國(guó)家不能不說(shuō)是一大人遺憾。但是我在實(shí)踐中發(fā)現(xiàn),用控
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)陳皮市場(chǎng)運(yùn)營(yíng)格局及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)鋁合金金屬型鑄件行業(yè)十三五規(guī)劃及發(fā)展策略研究報(bào)告
- 2025-2030年中國(guó)重卡汽車市場(chǎng)發(fā)展?fàn)顩r及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)酒精制造行業(yè)運(yùn)營(yíng)現(xiàn)狀及發(fā)展規(guī)劃分析報(bào)告
- 2025-2030年中國(guó)進(jìn)口葡萄酒行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025安徽省建筑安全員《C證》考試題庫(kù)及答案
- 2025-2030年中國(guó)觀光船游覽市場(chǎng)發(fā)展?fàn)顩r與投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)營(yíng)銷服務(wù)行業(yè)市場(chǎng)競(jìng)爭(zhēng)狀況及發(fā)展前景分析報(bào)告
- 2025-2030年中國(guó)米爾貝肟市場(chǎng)運(yùn)營(yíng)現(xiàn)狀及發(fā)展規(guī)劃分析報(bào)告
- 2025-2030年中國(guó)電解鋅行業(yè)十三五規(guī)劃與發(fā)展建議分析報(bào)告
- 統(tǒng)編版(2024新版)七年級(jí)下冊(cè)歷史教材習(xí)題答案
- 第10課《自定主題活動(dòng)一:用養(yǎng)樂(lè)多瓶子做花瓶》(教學(xué)實(shí)錄)-2023-2024學(xué)年三年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)浙教版
- 熱點(diǎn)主題作文寫(xiě)作指導(dǎo):提出問(wèn)題與解決問(wèn)題(審題指導(dǎo)與例文)
- 糖尿病肌少癥
- 江蘇書(shū)記員考試歷年題庫(kù)
- 2024年浙江省中考數(shù)學(xué)試卷含答案
- 激光切割價(jià)格報(bào)價(jià)表
- 友情 創(chuàng)可貼 課件 綜合實(shí)踐活動(dòng)四年級(jí)下冊(cè)
- 紅樓夢(mèng)閱讀單選題100道及答案解析
- 2024年知識(shí)競(jìng)賽-中小學(xué)財(cái)務(wù)管理知識(shí)考試近5年真題集錦(頻考類試題)帶答案
- 產(chǎn)后康復(fù)課件完整版
評(píng)論
0/150
提交評(píng)論