




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC控件MSCom編寫(xiě)串口通信程序(轉(zhuǎn))博客分類:? C+VC+編程數(shù)據(jù)結(jié)核j MFCMicrosoft在眾多網(wǎng)友的支持下,串口調(diào)試助手從2001年5月21日發(fā)布至今,短短一個(gè)月,在 全國(guó)各地累計(jì)下載量近5000人次,在近200多個(gè)電子中,20多人提供了使用測(cè)試意 見(jiàn),更有50多位朋友提出要串口調(diào)試助手的源代碼,為了答謝謝朋友們的支持,公 開(kāi)推出我最初用VC控件MSComm寫(xiě)串口通信程序的源代碼,并寫(xiě)出 詳細(xì)的編程過(guò) 程,姑且叫串口調(diào)試助手源程序V1.0或VC串口通訊源程序吧,我相信,如果你用 VC編程,那么有了這個(gè)代碼,就可以輕而易舉地完成串口編程任務(wù)了。(也許本文 過(guò)于詳細(xì),高手就不用看)
2、開(kāi)始吧:1 .建立項(xiàng)目:打開(kāi)VO+ 6.0,建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序SCommTest (與我源代碼一致,等會(huì)你會(huì)方便一點(diǎn));2 .在項(xiàng)目中插入MSCom控件 選擇Project菜單下Add To Project子菜單 中的Components and Controls,選項(xiàng),在彈出的對(duì)話框中雙擊Registered ActiveX Co ntrols項(xiàng)(稍等一會(huì),這個(gè)過(guò)程較慢),則所有注冊(cè)過(guò)的ActiveX控件出現(xiàn)在列表框中。選擇 Microsoft Communications Control, version 6.0 一 單擊 Insert按鈕將它插入到我們的Project中來(lái)
3、,接受缺省的選項(xiàng)。(如果你在控件列表中 看不至fj Microsoft Communications Control, version 6.0、力R可能是你在安裝VC6時(shí)沒(méi)有把ActiveX 一項(xiàng)選上,重新安裝VC6選上ActiveX就可以 T),這時(shí)在ClassView視窗中就可以看到CMSContm 了,(注意:此類在 ClassWizard中看不到,重構(gòu)clw文件也一樣),并且在控件工具欄Controls中出現(xiàn) 了圖標(biāo)(如圖1所示),現(xiàn)在要做的是用鼠標(biāo)將此圖標(biāo)拖到對(duì)話框中,程序運(yùn)行后,這個(gè) 圖標(biāo)是看不到的。3 .利用 ClassWizard 7E義 CMSCom類控制對(duì)象打開(kāi)ClassW
4、izard >MemberViariables選項(xiàng)卡,選擇CSCommTestDI類,為IDC_MSCOM添力口控制變量: m_ctHComm,這時(shí)你可以看一看,在對(duì)話框頭文件中自動(dòng)加入了/ AFXJNCLUDESO #i nclude 'mscomm.h' /AFX_INCLUDES (這時(shí)運(yùn)行程序, 如果有錯(cuò),那就再?gòu)念^開(kāi)始)。4 .在對(duì)話框中添加控件 向主對(duì)話框中添加兩個(gè)編輯框,一個(gè)用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RXDATA另一個(gè)用于輸入發(fā)送數(shù)據(jù),ID為IDC_EDIT_TXDATA 再添加一個(gè)按鈕,而能是按一次就把發(fā)送編輯框中的容發(fā)送一次,將其ID設(shè)為I
5、DC_BUTTON_MANUALSE 另IJ忘記了將接收編輯框的 Properties - >Styles 中把 Miltiline 和Vertical Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也 可選上Miltiline再打開(kāi) ClassWizard >MembeViariables 選項(xiàng)卡,選擇 CSCommTestDI 類,為 IDC_EDIT_RXDAT 添力 口 CString 變量 m_strRXData,為 IDC_EDIT_TXDAT ;忝力 P CString 變量 m_strTXData。說(shuō)明:m_strRXData 和 m_strTXData 分另
6、U用來(lái)放入 接收和發(fā)送的字符數(shù)據(jù)。一一休息一會(huì)吧?我們天天與電腦打交道,要注意保重,我現(xiàn)在在單杠上做引體向上可以來(lái)40次,可我都32 了,佩服嗎?。好了,再接著 來(lái),下面是關(guān)鍵了 :5 .添加串口事件消息處理函數(shù)On Com m()打開(kāi)ClassWizard >MessageM aps選 擇類CSCommTestDIg選擇IDC_MSCOM M雙擊消息On Comm將彈出的對(duì)話框中 將函數(shù)名改為On Comm (好記而已)OK這個(gè)函數(shù)是用來(lái)處理串口消息事件的,如每當(dāng)串口接收到數(shù)據(jù),就會(huì)產(chǎn)生一個(gè)串 口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛才添加的函數(shù)就會(huì)執(zhí)行,我們?cè)?On Comm函數(shù)加
7、入相應(yīng)的處理代碼就能實(shí)現(xiàn)自已想要的功能了。請(qǐng)你在函數(shù)中加 人如下代碼:void CSCommTestDIg: :0n Comm() ( / TODO: Add your con trol no tificati on han dler code here VARIANT varia ntjnp;COIeSafeArray safearrayj np;LONG Ie n5k;BYTE rxdata2048; / 設(shè)置 BYTE 數(shù)組 An 8-bit integerthat is not sig ned.CStri ng strtemp;if(m_ctrlComm.GetCommEvent()=
8、2) 事件值為2表示接收緩沖區(qū)有字 符.以下你可以根據(jù)自己的通信協(xié)議加入處理代碼varia ntjn p=m_ctrlComm.Getl nput(); /讀緩沖區(qū) 型safearrayj np=varia ntjnp; /VARIANT ColeSafeArray 型變 變量轉(zhuǎn)換為 量len=safearray_i np.Get On eDimSize(); /得到有效數(shù)據(jù)長(zhǎng)度f(wàn)or(k=0;k<le n;k+)safearrayj np.GetEleme nt(&k,rxdata+k);/ 轉(zhuǎn)換為 BYTE型數(shù)組for(k=0;k<len;k+) /將數(shù)組轉(zhuǎn)換為Cstr
9、ing型變量(BYTE bt=*(char*)(rxdata+k); / 字符型strtemp.Format(n%cn,bt); /將字符送入臨時(shí)變量strtemp 存放m_strRXData+=strtemp; / 加入接收編輯框?qū)?yīng)字符 串一 UpdateData(FALSE);/ 更新編輯框容到目前為止還不能在接收編輯框中看到數(shù)據(jù),因?yàn)槲覀冞€沒(méi)有打開(kāi)串口,但運(yùn)行 程序 不應(yīng)該有任何錯(cuò)誤,不然,你肯定哪兒沒(méi)看仔細(xì),因?yàn)槲沂谴蜷_(kāi)VC6對(duì)照著做一步寫(xiě) 一行的,運(yùn)行試試。沒(méi)錯(cuò)吧?那么做下一步:6.打開(kāi)串口和設(shè)置串口參數(shù)你可以在你需要的時(shí)候打開(kāi)串口,例如在程序中做一個(gè)開(kāi)始按鈕,在該按鈕的處理函數(shù)中
10、打開(kāi)串口?,F(xiàn)在我們?cè)谥鲗?duì)話框的CSCommTestDlg:O nl ni tDialog()打開(kāi)串口,加入如下代碼:/TODO: Add extra initialization here if(m_ctrlComm.GetPortOpe n()m ctrlComm.SetPortOpe n(FALSE);m_ctrlComm.SetCommPort;選擇 com1 if( !m_ctrlComm.GetPortOpe n() m_ctrlComm.SetPortOpen(TRUE);/ 打開(kāi)串口 elseAfxMessageBox("ca nnot ope n serial por
11、t");m_ctrlComm.SetSettings(,9600,n58,1,'); / 波特率 9600,無(wú)校驗(yàn),8 個(gè)數(shù)據(jù)位,1個(gè)停止位m_ctrlComm.Setl nputModel(l); /1:表示以二進(jìn)制方式檢取數(shù)據(jù)m_ctrlComm.SetRThreshold(1);鄉(xiāng)數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的On Com事件m_ctrlComm.Set In putLe n(0);/設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0m_ctrlComm.Getl nput();/先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)現(xiàn)在你可以試試程序了,將串口線接好后(不會(huì)接?去
12、看看我寫(xiě)的串口接線基本 方 法),打開(kāi)串口調(diào)試助手,并將串口設(shè)在com2選上自動(dòng)發(fā)送,也可以等會(huì)手動(dòng)發(fā)送。 再執(zhí)行你編寫(xiě)的程序,接收框里應(yīng)該有數(shù)據(jù)顯示了。7 .發(fā)送數(shù)據(jù)先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKE處理函數(shù),打開(kāi)ClassWizard >Message Maps 選擇類 CSCommTestD,選擇IDC_BUTTON_MANUALS 擊 BN_CLICKE 添力口 0nBlmonManualsend()函數(shù),并在函數(shù)中添加如下代碼:void CSCommTestDlg:O nButto nMan ualse nd()(/ TODO: Add your con trol
13、 no tificati on han dler code here UpdateData(TRUE); / 讀 取編輯框容 m_ctrlComm.SetOutput(COIeVaria nt(m_strTXData); / 發(fā)送數(shù)據(jù)廠一運(yùn)行程序,在發(fā)送編輯框中隨意輸入點(diǎn)什么,單擊發(fā)送按鈕,啊!看看,在另端的串 口調(diào)試助手(或別的調(diào)試工具)接收框里出現(xiàn)了什么。如果你真是初次涉獵串口編程,又一次成功,那該說(shuō)聲謝謝我了,因?yàn)槲业谝淮巫龃?口程序時(shí)可費(fèi)勁了,那時(shí)網(wǎng)上的資料也不好找。開(kāi)開(kāi)玩笑,謝謝你的支持,有什么好 東西別忘了給我寄一份。最后說(shuō)明一下,由于用到VC控件,在沒(méi)有安裝VC的計(jì)算機(jī)上運(yùn)行時(shí)要
14、從VC中把 mscomm32.ocxmsvcrt.dll、mfc42.dll 拷到 Windows 目錄下的 System 子目錄中 (win2000為System32)并再進(jìn)行注冊(cè)設(shè)置,請(qǐng)參考 如何手工注冊(cè)MSCom控件。龔建偉20016208 .發(fā)送十六進(jìn)制字符在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_HEXSENption:十 六進(jìn) 制發(fā)送,再利用ClassWizard為其添加控制變量:m_ctrlHexSend ;在ClassView中為SCommTestDI 口關(guān)添加以下兩個(gè)PUBLIC成員函數(shù),并輸入相應(yīng)代碼;由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每?jī)?/p>
15、個(gè)字符之間插入 一個(gè)空隔如:A1 23 45 0B 00 29/CByteArray是一個(gè)動(dòng)態(tài)字節(jié)數(shù)組,可參看MSD幫助int CSCommTestDlg:Stri ng2Hex(CStri ng str, GByte Array &se nddata)(int hexdata,lowhexdata;int hexdatale n=0;int len=str.GetLe ngth();sen ddata.SetSize(le n/2);for(i nt i=0;i<le n;)(char lstr,hstr=stri;if(hstr=n)(i+;con ti nue;i+;if(
16、i>=le n)break;lstr=stri;hexdata=C onv ertHexChar(hstr);lowhexdata=C onv ertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;elsehexdata=hexdata*16+lowhexdata;i+;sen ddatahexdatale n=(char)hexdata;hexdatale n+;sen ddata.SetSize(hexdatale n);retur n hexdatale n;這是一個(gè)將字符轉(zhuǎn)換為相應(yīng)的十六進(jìn)制值的函數(shù)好多C語(yǔ)言書(shū)上都可以找到功能:
17、若是在0-F之間的字符,則轉(zhuǎn)換為相應(yīng)的十六進(jìn)制字符,否則返回 -1char CSCommTestDlg:Co nvertHexChar(char ch)(if(ch>=0,)&&(ch<='9,)return ch-0x30;else if(ch>=,A,)&&(ch<='F')return ch-'A'+10;else if(ch>=,a,)&&( ch<=*f)return ch-'a'+10;else return (-1);再將 CSCommTes
18、tDlg:OnButtonManualsend(并多改成以下形式:void CSCommTestDlg:O nButto nMan ualse nd()(/ TODO: Add your con trol no tificati on han dler code hereUpdateData(TRUE);/ 讀取編輯加匡容if(m_ctrlHexSe nd.GetCheck()CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); /此處返回的 len 可以用于計(jì)算發(fā)送了多少個(gè)十六進(jìn)而數(shù)m_ctrlComm.SetOutput(C
19、OIeVaria nt(hexdata); /發(fā)送十六進(jìn)制數(shù)據(jù) elsem_ctrlComm.SetOutput(COIeVariant(m_strTXData); / 發(fā)送 ASCII 字符數(shù)據(jù)現(xiàn)在,你先將串口線接好并打開(kāi)串口調(diào)試助手 V2.1,選上以十六制顯示,設(shè)置 好相應(yīng)串口,然后運(yùn)行我們這個(gè)程序,在發(fā)送框中輸入 00 01 02 03 A1 CC等十 六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在串口調(diào)試助手的接收框中應(yīng) 該可以看至J 00 01 02 03 A1 CC 了。9 .在接收框中以十六進(jìn)制顯示這就容易多了:在主對(duì)話框中加入一個(gè)復(fù)選接鈕,IDC_CHECK_HEXDISP
20、LAOption:十六進(jìn)制顯示,再利用ClassWizard為其添加 控 制變量:m_ctrlHexDiaplay。然后修改 CSCommTestDlg:OnCommf 數(shù):void CSCommTestDIg: :On Comm() (/ TODO: Add your con trol no tificati on han dler code hereVARIANT varia ntjn p;COIeSafeArray safearrayj np;LONG Ie n,k;BYTE rxdata2048; 設(shè)置 BYTE 數(shù)組 An 8-bit integerthat is not signe
21、d.CStn ng strtemp; if(m_ctrlComm.GetCommEve nt()=2) / varia ntjn p=m_ctrlComm.Getl nput(); / safearrayj np=varia ntjnp; /VARIANT len=safearrayj np.Get On eDimSize(); / for(k=0;k<le n;k+) safearrayj np.GetEleme nt(&k,rxdata+k);/事件值為2表示接收緩沖區(qū)有字符讀緩沖區(qū)型變量轉(zhuǎn)換為ColeSafeArray型變量得到轉(zhuǎn)救數(shù)幅笈度型數(shù)組for(k=0;k<l
22、en;k+) /將數(shù)組轉(zhuǎn)換為Cstring型變量BYTE bt=*(char*)(rxdata+k); / 字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format("%02X ",bt);/將字符以十六進(jìn)制方式送入臨時(shí)變量strtemp存放,注意這里加入一個(gè)空隔elsestrtemp.FormatCc'bt); /將字符送入臨時(shí)變量strtemp存放m_strRXData+=strtemp; /加入接收編輯框?qū)?yīng)字符串 )-UpdateData(FALSE); / 更新編輯框容測(cè)試:在串口調(diào)試助手發(fā)送框中輸入00 01 02
23、03 A1 CC等十六進(jìn)制字符,并選 上以 十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在本程序運(yùn)行后選上以十六進(jìn)制顯示,在串口調(diào)試助 手中單擊手動(dòng)發(fā)送或自動(dòng)發(fā)送,則在本程序的接收框中應(yīng)該可以看到00 01 02 03 A1 CC 了。10 .如何設(shè)置自動(dòng)發(fā)送最簡(jiǎn)單的設(shè)定自動(dòng)發(fā)送周期是用SetTimer。函數(shù),這在數(shù)據(jù)采集中很 有 用,在控制中指令的傳送也可能用到定時(shí)發(fā)送。方法是:在ClassWizard中選上MessageMa卡,然后在Objects IDs選中 CSCommTestDIg,再在Messages框中選上 WM_TIME消息,單擊 ADD_FUNCTIO 力口入 void CSCommTest
24、Dlg:OnTimer(UINTnlDEvent)函數(shù),這個(gè)函 數(shù)是放入“時(shí)間到”后要處理的代碼:void CSCommTestDIg: :On Timer(UINT nIDEve nt)/ TODO: Add your message han dler code here an d/or call default On ButtonManualsend(); CDialog:O nTimer( nIDEve nt);再在在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_AUTOSEND Captio自 動(dòng) 發(fā)送(周期1秒),再利用ClassWizard為其添加BN_CLICK消息處理函
25、數(shù)void CSCommTestDIg:。nCheckAutose nd():void CSCommTestDIg: :On CheckAutose nd() (/ TODO: Add your con trol no tificati on han dler code here m_bAutoSe nd=!m_bAutoSe nd;if(m_bAutoSe nd) SetTimer(1,1000,NULL);/ 時(shí)間為 1000 毫秒 elseKillTimer(l); 取消定時(shí))其中:m_bAutoSend 為 BOO 型變量,在 CLASSVIEV 中為 CSCommTestDIg 力口
26、 入,并在廟造函數(shù)中初始化:m_bAutoSe n=FALSE;現(xiàn)在可以運(yùn)行程序測(cè)試了。11 .什么是VARIANT數(shù)據(jù)類型?如何使用VARIANT數(shù)據(jù)類型?不知如何使用VARIANT數(shù)據(jù)類型,有不少朋友對(duì)VARIANT這個(gè)新的數(shù)據(jù) 類型大感頭疼。SetOutput()函數(shù)中需要的VARIANT參數(shù)還可以使用COIeVariant類 的構(gòu)造函數(shù)簡(jiǎn)單生成,現(xiàn)在Get In put()函數(shù)的返回值也成了 VARIANTS型,那么如 何從返回的值中提取有用的容。VARIANT及由之而派生出的COIeVariant類主要用于在OLE自動(dòng)化中傳遞數(shù)據(jù)。實(shí)際上VARIANT也只不過(guò)是 一個(gè)新定義的結(jié)構(gòu)罷了
27、,它的主要成員包括一個(gè)聯(lián)合體及一個(gè)變量。該聯(lián)合體由各種 類型的數(shù)據(jù)成員構(gòu)成,而該變量則用來(lái)指明聯(lián)合體中目前起作用的數(shù)據(jù)類型。我們所 關(guān)心的接收到的數(shù)據(jù)就存儲(chǔ)在該聯(lián)合體的某個(gè)數(shù)據(jù)成員中。該聯(lián)合體中包含的數(shù)據(jù)類型很多,從一些簡(jiǎn)單的變量到非常復(fù)雜的數(shù)組和指針。由于通過(guò)串口接收到的容常常是一個(gè)字節(jié)串,我們將使用其中的某個(gè)數(shù)組或指針來(lái)訪問(wèn)接收 至帕勺數(shù)據(jù)。這里推薦給大家的是指向一個(gè)SAFEARRAYCOIeSafeArray )類型變量。新的數(shù)據(jù)類型SAFEARRA正如其名字一樣,是一個(gè)“安全數(shù)組”,它能 根 據(jù)系統(tǒng)環(huán)境自動(dòng)調(diào)整其16位或32位的定義,并且不會(huì)被OLE改變(某些類 型如BSTF在16位或
28、32位應(yīng)用程序間傳遞時(shí)會(huì)被OLE翻譯從而破壞其中的二進(jìn) 制 數(shù)據(jù))。大家無(wú)須了解SAFEARRA的具體定義,只要知道它是另外一個(gè)結(jié)構(gòu),其中包 含一個(gè)(void *)類型的指針pvData,其指向的存就是存放有用數(shù)據(jù)的地方。簡(jiǎn)而言 之,從Getlnput()函數(shù)返回的VARIANT類型變量中,找出parray指針,再?gòu)脑撝羔?指向的SAFEARRA變量中找出pvData指針,就可以向訪問(wèn)數(shù)組一樣取得所接收到的 數(shù)據(jù)了。具體應(yīng)用請(qǐng)參見(jiàn)void CSCommTestDIg:。nComm()函數(shù)。大概我現(xiàn)在也說(shuō)不清這個(gè)問(wèn)題,我自己從第一次接觸這個(gè)東西,到現(xiàn)在還是給別人講不清。MSCom控件使用詳解龔建
29、偉:這篇東西來(lái)不及好好整理,因有朋友經(jīng)常提及,先放在這里,如果有 必要,再詳細(xì)理順一下,更為詳細(xì)的信息請(qǐng)去看 MSDN摘要:本文詳細(xì)介紹了 MSCom控件在串口編程中使用。MSCom控件兩種處理通訊的方式CommPor 屬性RThreshold 屬性CTSHoldi ng 屬性SThresholdCDHoldi ng 屬性 DSRHoldi ng 屬性 Sett in gs 屬性 InputLen 屬性 EOFE nable 屬性Ha rdshake 常類勺On Comr常數(shù) InputMode 常數(shù) 錯(cuò)誤消息MSComn控件通過(guò)串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功 能。MSCom
30、控件在串口編程時(shí)非常方便,程序員不必去花時(shí)間去了解較為復(fù)雜的 API函數(shù),而且在VC VB Delphi等語(yǔ)言中均可使用。MicrosoftCommunications Control (以下簡(jiǎn)稱 MSCon)m 是 Microsoft 公司提供的簡(jiǎn)化 Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù) 據(jù)的簡(jiǎn)便方法。具體的來(lái)說(shuō),它提供了兩種處理通信問(wèn)題的方法:一是事件驅(qū)動(dòng)(Event driven)方法,一是查詢法。1. MSCom控件兩種處理通訊的方式MSCom控件提供下列兩種處理通訊的方式:事件驅(qū)動(dòng)方式和查詢方式。1.1 事件驅(qū)動(dòng)方式事件驅(qū)動(dòng)通訊是處理
31、串行端口交互作用的一種非常有效的方法。在許多情況下,在事 件發(fā)生時(shí)需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者CarrierDetect (CD)或Request To Send (RTS)線上一個(gè)字符到達(dá)或一個(gè)變化發(fā)生時(shí)。在這些情況下,可以利用MSComn控件的On Comm事件捕獲并處理這些通訊事件。OnComn事件還可以檢查和處理通訊錯(cuò)誤。所有通訊事件和通訊錯(cuò)誤的列表,參 閱CommEve nt屬性。在編程過(guò)程中,就可以在On Com事件處理函數(shù)中加入自己 的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè)MSCom控件對(duì)應(yīng)著 一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,
32、必須使用多個(gè)MSCom控件。1.2 查詢方式查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的 每個(gè)關(guān)鍵功能之后,可以通過(guò)檢查CommEvent屬性的值來(lái)查詢事件和錯(cuò)誤。如果應(yīng) 用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫(xiě)一個(gè)簡(jiǎn)單的 撥號(hào)程序,則沒(méi)有必要對(duì)每接收一個(gè)字符都產(chǎn)生事件,因?yàn)槲ㄒ坏却邮盏淖址钦{(diào) 制解調(diào)器的“確定”響應(yīng)。2. MSComn控件的常用屬性MSCom控件有很多重要的屬性,但首先必須熟悉幾個(gè)屬性。CommPort設(shè)置并返回通訊端口號(hào)。Sett in gs以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。PortOpe n
33、設(shè)置并返回通訊端口的狀態(tài)。也可以打開(kāi)和關(guān)閉端口。In put從接收緩沖區(qū)返回和刪除字符。Output向傳輸緩沖區(qū)寫(xiě)一個(gè)字符串。下面分別描述:CommPor屬性 設(shè)置并返回通訊端口號(hào)。語(yǔ)法 object.CommPortvalue (value 一整型值 5 說(shuō)明端口號(hào)。)說(shuō)明在設(shè)計(jì)時(shí),value可以設(shè)置成從1到16的任何數(shù)(缺省值為1 )。但是如果用 PortOpen屬性打開(kāi)一個(gè)并不存在的端口時(shí),MSCom控件會(huì)產(chǎn)生錯(cuò)誤68 (設(shè)備無(wú) 效)。注意:必須在打開(kāi)端口之前設(shè)置CommPort屬性。RThreshold 屬性:在 MSComn 控件設(shè)置 CommEvent 屬性為 comEvRecei
34、ve 并 產(chǎn) 生On Comm之前,設(shè)置并返回的要接收的字符數(shù)。語(yǔ)法object.Rthreshold = value (value整型表達(dá)式,說(shuō)明在產(chǎn)生On Comm事件 之前要接收的字符數(shù)。)說(shuō)明當(dāng)接收字符后,若Rthreshold屬性設(shè)置為0 (缺省值)則不產(chǎn)生On Comm事件。 例如,設(shè)置Rthreshold為1,接收緩沖區(qū)收到每一個(gè)字符都會(huì)使MSComm控件產(chǎn)生 On Comm 事件。CTSHold ing屬性:確定是否可通過(guò)查詢Clear To Se nd (CTS)線的狀態(tài)發(fā)送 數(shù)據(jù)。 Clear To Send是調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的信號(hào),指示傳輸可以進(jìn)行。該屬性 在設(shè)
35、計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。語(yǔ)法:object.CTSHolding ( Boolean)Mscomn控件的CTSHolding屬性設(shè)置值:True Clear To Send 線為高電平。False Clear To Se nd線為彳氐電平。說(shuō)明:如果Clear To Send線為低電平(CTSHolding = False)并且超時(shí)時(shí),MSCom 控件設(shè)置 CommEvent 屬性為 comEventCTSTQCIear To Send Timeout)并產(chǎn)生 On Comm事件。Clear To Send 線用于 RTS/CTS (Request To Send/Clear To Send
36、)硬件握手。如果 需要確定Clear To Send線的狀態(tài),CTSHolding屬性給出一種手工查詢 的方法。詳細(xì)信息有關(guān)握手協(xié)議,請(qǐng)參閱Handshaking屬性。SThreshold屬性:MSComn控件設(shè)置CommEvent屬性為comEvSend并產(chǎn)生On Comr事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。語(yǔ)法 object.SThreshold = value value整形表達(dá)式,代表在On Comm事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符 數(shù)。說(shuō)明:若設(shè)置Sthreshold屬性為0 (缺省值),數(shù)據(jù)傳輸事件不會(huì)產(chǎn)生On Comm事件。若設(shè)置Sthreshold屬性為1,當(dāng)
37、傳輸緩沖區(qū)完全空時(shí),MSCom控件產(chǎn)生OnComm事件。如果在傳輸緩沖區(qū)中的字符數(shù)小于value,CommEve nt屬性設(shè)置為comEvSe nc|并產(chǎn)生On Comm事件。comEvSe nd事件僅當(dāng)字符數(shù)與 Sthreshold交叉時(shí)被激活一次。例如,如果Sthreshold等于5,僅當(dāng)在輸出 隊(duì)列中字 符數(shù)從5降至(J 4時(shí),comEvSend才發(fā)生。如果在輸出隊(duì)列中從沒(méi)有 比Sthreshold多 的字符,comEvSend事件將絕不會(huì)發(fā)生。Han dshake 常數(shù)常數(shù)值描述com None 0無(wú)握手。comXonXoff 1 XOn /Xoff 握手。comRTS 2 Reque
38、st-to-se nd/clear-to-se nd 握手。comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。On Comr常數(shù)常數(shù)值描述comEvSe nd 1 發(fā)送事件。comEvReceive 2 接收事件。comEvCTS 3 clear-to-se nd 線變化。comEvDSR 4 data-set ready 線變化。comEvCD 5 carrier detect 線變化。 comEvR ing 6振鈴檢測(cè)。comEvEOF 7文件結(jié)束。Error常數(shù)常數(shù)值描述comEve ntBreak 1001接收到中斷信號(hào)comEv
39、e ntCTSTO 1002 Clear-to-se nd 超時(shí)comEventDSRTO 1003 Data-set ready 超時(shí)comEve ntFrame 1004 幀錯(cuò)誤comEventOverrun 1006 端口超速comEve ntCDTO 1007 Carrier detect 超時(shí)comEve ntRxOver 1008接收緩沖區(qū)溢出comEve ntRxParity 1009 Parity 錯(cuò)誤comEve ntTxFull 1010傳輸緩沖區(qū)滿comEventDCB 1011檢索端口設(shè)備控制塊(DCB)時(shí)的意外錯(cuò)誤InputMode 常數(shù) 常數(shù)值描述coml nput
40、ModeText 0 (缺省)通過(guò)In put屬性以文本方式取回?cái)?shù)據(jù)。coml nputModeBi nary 1通過(guò)In put屬性以二進(jìn)制方式檢取回?cái)?shù)據(jù)。CDHolding屬性:通過(guò)查詢Carrier Detect (CD)線的狀態(tài)確定當(dāng)前是否有傳 輸。Carrier Detect是從調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的一個(gè)信號(hào),指示調(diào)制解調(diào)器正在聯(lián) 機(jī)。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。語(yǔ)法object.CDHold ing設(shè)置值:CDHolding屬性的設(shè)置值為:設(shè)置描述True Carrier Detect 線為高電平False Carrier Detect線為低電平 說(shuō)明:注意當(dāng)Carr
41、ier Detect線為高電平(CDHolding = True)且超時(shí)時(shí),MSCom控 件設(shè)置CommEven屬性為comEventCDTO( Carrier Detect超時(shí)錯(cuò) 誤),并產(chǎn)生On Comm事件。注意在主機(jī)應(yīng)用程序中捕獲一個(gè)丟失的傳輸是特別重要的,例如一個(gè)公告板,因?yàn)楹?叫者可以隨時(shí)掛起(放棄傳輸)。Carrier Detect 也被稱為 Receive Line Signal Detect (RLSD)。數(shù)據(jù)類型 BooleanDSRHolding 屬性:確定 Data Set Ready (DSR)線的狀態(tài)。Data Set Ready 信 號(hào)由 調(diào)制解調(diào)器發(fā)送到相連計(jì)算機(jī),指示作好操作準(zhǔn)備。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí) 為只讀。語(yǔ)法:object.DSRHoldingobject所在處表示對(duì)象表達(dá)式,其值是“應(yīng)用于”列表中的對(duì)象。DSRHoldi ng屬性返回以下值:值描述True Data Set Ready 線高False Data Set Ready 線低說(shuō)明:當(dāng)Data Set Ready線為高電平(DSRHolding = True)且超時(shí)時(shí),MSComm控 件設(shè)置CommEve nt屬性為com Eve ntDSRT(數(shù)據(jù)準(zhǔn)備超時(shí))并產(chǎn)生On Comm事 件。當(dāng)為 Data Terminal Equipment (DTE)機(jī)器寫(xiě) Data
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理團(tuán)隊(duì)管理
- 醫(yī)院護(hù)理培訓(xùn)
- 物業(yè)管理集約化
- 2025年門面租賃協(xié)議
- 高教版中職英語(yǔ)基礎(chǔ)模塊第四單元復(fù)習(xí)測(cè)試卷含答案詳解
- 古詩(shī)詞鑒賞之賞析名句-2024小升初語(yǔ)文專項(xiàng)復(fù)習(xí)講義
- 心臟康復(fù)護(hù)理查房
- 設(shè)施西瓜標(biāo)準(zhǔn)綜合體
- 高考數(shù)學(xué)復(fù)習(xí):重難點(diǎn)題型之?dāng)?shù)列求和15類(原卷版)
- 動(dòng)物類描寫(xiě)-2025年高考英語(yǔ)讀后續(xù)寫(xiě)提分技巧與訓(xùn)練(含答案)
- 拉芳家化財(cái)務(wù)報(bào)表分析報(bào)告
- 建筑項(xiàng)目部考勤管理制度
- 中班健康課件《我不挑食》
- 2024年危險(xiǎn)品二手車收購(gòu)協(xié)議書(shū)范文
- 中國(guó)鹽業(yè)集團(tuán)有限公司招聘筆試題庫(kù)2024
- 2022年江蘇省江陰市四校高一物理第二學(xué)期期末經(jīng)典試題含解析
- 重慶市渝北區(qū)2024年小升初英語(yǔ)試卷( 含筆試解析無(wú)聽(tīng)力原文無(wú)音頻)
- 部編版八年級(jí)下冊(cè)語(yǔ)文期末復(fù)習(xí):字音字形 專項(xiàng)練習(xí)題含答案
- 東北三省精準(zhǔn)教學(xué)2024-2025學(xué)年高三上學(xué)期9月聯(lián)考化學(xué)試卷
- 運(yùn)動(dòng)是良醫(yī)智慧樹(shù)知到答案2024年成都師范學(xué)院
- 武進(jìn)經(jīng)濟(jì)發(fā)展集團(tuán)筆試
評(píng)論
0/150
提交評(píng)論