




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、串口調(diào)試助手源程序及編程詳細(xì)過(guò)程作者:龔建偉 2001620可以任意轉(zhuǎn)載,但必須注明作者和說(shuō)明來(lái)自,不得作為商用目次:1. 建立項(xiàng)目2. 在項(xiàng)目中插入 MSCom控件3. 利用ClassWizard定義CMSCom類控制變量4. 在對(duì)話框中添加控件5. 添加串口事件消息處理函數(shù) OnComm()6. 打開和設(shè)置串口參數(shù)7. 發(fā)送數(shù)據(jù)如果你還沒(méi)有下載源程序,又對(duì)本文有興趣,請(qǐng)立即下載在眾多網(wǎng)友的支持下,串口調(diào)試助手從2001年5月21日發(fā)布至今,短短一個(gè)月,在全國(guó)各地累計(jì)下載量近5000人次,在近200多個(gè)電子郵件中,20多人提供了使用測(cè)試意見(jiàn),更有50多位朋友提出要串口調(diào)試助手的源代碼,為了答
2、謝謝朋友們的支持,公開推出我最初用VC控件MSCom編寫串口通信程序的源代碼,并寫出詳細(xì)的編程過(guò)程,姑且叫串口調(diào)試助手源程序 V1.0或VC串口通訊源程序吧,我相信,如果你用VC編程,那么有了這個(gè)代碼,就可以輕而易舉地完成串口編程任務(wù)了。(也許本文過(guò)于詳細(xì),高手就不用看)開始吧:1. 建立項(xiàng)目:打開VC+ 6.0,建立一個(gè)基于對(duì)話框的 MFC應(yīng)用程序SCommTest(與我源代碼一致,等會(huì)你 會(huì)方便一點(diǎn));2. 在項(xiàng)目中插入 MSCom控件選擇Project 菜單下Add To Project 子菜單中的 Components andControls,選項(xiàng),在彈出的對(duì)話框中雙擊Register
3、ed ActiveX Controls 項(xiàng)(稍等一會(huì),這個(gè)過(guò)程較慢),則所有注冊(cè)過(guò)的 ActiveX 控件出現(xiàn)在列表框中。選擇Microsoft Communications Control, version 6.0,單擊Insert按鈕將它插入到我們的 Project中來(lái),接受缺省的選項(xiàng)。(如果你在控件列表中看不到MicrosoftCommunications Control, version 6.0,那可能是你在安裝 VC6時(shí)沒(méi)有把 ActiveX 一項(xiàng)選上,重新安裝VC6,選上ActiveX 就可以了),這時(shí)在ClassView視窗中就可以看到 CMSCom類了,(注意:此類在 Clas
4、sWizard中看不到,重構(gòu) clw文 件也一樣),并且在控件工具欄Controls中出現(xiàn)了電話圖標(biāo)(如圖1所示),現(xiàn)在要做的是用鼠標(biāo)將此圖標(biāo)拖到對(duì)話框中,程序運(yùn)行后,這個(gè)圖標(biāo)是看不到的。CoatrolsO屈ablQ仮(iHEg03aHDHU6=aH垂園1 11 卜E簾中3. 利用 ClassWizard 定義 CMSCom類控制對(duì)象打開 ClassWizard >Member Viariables 選項(xiàng)卡,選擇CSCommTestDIg類,為IDC_MSCOMM添加控制變量:m_ctrlComm,這時(shí)你可以看一看,在對(duì)話框頭文件中 自動(dòng)加入了 AFX_INCLUDES() #inclu
5、de "mscomm.h" AFX_INCLUDES(這時(shí)運(yùn)行程序,如果有錯(cuò),那就再?gòu)念^開始)。4. 在對(duì)話框中添加控件向主對(duì)話框中添加兩個(gè)編輯框,一個(gè)用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RXDATA另一個(gè)用于輸入發(fā)送數(shù)據(jù),ID為IDC_EDIT_TXDATA再添加一個(gè)按鈕,功能是按一次就把發(fā)送編輯框中的 內(nèi)容發(fā)送一次,將其ID設(shè)為IDC_BUTTON_MANUALSEND忘記了將接收編輯框的Properties >Styles中把Miltiline 和Vertical Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline 。再打開 Cl
6、assWizard >Member Viariables 選項(xiàng)卡,選擇 CSCommTestDIg類, 為 IDC_EDIT_RXDAT添力口 CString 變量 m_strRXData, 為 IDC_EDIT_TXDATA添力口 CString 變量 m_strTXData。說(shuō)明: m_strRXData 和m_strTXData分別用來(lái)放入接收和發(fā)送的字符數(shù)據(jù)。5.添加串口事件消息處理函數(shù)OnComm()打開ClassWizard >Message Maps,選擇類CSCommTestDlg選擇IDC_MSCOMM雙擊消息 OnComm將彈出的對(duì)話框中將函數(shù)名改為OnComm
7、 (好記而已)0K。這個(gè)函數(shù)是用來(lái)處理串口消息事件的, 如每當(dāng)串口接收到數(shù)據(jù), 就會(huì)產(chǎn)生一個(gè)串口接收數(shù)據(jù)緩沖區(qū)中有字 符的消息事件,我們剛才添加的函數(shù)就會(huì)執(zhí)行,我們?cè)贠nComm(函數(shù)加入相應(yīng)的處理代碼就能實(shí)現(xiàn)自已想要的功能了。請(qǐng)你在函數(shù)中加入如下代碼:void CSCommTestDlg:OnComm()/ TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata2048; / 設(shè)置 BYTE數(shù)組 An
8、8-bit integerthat is not signed.事件值為 2 表示接收緩沖區(qū)內(nèi)有字符讀緩沖區(qū)型變量轉(zhuǎn)換為 ColeSafeArray 型變量 得到有效數(shù)據(jù)長(zhǎng)度轉(zhuǎn)換為BYTE型數(shù)組Cstring 型變量字符型將字符送入臨時(shí)變量 strtemp 存放加入接收編輯框?qū)?yīng)字符串CString strtemp;if(m_ctrlComm.GetCommEvent()=2) /以下你可以根據(jù)自己的通信協(xié)議加入處理代碼 /variant_inp=m_ctrlComm.GetInput(); / safearray_inp=variant_inp; /VARIANT len=safearray
9、_inp.GetOneDimSize(); / for(k=0;k<len;k+) safearray_inp.GetElement(&k,rxdata+k);/ for(k=0;k<len;k+) /將數(shù)組轉(zhuǎn)換為BYTE bt=*(char*)(rxdata+k); / strtemp.Format("%c",bt); / m_strRXData+=strtemp; /UpdateData(FALSE); / 更新編輯框內(nèi)容到目前為止還不能在接收編輯框中看到數(shù)據(jù),因?yàn)槲覀冞€沒(méi)有打開串口,但運(yùn)行程序不應(yīng)該有任何錯(cuò)誤,不然,你肯定哪兒沒(méi)看仔細(xì),因?yàn)槲沂谴蜷_
10、VC6對(duì)照著做一步寫一行的,運(yùn)行試試。沒(méi)錯(cuò)吧?那么做下一步: 6. 打開串口和設(shè)置串口參數(shù) 你可以在你需要的時(shí)候打開串口,例如在程序中做一個(gè)開始按鈕,在該按鈕 的處理函數(shù)中打開串口。現(xiàn)在我們?cè)谥鲗?duì)話框的 CSCommTestDlg:OnInitDialog() 打開串口,加入如下代 碼: / TODO: Add extra initialization here if(m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1); / 選擇 com1 if( !m_ctrlComm.GetPor
11、tOpen() m_ctrlComm.SetPortOpen(TRUE);/ 打開串口 elseAfxMessageBox("cannot open serial port");m_ctrlComm.SetSettings("9600,n,8,1"); / 波特率 9600,無(wú)校驗(yàn), 8 個(gè)數(shù)據(jù)位, 1 個(gè)停止位m_ctrlComm.SetInputModel(1); /1 :表示以二進(jìn)制方式檢取數(shù)據(jù)m_ctrlComm.SetRThreshold(1);/參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè)接收數(shù)據(jù)的OnCom事件m_ctrl
12、Comm.SetInputLen(0); / 設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為 0m_ctrlComm.GetInput();/ 先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)現(xiàn)在你可以試試程序了,將串口線接好后(不會(huì)接?去看看我寫的 串口接線基本方法),打開串口調(diào)試助手,并將串口設(shè)在com2,選上自動(dòng)發(fā)送,也可以等會(huì)手動(dòng)發(fā)送。再執(zhí)行你編寫的程序,接收框里應(yīng)該有數(shù) 據(jù)顯示了。7.發(fā)送數(shù)據(jù) 先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKED處理函數(shù),打開 ClassWizard - >MessageMaps,選擇類 CSCommTestDIg選擇 IDC_BUTTON_MANUALSEN雙擊 BN_CLICKED添力
13、口 OnButtonManualsend() 函數(shù),并在函數(shù)中添加如下代碼:void CSCommTestDlg:OnButtonManualsend()/ TODO: Add your control notification handler code here UpdateData (TRUE); / 讀取編輯框內(nèi)容 m_ctrlComm.SetOutput(COIeVariant(m_strTXData);發(fā)送數(shù)據(jù)運(yùn)行程序,在發(fā)送編輯框中隨意輸入點(diǎn)什么,單擊發(fā)送按鈕,啊!看看,在另一端的串口調(diào)試助手(或別 的調(diào)試工具)接收框里岀現(xiàn)了什么。如果你真是初次涉獵串口編程,又一次成功,那該說(shuō)聲謝
14、謝我了,因?yàn)槲业谝淮巫龃诔绦驎r(shí)可費(fèi)勁了, 那時(shí)網(wǎng)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。最后說(shuō)明一下,由于用到VC扌空件,在沒(méi)有安裝VC的計(jì)算機(jī)上運(yùn)行時(shí)要從 VC中把mscomm32.ocxmsvcrt.dll 、 mfc42.dll 拷到 Windows 目錄下的 System 子目錄中(win2000 為 System32)龔建偉2001.6.20什么是VARIANT數(shù)據(jù)類型?如何使用 VARIANT數(shù)據(jù)類型? 怎么以十六進(jìn)制或二進(jìn)制發(fā)送和接收?如果還想再深入了解,請(qǐng)看:串口調(diào)試助手源程序及編程詳細(xì)過(guò)程(二)2001.8.26這是更新后適合本文的源程序(2
15、001.8.25制作),如果還沒(méi)有下載源程序,又對(duì)本文有興趣,請(qǐng)立即下載衛(wèi)(當(dāng)然,你看完本文也可以自己做岀來(lái),這個(gè)程序是接著上一個(gè)做的,如果你沒(méi)下載前面程序, 則沒(méi)必要再下載了,本程序全部包含)。8. 發(fā)送十六進(jìn)制字符在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_HEXSEND Caption:十六進(jìn)制發(fā)送,再利用ClassWizard 為其添加控制變量:m_ctrlHexSend ;在ClassView中為SCommTestDlg類添加以下兩個(gè)PUBLIC成員函數(shù),并輸入相應(yīng)代碼 / 由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每?jī)?個(gè)字符之間插入一個(gè)空隔/ 如: A1
16、23 45 0B 00 29/CByteArray 是一個(gè)動(dòng)態(tài)字節(jié)數(shù)組,可參看MSDt幫助int CSCommTestDlg:String2Hex(CString str, CByteArray&senddata)int hexdata,lowhexdata;int hexdatalen=0;int len=str.GetLength();senddata.SetSize(len/2);for(int i=0;i<len;)char lstr,hstr=stri;if(hstr=' ')i+;continue;i+;if(i>=len)break;lstr=
17、stri;hexdata=ConvertHexChar(hstr); lowhexdata=ConvertHexChar(lstr); if(hexdata=16)|(lowhexdata=16)break;elsehexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSize(hexdatalen);return hexdatalen;/ 這是一個(gè)將字符轉(zhuǎn)換為相應(yīng)的十六進(jìn)制值的函數(shù)/ 好多 C 語(yǔ)言書上都可以找到/ 功能:若是在 0-F 之間的字符,則轉(zhuǎn)換為相應(yīng)的十六
18、進(jìn)制字符,否 則返回 -1char CSCommTestDlg:ConvertHexChar(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 (-
19、1);再將 CSCommTestDlg:OnButtonManualsend() 修改成以下形式:void CSCommTestDlg:OnButtonManualsend()/ TODO: Add your control notification handler code hereUpdateData(TRUE); / 讀取編輯框內(nèi)容if(m_ctrlHexSend.GetCheck()CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); / 此處返回的 len 可以用于計(jì)算發(fā)送了多 少個(gè)十六進(jìn)制數(shù)m_ctrlComm.Se
20、tOutput(COleVariant(hexdata); / 發(fā)送十六進(jìn)制數(shù)據(jù)elsem_ctrlComm.SetOutput(COleVariant(m_strTXData);/ 發(fā)送 ASCII 字符數(shù)據(jù)現(xiàn)在,你先將串口線接好并打開串口調(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)該可以看到00 01 02 03 A1 CC 了。9. 在接收框中以十六進(jìn)制顯示 這就容易多了: 在主對(duì)話框中加入一個(gè)復(fù)選接鈕, IDC_CHECK_
21、HEXDISPLACYaption: 十六進(jìn)制顯示,再利用 ClassWizard 為其添加控制變量:m_ctrlHexDiaplay 。然后修改 CSCommTestDlg:OnComm(函數(shù):void CSCommTestDlg:OnComm()/ TODO: Add your control notification handler code hereVARIANT variant_inp; COleSafeArray safearray_inp;LONG len,k;設(shè)置 BYTE數(shù)組 An 8-bit integerthat is not signed.BYTE rxdata2048
22、; / CString strtemp;if(m_ctrlComm.GetCommEvent()=2) / variant_inp=m_ctrlComm.GetInput(); / safearray_inp=variant_inp; /VARIANT事件值為 2 表示接收緩沖區(qū)內(nèi)有字符讀緩沖區(qū)型變量轉(zhuǎn)換為 ColeSafeArray 型變量len=safearray_inp.GetOneDimSize(); / 得到有效數(shù)據(jù)長(zhǎng)度f(wàn)or(k=0;k<len;k+)safearray_inp.GetElement(&k,rxdata+k);轉(zhuǎn)換為 BYTE型數(shù)組for(k=0;k&
23、lt;len;k+) / 將數(shù)組轉(zhuǎn)換為 Cstring 型變量BYTE bt=*(char*)(rxdata+k); /字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format("%02X ",bt); /將字符以十六進(jìn)制方式送入臨時(shí)變量strtemp 存放,注意這里加入一個(gè)空隔elsestrtemp.Format("%c",bt); / 將字符送入臨時(shí)變量 strtemp 存放m_strRXData+=strtemp; /加入接收編輯框?qū)?yīng)字符串UpdateData(FALSE); / 更新編輯框內(nèi)容測(cè)試:在串口調(diào)
24、試助手發(fā)送框中輸入 00 01 02 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 中選上 MessageMap卡,然后在 Objects IDs 選中CSCommTestDIg類,再在 Messages框中選上 WM_TIME消息,單擊 A
25、DD_FUNCTIC加入 void CSCommTestDlg:OnTimer(UINT nIDEvent) 函數(shù),這個(gè)函數(shù)是放入“時(shí)間到”后要處理的代碼:void CSCommTestDlg:OnTimer(UINT nIDEvent)/ TODO: Add your message handler code here and/or call default OnButtonManualsend() ; CDialog:OnTimer(nIDEvent);再在在主對(duì)話框中加入一個(gè)復(fù)選接鈕, ID 為 IDC_CHECK_AUTOSECNaDption: 自動(dòng)發(fā)送(周期 1 秒),再利 用 C
26、lassWizard 為其添加 BN_CLICK消息處理函數(shù) void CSCommTestDlg:OnCheckAutosend():void CSCommTestDlg:OnCheckAutosend()/ TODO: Add your control notification handler code here m_bAutoSend=!m_bAutoSend;if(m_bAutoSend)SetTimer(1,1000,NULL);/ 時(shí)間為 1000 毫秒elseKillTimer(1); /取消定時(shí)其中:m_bAutoSend為BOO型變量,在 CLASSVIEV中為CSCommT
27、estDIg類加入,并在構(gòu)造函數(shù)中初始化:m_bAutoSen=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)在GetInput()函數(shù)的返回值也成了 VARIANT類型,那么如何從返回的值中提取有用的內(nèi)容。VARIANT及由之而派生出的COleVariant類主要用于在OLE自動(dòng)化中傳遞數(shù)據(jù)。實(shí)際上 VARIANT也只不過(guò)是一個(gè)新定義的
28、結(jié)構(gòu)罷了, 它的主要成員包括一個(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ò)串口接收到的內(nèi)容常常 是一個(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改變(某些類型如BSTR在
29、16位或32位應(yīng)用程序間傳遞時(shí)會(huì)被 OLE翻譯從而破壞其中的二進(jìn)制數(shù)據(jù))。大家無(wú)須了解SAFEARRA的具體定義,只要知道它是另外一個(gè)結(jié)構(gòu),其中包含一個(gè)(void *) 類型的指針pvData,其指向的內(nèi)存就是存放有用數(shù)據(jù)的地方。簡(jiǎn)而言之,從Getlnput()函數(shù)返回的VARIANT類型變量中,找出parray 指針,再?gòu)脑撝羔樦赶虻腟AFEARRA變量中找出pvData指針,就可以向訪問(wèn)數(shù)組一樣取得所接收到的數(shù)據(jù)了。具體應(yīng)用請(qǐng)參見(jiàn)void CSCommTestDlg:OnComm()函數(shù)。大概我現(xiàn)在也說(shuō)不清這個(gè)問(wèn)題,我自己從第一次接觸這個(gè)東西,到現(xiàn)在還是給別人講不清。另:二進(jìn)制收發(fā)設(shè)置請(qǐng)參
30、考 MSCom控件說(shuō)明MSCom控件使用詳解龔建偉:這篇東西來(lái)不及好好整理,因有朋友經(jīng)常提及,先放在這里,如果有必要,再詳細(xì)理順一下,更 為詳細(xì)的信息請(qǐng)去看 MSDN摘要:本文詳細(xì)介紹了 MSCom控件在串口編程中使用 目次MSCom控件兩種處理通訊的方式CommPort屬 性RThreshold 屬性 CTSHolding 屬性 SThreshold 屬性 CDHolding 屬性 DSRHolding 屬性 Settings 屬性 InputLen 屬性 EOFEnable 屬性Handshake 常數(shù)OnComn常數(shù)InputMode 常數(shù) 錯(cuò)誤消息MSComm控件通過(guò)串行端口傳輸和接收
31、數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。MSCom控件在串口編程時(shí)非常方便,程序員不必去花時(shí)間去了解較為復(fù)雜的 API 函數(shù),而且在 VC、VB、Delphi 等語(yǔ)言中均可使 用。 Microsoft Communications Control(以下簡(jiǎn)稱 MSCon)是 Microsoft 公司提供的簡(jiǎn)化 Windows下串行通信編程的 ActiveX 控件,它為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法。具體的來(lái)說(shuō),它 提供了兩種處理通信問(wèn)題的方法:一是事件驅(qū)動(dòng) (Event driven) 方法,一是查詢法。1. MSComr控件兩種處理通訊的方式MSCom控件提供下列兩種處理通訊的方式:事
32、件驅(qū)動(dòng)方式和查詢方式。1.1 事件驅(qū)動(dòng)方式事件驅(qū)動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通 知,例如,在串口接收緩沖區(qū)中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一 個(gè)字符到達(dá)或一個(gè)變化發(fā)生時(shí)。在這些情況下,可以利用MSComm控件的OnComm事件捕獲并處理這些通訊事件。OnComn事件還可以檢查和處理通訊錯(cuò)誤。所有通訊事件和通訊錯(cuò)誤的列表,參閱CommEvent屬性。在編程過(guò)程中,就可以在OnComi事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。每個(gè) MS
33、Comn控件對(duì)應(yīng)著一個(gè)串行端口。如果應(yīng)用程序需要訪問(wèn)多個(gè)串行端口,必須使用 多個(gè)MSComm控件。1.2 查詢方式 查詢方式實(shí)質(zhì)上還是事件驅(qū)動(dòng),但在有些情況下,這種方式顯得更為便捷。在程序的每個(gè)關(guān)鍵功能之后, 可以通過(guò)檢查 CommEvent 屬性的值來(lái)查詢事件和錯(cuò)誤。如果應(yīng)用程序較小, 并且是自保持的, 這種方法可 能是更可取的。例如,如果寫一個(gè)簡(jiǎn)單的電話撥號(hào)程序,則沒(méi)有必要對(duì)每接收一個(gè)字符都產(chǎn)生事件,因?yàn)?唯一等待接收的字符是調(diào)制解調(diào)器的“確定”響應(yīng)。2. MSComm控件的常用屬性MSCom!控件有很多重要的屬性,但首先必須熟悉幾個(gè)屬性。CommPort 設(shè)置并返回通訊端口號(hào)。Setti
34、ngs 以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。PortOpen 設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口。Input 從接收緩沖區(qū)返回和刪除字符。Output 向傳輸緩沖區(qū)寫一個(gè)字符串。下面分別描述:CommPort屬性設(shè)置并返回通訊端口號(hào)。語(yǔ)法 object.CommPortvalue (value 一整型值,說(shuō)明端口號(hào)。 )說(shuō)明 在設(shè)計(jì)時(shí), value 可以設(shè)置成從 1 到 16 的任何數(shù)(缺省值為 1 )。但是如果用 PortOpen 屬性打 開一個(gè)并不存在的端口時(shí),MSComr控件會(huì)產(chǎn)生錯(cuò)誤68 (設(shè)備無(wú)效)。注意:必須在打開端口之前設(shè)置 CommPort 屬
35、性。RThreshold 屬性:在 MSComrit空件設(shè)置 CommEvent屬性為comEvReceive 并產(chǎn)生 OnComm之前,設(shè)置并 返回的要接收的字符數(shù)。語(yǔ)法object.Rthreshold = value (value整型表達(dá)式,說(shuō)明在產(chǎn)生 OnComm事件之前要接收的字符數(shù)。 )說(shuō)明 當(dāng)接收字符后,若 Rthreshold屬性設(shè)置為0 (缺省值)則不產(chǎn)生 OnComm事件。例如,設(shè)置Rthreshold 為1,接收緩沖區(qū)收到每一個(gè)字符都會(huì)使MSComn控件產(chǎn)生 OnComm事件。CTSHolding 屬性:確定是否可通過(guò)查詢 Clear To Send (CTS) 線的狀態(tài)
36、發(fā)送數(shù)據(jù)。 Clear To Send 是調(diào) 制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的信號(hào),指示傳輸可以進(jìn)行。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。語(yǔ)法: object.CTSHolding( Boolean )Mscomm控件的CTSHolding 屬性設(shè)置值:True Clear To Send線為高電平。False Clear To Send 線為低電平。說(shuō)明:如果 Clear To Send線為低電平(CTSHolding = False) 并且超時(shí)時(shí),MSComr控件設(shè)置 CommEvent 屬性為 comEventCTSTO (Clear To Send Timeout) 并產(chǎn)生 OnComm事件
37、。Clear To Send 線用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要確定 Clear To Send 線的狀態(tài), CTSHolding 屬性給出一種手工查詢的方法。詳細(xì)信息 有關(guān)握手協(xié)議,請(qǐng)參閱 Handshaking 屬性。SThreshold 屬性:MSComn控件設(shè)置 CommEvent屬性為comEvSend并產(chǎn)生OnComm事件之前,設(shè)置并返 回傳輸緩沖區(qū)中允許的最小字符數(shù)。語(yǔ)法 object.SThreshold = value value整形表達(dá)式,代表在 OnComm事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符數(shù)。說(shuō)明
38、:若設(shè)置Sthreshold 屬性為0 (缺省值),數(shù)據(jù)傳輸事件不會(huì)產(chǎn)生 OnComm事件。若設(shè)置Sthreshold 屬性為1,當(dāng)傳輸緩沖區(qū)完全空時(shí),MSComr控件產(chǎn)生OnComm事件。如果在傳輸緩沖區(qū)中的字符數(shù)小于value ,CommEvent屬性設(shè)置為 comEvSend,并產(chǎn)生 OnComm事件。comEvSend事件僅當(dāng)字符數(shù)與 Sthreshold 交叉時(shí)被激活一次。例如,如果 Sthreshold 等于 5 ,僅當(dāng)在輸出隊(duì)列中字符數(shù)從 5 降到 4 時(shí), comEvSend 才發(fā)生。如果在輸出隊(duì)列中從沒(méi)有比Sthreshold 多的字符, comEvSend 事件將絕不會(huì)發(fā)生
39、。Handshake 常數(shù) 常數(shù) 值 描述 comNone 0 無(wú)握手。comXonXoff 1 XOn/Xoff 握手。comRTS 2 Request-to-send/clear-to-send握手。comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。OnComn常數(shù)常數(shù) 值 描述 comEvSend 1 發(fā)送事件。 comEvReceive 2 接收事件。 comEvCTS 3 clear-to-send線變化。comEvDSR 4 data-set ready 線變化。 comEvCD 5 carrier detect 線變化。 c
40、omEvRing 6 振鈴檢測(cè)。 comEvEOF 7 文件結(jié)束。Error 常數(shù)常數(shù) 值 描述comEventBreak 1001 接收到中斷信號(hào) comEventCTSTO 1002 Clear-to-send 超時(shí) comEventDSRTO 1003 Data-set ready 超時(shí) comEventFrame 1004 幀錯(cuò)誤 comEventOverrun 1006 端口超速 comEventCDTO 1007 Carrier detect 超時(shí) comEventRxOver 1008 接收緩沖區(qū)溢出 comEventRxParity 1009 Parity錯(cuò)誤comEventT
41、xFull 1010 傳輸緩沖區(qū)滿 comEventDCB 1011 檢索端口 設(shè)備控制塊 (DCB) 時(shí)的意外錯(cuò)誤InputMode 常數(shù) 常數(shù) 值 描述 comInputModeText 0 (缺省)通過(guò) Input 屬性以文本方式取回?cái)?shù)據(jù)。 comInputModeBinary 1 通過(guò) Input 屬性以二進(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.
42、CDHolding設(shè)置值: CDHolding 屬性的設(shè)置值為:設(shè)置 描述True Carrier Detect 線為高電平False Carrier Detect 線為低電平說(shuō)明:注意當(dāng) Carrier Detect 線為高電平(CDHolding = True)且超時(shí)時(shí),MSComr控件設(shè)置 CommEvent屬性為comEventCDTO (Carrier Detect超時(shí)錯(cuò)誤),并產(chǎn)生 OnComm事件。注意 在主機(jī)應(yīng)用程序中捕獲一個(gè)丟失的傳輸是特別重要的, 例如一個(gè)公告板, 因?yàn)楹艚姓呖梢噪S時(shí)掛起 (放 棄傳輸)。Carrier Detect 也被稱為 Receive Line Si
43、gnal 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ì)象。DSRHolding 屬性返回以下值:值 描述True Data Set Ready 線高False Data Set Ready 線低說(shuō)明:當(dāng) Data Set Ready 線為高電平(DSRHolding = True)且超時(shí)時(shí),MSComr控件設(shè)置 CommEvent屬性為comEventDSRTO(數(shù)據(jù)準(zhǔn)備超時(shí))并產(chǎn)生 OnComm事件。當(dāng)為 Data Terminal Equipment (DTE) 機(jī)器寫 Data Set Ready/Data Terminal Ready 握手例程時(shí)該屬性 是十分有用的。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 付費(fèi)會(huì)員活動(dòng)方案
- 代發(fā)營(yíng)銷活動(dòng)方案
- 代表倡議活動(dòng)方案
- 以往紗窗活動(dòng)方案
- 儀仗兵自由活動(dòng)方案
- 仲夏集體活動(dòng)方案
- 企業(yè)中秋拓展活動(dòng)方案
- 湖北省T8聯(lián)盟2025屆高三下學(xué)期高考考前模擬(一)數(shù)學(xué)試題
- 企業(yè)會(huì)議活動(dòng)方案
- 企業(yè)公司元旦活動(dòng)方案
- 藏獒渡魂讀后感600字
- 獨(dú)柱墩鋼蓋梁安裝施工要點(diǎn)
- 燃?xì)夤こ炭⒐を?yàn)收備案表
- 跨文化溝通的本質(zhì)-PPT課件
- 財(cái)政一體化業(yè)務(wù)系統(tǒng)
- 北美連續(xù)油管技術(shù)的新進(jìn)展及發(fā)展趨勢(shì)李宗田
- 光電效應(yīng)測(cè)普朗克常數(shù)-實(shí)驗(yàn)報(bào)告
- 110千伏變電站工程檢測(cè)試驗(yàn)項(xiàng)目計(jì)劃
- 《鐵路貨物運(yùn)價(jià)規(guī)則》
- YD_T 3956-2021 電信網(wǎng)和互聯(lián)網(wǎng)數(shù)據(jù)安全評(píng)估規(guī)范_(高清版)
- (完整版)數(shù)學(xué)常用英文詞匯
評(píng)論
0/150
提交評(píng)論