版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C控件MSComm編寫串口通信程序(轉(zhuǎn))博客分類: · C+VC+編程數(shù)據(jù)結(jié)構(gòu)MFCMicrosoft 在眾多網(wǎng)友的支持下,串口調(diào)試助手從2001年5月21日發(fā)布至今,短短一個(gè)月,在全國各地累計(jì)下載量近5000人次,在近200多個(gè)電子郵件中,20多人提供了使用測試意見,更有50多位朋友提出要串口調(diào)試助手的源代碼,為了答謝謝朋友們的支持,公開推出我最初用VC控件MSComm編寫串口通信程序的源代碼,并寫出詳細(xì)的編程過程,姑且叫串口調(diào)試助手源程序V1.0或VC串口通訊源程序吧,我相信,如果你用VC編程,那么有了這個(gè)代碼,就可以輕而易舉地完成串口編程任務(wù)了。(也許本文過
2、于詳細(xì),高手就不用看)開始吧:1.建立項(xiàng)目:打開VC6.0,建立一個(gè)基于對話框的MFC應(yīng)用程序SCommTest(與我源代碼一致,等會你會方便一點(diǎn));2.在項(xiàng)目中插入MSComm控件 選擇Project菜單下Add To Project子菜單中的 Components and Controls選項(xiàng),在彈出的對話框中雙擊Registered ActiveX Controls項(xiàng)(稍等一會,這個(gè)過程較慢),則所有注冊過的ActiveX控件出現(xiàn)在列表框中。選擇Microsoft Communications Control, version 6.0,單擊In
3、sert按鈕將它插入到我們的Project中來,接受缺省的選項(xiàng)。(如果你在控件列表中看不到Microsoft Communications Control, version 6.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)拖到對話框中,程序運(yùn)行后,這個(gè)圖標(biāo)是看不到的。 3.利用Clas
4、sWizard定義CMSComm類控制對象 打開ClassWizard>Member Viariables選項(xiàng)卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時(shí)你可以看一看,在對話框頭文件中自動(dòng)加入了/AFX_INCLUDES() #include "mscomm.h" /AFX_INCLUDES (這時(shí)運(yùn)行程序,如果有錯(cuò),那就再從頭開始)。4.在對話框中添加控件 向主對話框中添加兩個(gè)編輯框,一個(gè)用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RX
5、DATA,另一個(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。再打開ClassWizard>Member Viariables選項(xiàng)卡,選擇CSCommTestDlg類,為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加
6、CString變量m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發(fā)送的字符數(shù)據(jù)。 休息一會吧?我們天天與電腦打交道,要注意保重,我現(xiàn)在在單杠上做引體向上可以來40次,可我都32了,佩服嗎? 。好了,再接著來,下面是關(guān)鍵了:5.添加串口事件消息處理函數(shù)OnComm() 打開ClassWizard>Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數(shù)名改
7、為OnComm,(好記而已)OK。 這個(gè)函數(shù)是用來處理串口消息事件的,如每當(dāng)串口接收到數(shù)據(jù),就會產(chǎn)生一個(gè)串口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛才添加的函數(shù)就會執(zhí)行,我們在OnComm()函數(shù)加入相應(yīng)的處理代碼就能實(shí)現(xiàn)自已想要的功能了。請你在函數(shù)中加入如下代碼:void CSCommTestDlg:OnComm() / TODO: Add your control notification handler code here VARIANT variant_inp;
8、0; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /設(shè)置BYTE數(shù)組 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /事件值為2表示接收緩沖區(qū)內(nèi)有字符 &
9、#160; /以下你可以根據(jù)自己的通信協(xié)議加入處理代碼 variant_inp=m_ctrlComm.GetInput(); /讀緩沖區(qū) safearray_inp=variant_inp; /VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量 len=safearr
10、ay_inp.GetOneDimSize(); /得到有效數(shù)據(jù)長度 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型變量
11、60; BYTE bt=*(char*)(rxdata+k); /字符型 strtemp.Format("%c",bt); /將字符送入臨時(shí)變量strtemp存放
12、0; m_strRXData+=strtemp; /加入接收編輯框?qū)?yīng)字符串 UpdateData(FALSE); /更新編輯框內(nèi)容到目前為止還不能在接收編輯框中看到數(shù)據(jù),因?yàn)槲覀冞€沒有打開串口,但運(yùn)行程序不應(yīng)該有任何錯(cuò)誤,不然,你肯定哪兒沒看仔細(xì),因?yàn)槲沂谴蜷_VC6對照著做一步寫一行的,運(yùn)行試試。沒錯(cuò)吧?那么做下一步:6.打開串口和設(shè)置串口參數(shù) 你可以在
13、你需要的時(shí)候打開串口,例如在程序中做一個(gè)開始按鈕,在該按鈕的處理函數(shù)中打開串口?,F(xiàn)在我們在主對話框的CSCommTestDlg:OnInitDialog()打開串口,加入如下代碼:/ TODO: Add extra initialization hereif(m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1); /選擇com1if( !m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(TRUE);/打開串口elseAfxMessageBox(&
14、quot;cannot open serial port");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ù)長度為0m_ctrlComm.GetInput();/先預(yù)讀緩沖
15、區(qū)以清除殘留數(shù)據(jù)現(xiàn)在你可以試試程序了,將串口線接好后(不會接?去看看我寫的串口接線基本方法),打開串口調(diào)試助手,并將串口設(shè)在com2,選上自動(dòng)發(fā)送,也可以等會手動(dòng)發(fā)送。再執(zhí)行你編寫的程序,接收框里應(yīng)該有數(shù)據(jù)顯示了。7.發(fā)送數(shù)據(jù) 先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKED處理函數(shù),打開ClassWizard>Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數(shù),并在函數(shù)中添加如下代碼:void CSCommTestDlg:OnButt
16、onManualsend() / TODO: Add your control notification handler code hereUpdateData(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)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。最
17、后說明一下,由于用到VC控件,在沒有安裝VC的計(jì)算機(jī)上運(yùn)行時(shí)要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)并再進(jìn)行注冊設(shè)置,請參考如何手工注冊MSComm控件。龔建偉 8.發(fā)送十六進(jìn)制字符 在主對話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_HEXSEND Caption: 十六進(jìn)制發(fā)送,再利用ClassWizard為其添加控制變量:m_ctrlHexSend; 在C
18、lassView中為SCommTestDlg類添加以下兩個(gè)PUBLIC成員函數(shù),并輸入相應(yīng)代碼;/由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每兩個(gè)字符之間插入一個(gè)空隔/如:A1 23 45 0B 00 29/CByteArray是一個(gè)動(dòng)態(tài)字節(jié)數(shù)組,可參看MSDN幫助int CSCommTestDlg:String2Hex(CString str, CByteArray &senddata)int hexdata,lowhexdata;int hexdatalen=0;int len=str.GetLength();senddata.SetSize(len/2);for(in
19、t i=0;i<len;)char lstr,hstr=stri;if(hstr=' ')i+;continue;i+;if(i>=len)break;lstr=stri;hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;else hexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSiz
20、e(hexdatalen);return hexdatalen;/這是一個(gè)將字符轉(zhuǎn)換為相應(yīng)的十六進(jìn)制值的函數(shù)/好多C語言書上都可以找到/功能:若是在0-F之間的字符,則轉(zhuǎn)換為相應(yīng)的十六進(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;
21、else if(ch>='a')&&(ch<='f')return ch-'a'+10;else return (-1); 再將CSCommTestDlg:OnButtonManualsend()修改成以下形式:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /讀取編輯框內(nèi)容if(m_ctrlHexSend.Ge
22、tCheck()CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); /此處返回的len可以用于計(jì)算發(fā)送了多少個(gè)十六進(jìn)制數(shù)m_ctrlComm.SetOutput(COleVariant(hexdata); /發(fā)送十六進(jìn)制數(shù)據(jù)else m_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)制字符,并
23、選上以十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在串口調(diào)試助手的接收框中應(yīng)該可以看到00 01 02 03 A1 CC了。9.在接收框中以十六進(jìn)制顯示 這就容易多了: 在主對話框中加入一個(gè)復(fù)選接鈕,IDC_CHECK_HEXDISPLAY Caption: 十六進(jìn)制顯示,再利用ClassWizard為其添加控制變量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg:OnComm()函數(shù):void CSCommTestDlg:OnComm() / TODO: Add your control noti
24、fication handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata2048; /設(shè)置BYTE數(shù)組 An 8-bit integerthat is not signed.CString strtemp;if(m_ctrlComm.GetCommEvent()=2) /事件值為2表示接收緩沖區(qū)內(nèi)有字符variant_inp=m_ctrlComm.GetInput(); /讀緩沖區(qū)safearray_inp=variant_inp; /VARIANT型變量轉(zhuǎn)換為Co
25、leSafeArray型變量len=safearray_inp.GetOneDimSize(); /得到有效數(shù)據(jù)長度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型變量BYTE bt=*(char*)(rxdata+k); /字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format("%02X ",bt); /將字符以十六進(jìn)制方式送入臨時(shí)變量strtemp存放,注意這里
26、加入一個(gè)空隔else strtemp.Format("%c",bt); /將字符送入臨時(shí)變量strtemp存放m_strRXData+=strtemp; /加入接收編輯框?qū)?yīng)字符串 UpdateData(FALSE); /更新編輯框內(nèi)容測試:在串口調(diào)試助手發(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ā)送
27、160; 最簡單的設(shè)定自動(dòng)發(fā)送周期是用SetTimer()函數(shù),這在數(shù)據(jù)采集中很有用,在控制中指令的傳送也可能用到定時(shí)發(fā)送。 方法是:在ClassWizard中選上MessageMap卡,然后在Objects IDs選中CSCommTestDlg類,再在Messages框中選上WM_TIMER消息,單擊ADD_FUNCTION加入void CSCommTestDlg:OnTimer(UINT nIDEvent) 函數(shù),這個(gè)函數(shù)是放入“時(shí)間到”后要處理的代碼:void CSCommTestDlg:OnTimer(UINT nIDE
28、vent) / TODO: Add your message handler code here and/or call defaultOnButtonManualsend();CDialog:OnTimer(nIDEvent);再在在主對話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_AUTOSEND Caption: 自動(dòng)發(fā)送(周期1秒),再利用ClassWizard為其添加BN_CLICK消息處理函數(shù)void CSCommTestDlg:OnCheckAutosend():void CSCommTestDlg:OnCheckAutosend() / TODO: Add your control notification handler code herem_bAutoSend=!m_bAutoSend;if(m_bAutoSend)SetTimer(1,1000,NULL);/時(shí)間為1000毫秒elseKillTimer(1); /取消定時(shí)其中:m_bAutoSend為BOOL型變量,在CLASSVIEW中為CSCommTestDlg類加入,并在構(gòu)造函數(shù)中初始化:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人工耳蝸行業(yè)政策分析:人工耳蝸行業(yè)標(biāo)準(zhǔn)推動(dòng)人工耳蝸技術(shù)普及
- 2025年個(gè)人三項(xiàng)機(jī)制學(xué)習(xí)心得體會模版(3篇)
- 課題申報(bào)參考:緊密型醫(yī)聯(lián)體視角下大灣區(qū)老年中醫(yī)藥服務(wù)評價(jià)體系構(gòu)建與實(shí)證研究
- 二零二五年度集團(tuán)高層管理人員任期制競聘與續(xù)聘合同6篇
- 2025版小時(shí)工定期雇傭合同范本3篇
- 2025版土地征收及安置補(bǔ)償中介服務(wù)合同3篇
- 全新二零二五年度房地產(chǎn)銷售代理合同3篇
- 二零二五版企業(yè)內(nèi)部會計(jì)檔案安全保密服務(wù)協(xié)議3篇
- 2025年度文化創(chuàng)意產(chǎn)品開發(fā)與銷售合作協(xié)議范本4篇
- 二零二五年度廚具品牌設(shè)計(jì)創(chuàng)新合同4篇
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個(gè)體戶店鋪?zhàn)赓U合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- 【奧運(yùn)會獎(jiǎng)牌榜預(yù)測建模實(shí)證探析12000字(論文)】
- 魯濱遜漂流記人物形象分析
- 危險(xiǎn)廢物貯存?zhèn)}庫建設(shè)標(biāo)準(zhǔn)
- 多層工業(yè)廠房主體結(jié)構(gòu)施工方案鋼筋混凝土結(jié)構(gòu)
- 救生艇筏、救助艇基本知識課件
評論
0/150
提交評論