




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于MSComm控件的串口調(diào)試程序及源代碼(轉(zhuǎn))這是龔建偉老師提供的一個(gè)基于MSComm控件的串口調(diào)試程序,下面給出了在VisualC++環(huán)境下詳細(xì)的制作過程。附件的源代碼是我根據(jù)這些步驟編寫出來的,可以供大家參考哦!目錄:1.建立項(xiàng)目2.在項(xiàng)目中插入MSComm控件3.利用ClassWizard定義CMSComm類控制變量4.在對(duì)話框中添加控件5.添加串口事件消息處理函數(shù)OnComm()6.打開和設(shè)置串口參數(shù)7.發(fā)送數(shù)據(jù)8.發(fā)送十六進(jìn)制字符9.在接收框中以十六進(jìn)制顯示10.如何設(shè)置自動(dòng)發(fā)送11.什么是VARIANT數(shù)據(jù)類型?如何使用VARIANT數(shù)據(jù)類型?1.建立項(xiàng)目:打開VC++6.0,建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序SCommTest(與我源代碼一致,等會(huì)你會(huì)方便一點(diǎn));2.在項(xiàng)目中插入MSComm控件選擇Project菜單下AddToProject子菜單中的ComponentsandControls…選項(xiàng),在彈出的對(duì)話框中雙擊RegisteredActiveXControls項(xiàng)(稍等一會(huì),這個(gè)過程較慢),則所有注冊(cè)過的ActiveX控件出現(xiàn)在列表框中。選擇MicrosoftCommunicationsControl,version6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受缺省的選項(xiàng)。(如果你在控件列表中看不到MicrosoftCommunicationsControl,version6.0,那可能是你在安裝VC6時(shí)沒有把ActiveX一項(xiàng)選上,重新安裝VC6,選上ActiveX就可以了),這時(shí)在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構(gòu)clw文件也一樣),并且在控件工具欄Controls中出現(xiàn)了電話圖標(biāo)(如圖1所示),現(xiàn)在要做的是用鼠標(biāo)將此圖標(biāo)拖到對(duì)話框中,程序運(yùn)行后,這個(gè)圖標(biāo)是看不到的。3.利用ClassWizard定義CMSComm類控制對(duì)象打開ClassWizard->MemberViariables選項(xiàng)卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時(shí)你可以看一看,在對(duì)話框頭文件中自動(dòng)加入了//{{AFX_INCLUDES()#include"mscomm.h"http://}}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和VerticalScroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline。再打開ClassWizard->MemberViariables選項(xiàng)卡,選擇CSCommTestDlg類,為IDC_EDIT_RXDATA添加CString變量m_strRXData,為IDC_EDIT_TXDATA添加CString變量m_strTXData。說明:m_strRXData和m_strTXData分別用來放入接收和發(fā)送的字符數(shù)據(jù)。5.添加串口事件消息處理函數(shù)OnComm()打開ClassWizard->MessageMaps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對(duì)話框中將函數(shù)名改為OnComm,(好記而已)OK。這個(gè)函數(shù)是用來處理串口消息事件的,如每當(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ù)中加入如下代碼:voidCSCommTestDlg::OnComm(){//TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata[2048];//設(shè)置BYTE數(shù)組An8-bitintegerthatisnotsigned.CStringstrtemp;if(m_ctrlComm.GetCommEvent()==2)//事件值為2表示接收緩沖區(qū)內(nèi)有字符{////////以下你可以根據(jù)自己的通信協(xié)議加入處理代碼variant_inp=m_ctrlComm.GetInput();//讀緩沖區(qū)safearray_inp=variant_inp;//VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量len="safearray"_inp.GetOneDimSize();//得到有效數(shù)據(jù)長(zhǎng)度for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//轉(zhuǎn)換為BYTE型數(shù)組for(k=0;k<len;k++)//將數(shù)組轉(zhuǎn)換為Cstring型變量{BYTEbt=*(char*)(rxdata+k);//字符型strtemp.Format("%c",bt);//將字符送入臨時(shí)變量strtemp存放m_strRXData+=strtemp;//加入接收編輯框?qū)?yīng)字符串}}UpdateData(FALSE);//更新編輯框內(nèi)容}到目前為止還不能在接收編輯框中看到數(shù)據(jù),因?yàn)槲覀冞€沒有打開串口,但運(yùn)行程序不應(yīng)該有任何錯(cuò)誤,不然,你肯定哪兒沒看仔細(xì),因?yàn)槲沂谴蜷_VC6對(duì)照著做一步寫一行的,運(yùn)行試試。沒錯(cuò)吧?那么做下一步:6.打開串口和設(shè)置串口參數(shù)你可以在你需要的時(shí)候打開串口,例如在程序中做一個(gè)開始按鈕,在該按鈕的處理函數(shù)中打開串口?,F(xiàn)在我們?cè)谥鲗?duì)話框的CSCommTestDlg::OnInitDialog()打開串口,加入如下代碼://TODO:Addextrainitializationhereif(m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1);//選擇com1if(!m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(TRUE);//打開串口elseAfxMessageBox("cannotopenserialport");m_ctrlComm.SetSettings("9600,n,8,1");//波特率9600,無校驗(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ù)的OnComm事件m_ctrlComm.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,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數(shù),并在函數(shù)中添加如下代碼:voidCSCommTestDlg::OnButtonManualsend(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//讀取編輯框內(nèi)容m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發(fā)送數(shù)據(jù)}運(yùn)行程序,在發(fā)送編輯框中隨意輸入點(diǎn)什么,單擊發(fā)送按鈕,??!看看,在另一端的串口調(diào)試助手(或別的調(diào)試工具)接收框里出現(xiàn)了什么。如果你真是初次涉獵串口編程,又一次成功,那該說聲謝謝我了,因?yàn)槲业谝淮巫龃诔绦驎r(shí)可費(fèi)勁了,那時(shí)網(wǎng)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。最后說明一下,由于用到VC控件,在沒有安裝VC的計(jì)算機(jī)上運(yùn)行時(shí)要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)并再進(jìn)行注冊(cè)設(shè)置,請(qǐng)參考如何手工注冊(cè)MSComm控件。8.發(fā)送十六進(jìn)制字符在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_HEXSENDCaption:十六進(jìn)制發(fā)送,再利用ClassWizard為其添加控制變量:m_ctrlHexSend;在ClassView中為SCommTestDlg類添加以下兩個(gè)PUBLIC成員函數(shù),并輸入相應(yīng)代碼;//由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每?jī)蓚€(gè)字符之間插入一個(gè)空隔//如:A123450B0029//CByteArray是一個(gè)動(dòng)態(tài)字節(jié)數(shù)組,可參看MSDN幫助intCSCommTestDlg::String2Hex(CStringstr,CByteArray&senddata){inthexdata,lowhexdata;inthexdatalen="0";intlen="str".GetLength();senddata.SetSize(len/2);for(inti="0";i<len;){charlstr,hstr=str[i];if(hstr==''){i++;continue;}i++;if(i>=len)break;lstr=str[i];hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if((hexdata==16)||(lowhexdata==16))break;elsehexdata=hexdata*16+lowhexdata;i++;senddata[hexdatalen]=(char)hexdata;hexdatalen++;}senddata.SetSize(hexdatalen);returnhexdatalen;}//這是一個(gè)將字符轉(zhuǎn)換為相應(yīng)的十六進(jìn)制值的函數(shù)//好多C語言書上都可以找到//功能:若是在0-F之間的字符,則轉(zhuǎn)換為相應(yīng)的十六進(jìn)制字符,否則返回-1charCSCommTestDlg::ConvertHexChar(charch){if((ch>='0')&&(ch<='9'))returnch-0x30;elseif((ch>='A')&&(ch<='F'))returnch-'A'+10;elseif((ch>='a')&&(ch<='f'))returnch-'a'+10;elsereturn(-1);}再將CSCommTestDlg::OnButtonManualsend()修改成以下形式:voidCSCommTestDlg::OnButtonManualsend(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//讀取編輯框內(nèi)容if(m_ctrlHexSend.GetCheck()){CByteArrayhexdata;intlen="String2Hex"(m_strTXData,hexdata);//此處返回的len可以用于計(jì)算發(fā)送了多少個(gè)十六進(jìn)制數(shù)m_ctrlComm.SetOutput(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ā)送框中輸入00010203A1CC等十六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在串口調(diào)試助手的接收框中應(yīng)該可以看到00010203A1CC了。9.在接收框中以十六進(jìn)制顯示這就容易多了:在主對(duì)話框中加入一個(gè)復(fù)選接鈕,IDC_CHECK_HEXDISPLAYCaption:十六進(jìn)制顯示,再利用ClassWizard為其添加控制變量:m_ctrlHexDiaplay。然后修改CSCommTestDlg::OnComm()函數(shù):voidCSCommTestDlg::OnComm(){//TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata[2048];//設(shè)置BYTE數(shù)組An8-bitintegerthatisnotsigned.CStringstrtemp;if(m_ctrlComm.GetCommEvent()==2)//事件值為2表示接收緩沖區(qū)內(nèi)有字符{variant_inp=m_ctrlComm.GetInput();//讀緩沖區(qū)safearray_inp=variant_inp;//VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量len=safearray_inp.GetOneDimSize();//得到有效數(shù)據(jù)長(zhǎng)度for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//轉(zhuǎn)換為BYTE型數(shù)組for(k=0;k<len;k++)//將數(shù)組轉(zhuǎn)換為Cstring型變量{BYTEbt=*(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)試助手發(fā)送框中輸入00010203A1CC等十六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在本程序運(yùn)行后選上以十六進(jìn)制顯示,在串口調(diào)試助手中單擊手動(dòng)發(fā)送或自動(dòng)發(fā)送,則在本程序的接收框中應(yīng)該可以看到00010203A1CC了。10.如何設(shè)置自動(dòng)發(fā)送最簡(jiǎn)單的設(shè)定自動(dòng)發(fā)送周期是用SetTimer()函數(shù),這在數(shù)據(jù)采集中很有用,在控制中指令的傳送也可能用到定時(shí)發(fā)送。方法是:在ClassWizard中選上MessageMap卡,然后在ObjectsIDs選中CSCommTestDlg類,再在Messages框中選上WM_TIMER消息,單擊ADD_FUNCTION加入voidCSCommTestDlg::OnTimer(UINTnIDEvent)函數(shù),這個(gè)函數(shù)是放入“時(shí)間到”后要處理的代碼:voidCSCommTestDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultOnButtonManualsend();CDialog::OnTimer(nIDEvent);}再在在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_AUTOSENDCaption:自動(dòng)發(fā)送(周期1秒),再利用ClassWizard為其添加BN_CLICK消息處理函數(shù)voidCSCommTestDlg::OnCheckAutosend():voidCSCommTestDlg::OnCheckAutosend(){//TODO:Addyourcontrolnotificationhandlercodeherem_bAutoSend=!m_bAutoSend;if(m_bAutoSend){SetTimer(1,1000,NULL);//時(shí)間為1000毫秒}else{KillTimer(1);//取消定時(shí)}}其中:m_bAutoSend為BOOL型變量,在CLASSVIEW中為CSCommTestDlg類加入,并在構(gòu)造函數(shù)中初始化:m_bAutoSen=FALSE;現(xiàn)在可以運(yùn)行程序測(cè)試了。11.什么是VARIANT數(shù)據(jù)類型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年勞務(wù)安全協(xié)議書:華區(qū)餐飲服務(wù)業(yè)員工勞動(dòng)保護(hù)合同
- 2025年度企業(yè)內(nèi)部數(shù)據(jù)保密管理協(xié)議書模板
- 2025年度地質(zhì)勘查技術(shù)服務(wù)與數(shù)據(jù)共享合同
- 專賣店裝修保修合同模板
- 2024年佛山外向型骨干企業(yè)全球化發(fā)展白皮書-佛山市貿(mào)促會(huì)
- 2025年度商用復(fù)印機(jī)購(gòu)銷合同附帶原裝耗材包
- 商務(wù)辦公區(qū)裝修合同
- Unit 3 Keep fit Section B 1a-1d 教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版英語七年級(jí)下冊(cè)
- 浮力(教學(xué)設(shè)計(jì))2023-2024學(xué)年教科版五年級(jí)科學(xué)下冊(cè)
- 2023-2024學(xué)年天津市南開區(qū)高中學(xué)業(yè)水平合格性考試模擬考試生物試卷
- ASTM標(biāo)準(zhǔn)全部目錄(中文版)
- 《汽車電氣設(shè)備構(gòu)造與維修》 第4版 課件 第3、4章 電源系統(tǒng)、發(fā)動(dòng)機(jī)電器
- 遼海版小學(xué)美術(shù)六年級(jí)下冊(cè)全冊(cè)教案
- 2023年南京市鼓樓區(qū)建寧路街道安監(jiān)辦招聘專職安全員考試真題及答案
- 2024陜西延長(zhǎng)石油集團(tuán)礦業(yè)公司所屬單位招聘筆試參考題庫(kù)附帶答案詳解
- 鄉(xiāng)鎮(zhèn)精神衛(wèi)生工作總結(jié)
- 井工煤礦中長(zhǎng)期防治水規(guī)劃編制細(xì)則
- 2024年湘中幼兒師范高等??茖W(xué)校高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫(kù)含答案解析
- 設(shè)備使用手冊(cè)(范例模板)
- 上海房屋修繕工程培訓(xùn)課件
- 醫(yī)院電梯安全操作培訓(xùn)記錄
評(píng)論
0/150
提交評(píng)論