控件MSComm編寫串口通信程序_第1頁
控件MSComm編寫串口通信程序_第2頁
控件MSComm編寫串口通信程序_第3頁
控件MSComm編寫串口通信程序_第4頁
控件MSComm編寫串口通信程序_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論