【正文】
MFC application program which is based on C++ .The design realize the serial munication by using MSComm ActiveX serial munication control. This article introduces the ActiveX control technologyMSComm control. Finally, the design realizes serial munication between two puters.Because of the advantages of low cost and simple structure, serial munication is widely used by people. Realization of serial munication between two PC machines is the foundation of realizing more plex munication.Keywords:RS232 protocol。其中Windows平臺(tái)先進(jìn)的 ActiveX 技術(shù)對(duì)串口編程不再需要處理繁瑣的細(xì)節(jié)。RS232被定義為一種在低速率串行通信中增加通信距離的單端標(biāo)準(zhǔn)。 本文主要的研究內(nèi)容本文主要通過RS232標(biāo)準(zhǔn)串口協(xié)議,使用VC++編程語言實(shí)現(xiàn)串行通信,最終完成模擬終端的調(diào)試與仿真。RS232協(xié)議一共有兩個(gè)通道:一個(gè)主通道和一個(gè)輔助通道,很多情況下主要使用的是主通道。RS232串行接口屬于個(gè)人計(jì)算機(jī)(PC)及電信應(yīng)用領(lǐng)域中最為成功的串行數(shù)據(jù)標(biāo)準(zhǔn)。并行通信中所傳送數(shù)據(jù)的各位同時(shí)發(fā)送或接收。 串行通信參數(shù)串行通信在數(shù)據(jù)交換過程中,要對(duì)幾個(gè)重要的通信參數(shù)進(jìn)行設(shè)置,其中包括波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位等。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際的數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是7和8位。(4)奇偶校驗(yàn)位在串行通信中奇偶校驗(yàn)是一種簡單的檢錯(cuò)方式,奇偶校驗(yàn)位僅占一位,用于進(jìn)行奇校驗(yàn)和偶校驗(yàn),同時(shí)也可以無校驗(yàn)位。信息中含有若干個(gè)數(shù)據(jù)字符。 串口的調(diào)制 串口連接現(xiàn)在大多數(shù)計(jì)算機(jī)外用接口都是USB口,外用接口很少有串口的,并且現(xiàn)在的個(gè)人計(jì)算機(jī)的串口大多都是簡型的9針串口。圖24 USB轉(zhuǎn)RS232線的連接圖 串口調(diào)試實(shí)現(xiàn)個(gè)人計(jì)算機(jī)與外圍設(shè)備間的串行通信必須將個(gè)人計(jì)算機(jī)上的串口調(diào)通,驗(yàn)證一下個(gè)人計(jì)算機(jī)上的串口是否好用。第3章 CRC校驗(yàn) CRC校驗(yàn)原理 CRC校驗(yàn)碼的基本原理早期的通信由于受到外界各種因素的干擾,會(huì)造成傳輸、接收信號(hào)的不準(zhǔn)確。例如:代碼101011對(duì)應(yīng)的多項(xiàng)式為,而多項(xiàng)式為對(duì)應(yīng)的代碼1100101。當(dāng)所有數(shù)據(jù)位都這樣操作后,計(jì)算結(jié)束。分析了CRC校驗(yàn)原理、算法形式和算法的實(shí)現(xiàn)。平大家所見到的大多數(shù)Windows應(yīng)用程序均屬于這兩種框架。Windows提供的ActiveX控件利用它本身帶的MSComm ActiveX控件,只需要程序員編寫少量的代碼,就能輕松完成任務(wù),這樣就使得對(duì)串口編程不再需要處理煩瑣的細(xì)節(jié)。通信結(jié)束后,關(guān)閉打開的串口。然后在將基于對(duì)話框選中(如圖43),直接下一步即可,最后直到完成。最后為Access數(shù)據(jù)庫demo01建立數(shù)據(jù)源,利用ODBC驅(qū)動(dòng)。完整的主界面如圖47所示。 //讀取編輯框內(nèi)容 CUserRecordset m_user。 if(())//密碼用戶名不一致() { ()。 }(2)應(yīng)用程序初始化實(shí)現(xiàn)先顯示登陸界面后主界面,利用MFC中的模式對(duì)話框在初始化函數(shù)中來實(shí)現(xiàn),若串口是打開的則關(guān)閉串口,同時(shí)串口參數(shù)的設(shè)置也是在初始化函數(shù)中設(shè)置實(shí)現(xiàn)的。 //輸入方式為二進(jìn)制方式 (1024)。 = m_n。 //打開串口(1)。實(shí)現(xiàn)此模塊的程序流程圖如圖412所示,其功能代碼如下:開始N接收緩沖區(qū)內(nèi)是否有字符YYN是否以16進(jìn)制顯示將緩沖區(qū)內(nèi)字符給接收變量將緩沖區(qū)內(nèi)字符以16進(jìn)制給變量計(jì)算接收數(shù)據(jù)的CRC值更新編輯框內(nèi)容結(jié)束圖412 數(shù)據(jù)交換模塊流程圖代碼如下:void CMyDlg::OnOnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp。 //得到有效的數(shù)據(jù)長度 for(k=0。 //將字符以十六進(jìn)制方式送入臨時(shí)變量strtemp,加空格 else (%c,bt)。 //顯示完成后要自動(dòng)換行 m_receive+=temp。 if(()==IDOK) // 配置對(duì)話框“確定”按下,需要重新配置端口 { (FALSE)。 default:conf = 9600,。break。break。break。 int len=String2Hex(m_send,hexdata)。 ()。 (len/2)。 } i++。 senddata[hexdatalen]=(char)hexdata。(ch=39。F39。(ch=39。圖417 用戶名密碼正確(2)串口和參數(shù)的設(shè)置 登陸成功后跳轉(zhuǎn)到主界面,通信之前要設(shè)置可用的串口號(hào),設(shè)置串口號(hào)時(shí)若沒有選對(duì)串口號(hào),應(yīng)用程序會(huì)提示不可用的串口,直到設(shè)置了可用的串口號(hào)[24]。如圖421 所示:圖421 系統(tǒng)提示框 本章小結(jié)本章介紹了Windows編程下的MFC和串行通信控件MSComm,詳細(xì)的描述了利用MFC和串行通信控件MSComm實(shí)現(xiàn)兩臺(tái)PC機(jī)間的數(shù)據(jù)交換的設(shè)計(jì)概述、模塊功能、代碼實(shí)現(xiàn)等。應(yīng)用程序?qū)崿F(xiàn)了選擇串口、打開串口、關(guān)閉串口、發(fā)送接收數(shù)據(jù)等功能,同時(shí)又可通過應(yīng)用程序設(shè)置通信參數(shù)(包括波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位等)。用RS232協(xié)議實(shí)現(xiàn)兩臺(tái)PC機(jī)間的串行通信是實(shí)現(xiàn)主控機(jī)與外圍通信的前提,為以后實(shí)現(xiàn)更加復(fù)雜的設(shè)備間通信奠定了基礎(chǔ)。清華大學(xué)出版社,2007.[21] Adam Structures and Algorithms in C++ Third Edition[J].Thomson ,2(1):1347.[22] ++[M].北京:北京希望電子出版社,2001年,第16.[23] Stanley ,Josee LaJoie,Barbara . C++ Primer[J]. Addison Wesley/Pearson ,2006,3(6):2748.[24] David ,Scot Wingo,George Shepherd. Programming Visual C++[J]. 2001,2(5):3678.43 。使用此校驗(yàn)方法可以保證數(shù)據(jù)收發(fā)的準(zhǔn)確性。學(xué)習(xí)了一些數(shù)據(jù)庫的相關(guān)知識(shí),利用了數(shù)據(jù)庫中最簡單、最方便的Microsoft Office Access數(shù)據(jù)庫,通過ODBC建立數(shù)據(jù)源來實(shí)現(xiàn)用戶名密碼登錄驗(yàn)證功能。如圖420所示。} 程序測試首先,;其次,按以下步驟進(jìn)行測試:(1)登錄 輸入錯(cuò)誤密碼,程序提示“密碼、用戶名錯(cuò)誤,請重試!”如圖416所示。)amp。amp。)amp。 else hexdata=hexdata*16+lowhexdata。) {i++。 int hexdatalen=0。 if(()) m_crcs=crc16r(pC,le)。發(fā)送數(shù)據(jù)流程圖如圖414所示,代碼如下:void CMyDlg::OnSendbtn() { // TODO: Add your control notification handler code here UpdateData(true)。break。break。break。 case 2:conf = 9600,。 = m_jiaoyan。m_receive+=strtemp。k++) //將數(shù)組轉(zhuǎn)換為CString型變量 { char bt=*(char*)(rxdata+k)。 //讀緩沖區(qū)消息 safearray_inp=variant_inp。MSComm通信控件提供了一系列標(biāo)準(zhǔn)通信命令的接口,它可以建立串口連接,可以連接到其他通信設(shè)備(如Modem)還可以發(fā)送命令、進(jìn)行數(shù)據(jù)交換以及以及監(jiān)視通信中的干擾,從而可以用它創(chuàng)建全雙工 、事件驅(qū)動(dòng)的、高效實(shí)用的通信程序[22,23]。//以二進(jìn)制方式讀寫數(shù)據(jù) (1)。 CMyDlg md1。 (4)。 } } catch(CDBException* e)//try….catch是捕捉異常,即先執(zhí)行try若成功則結(jié)束 { //若失敗則執(zhí)行catch捕捉異常并輸出 eReportError()。,m_username,m_userpwd)。實(shí)現(xiàn)該功能的程序流程圖如圖49所示,實(shí)現(xiàn)該功能的程序代碼如下:開始N是否登錄Y輸入獲取信息N點(diǎn)擊退出按鈕密碼用戶名是否一致Y登錄成功,轉(zhuǎn)到主界面結(jié)束圖49 用戶名密碼登錄模塊流程圖void CMylogin::OnBnClickedOk(){ // TODO: Add your control notification handler code here OnOK()。圖46 登錄界面(2)主界面主界面是整個(gè)應(yīng)用程序的主體,大致可劃分為三部分,有接收區(qū)、發(fā)送區(qū)和設(shè)置區(qū)。其中使用DNS連接Access數(shù)據(jù)庫方法中,在定義DSN的時(shí)候,就已經(jīng)指定好了數(shù)據(jù)源需要的ODBC驅(qū)動(dòng)程序,也指定好了數(shù)據(jù)庫文件的實(shí)際路徑和名字,我們在程序中,只需要引用預(yù)先定義的數(shù)據(jù)源名DSN即可[20,21]。首先打開VC++,建立基于對(duì)話框的MFC應(yīng)用程序。開始調(diào)用初始化程序登錄界面登錄驗(yàn)證是否正確NY主界面選擇串口并打開設(shè)置參數(shù)Y是否選擇16進(jìn)制選擇16進(jìn)制N是否選擇CRC校驗(yàn)Y選擇CRCN輸入數(shù)據(jù)并發(fā)送數(shù)據(jù)發(fā)送完成NY關(guān)閉串口結(jié)束圖42 程序流程框圖使用此應(yīng)用程序時(shí),需要有正確的用戶名和密碼才能登錄到此軟件的主界面,登錄到主界面后,要想實(shí)現(xiàn)兩臺(tái)PC間的通信則需要選擇可用的串口號(hào)并且傳輸參數(shù)要一致,其中包括波特率、數(shù)據(jù)位、停止位、奇