版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
摘要隨著計算機(jī)技術(shù)的開展和推廣,利用串口進(jìn)行數(shù)據(jù)通訊在通訊領(lǐng)域中占有著重要的地位。為了方便和快速的通過Internet網(wǎng)絡(luò)訪問串口效勞器的串口,本課題把串口通信集成到Windows效勞,Windows效勞完成串口通信的根本操作。由文中詳細(xì)描述了串口通信效勞的原理和工作流程,還列舉出了相關(guān)的核心代碼。用流程圖的方式來描述了各個模塊的邏輯實現(xiàn)。串口通信效勞中采用平安隊列的機(jī)制來控制多線程訪問多串口。在開發(fā)中按照軟件工程的流程,從需求分析到概要設(shè)計從詳細(xì)設(shè)計到編碼,以及最后的測試,利用軟件工程的工具管理開發(fā)代碼和文檔。此外,還開發(fā)出了客戶端來測試該效勞工作是否正常。經(jīng)過測試效勞工作正常,能通過網(wǎng)絡(luò)連接到效勞器完成串口的通信。最后總結(jié)了開發(fā)和設(shè)計的缺乏之處,程序還有待進(jìn)一步完善。關(guān)鍵詞:串口通信;Windows效勞;平安隊列;多線程Abstract
With
the
developmentofcomputertechnology
and
topromote
theuse
of
serial
datacommunication
occupies
animportantpositionin
the
communications
field.
Inorderto
easilyandquickly
throughtheInternet
network
to
access
the
serial
server
serial,thesubjectof
serialcommunication
integrated
intotheWindows
services,Windows
services
tocomplete
thebasicoperation
of
the
serialcommunication.
By
the
paper
describesindetail
theprinciplesand
workflow
of
the
serialcommunication,
alsocited
the
corecode.
Flowchart
way
todescribe
the
logic
of
eachmodule.
Serialcommunication
services
usedin
the
security
queue
mechanismtocontrol
the
multi-threaded
access
to
morethan
serial.Development
in
accordance
with
the
softwareengineeringprocess,fromrequirements
analysisto
outlinedesign,
detaileddesign
to
coding,
and
finaltesting,theuseof
softwareengineering
toolsformanaging
thedevelopmentof
codeanddocumentation.
Alsodeveloped
a
client
totest
theservice
isworkingproperly.
After
the
normal
work
of
testingservices,throughthenetwork
toconnecttothe
servertocomplete
theserial
communication.
Concluded
the
developmentanddesignoftheinadequaciesof
the
program
remainstobe
furtherimproved.Keywords:serialcommunication;Windowsservice;
securityqueue;
multi-threaded目錄摘要 1Abstract 2第一章引言 51.1課題背景 51.2研究現(xiàn)狀 51.3研究目的及意義 6第二章開發(fā)技術(shù)簡介 7串行通信簡介 72.2vc++簡介 72.3USB接口技術(shù)簡介 92.4USB通信參考模型 92.5USB接口的通訊原理 102.5.1USB設(shè)備的接入 102.5.2USB設(shè)備的識別 10功能需求 112.6.1效勞器端 112.6.2串口通信 112.6.3客戶端 11設(shè)計方案 11效勞器端 11串口通信 122.7.3客戶端 12第三章系統(tǒng)程序設(shè)計 13串口通訊的程序設(shè)計 133.2通信協(xié)議 14第四章系統(tǒng)程序的主要功能 154.1程序功能 15參數(shù)設(shè)置功能 15參數(shù)顯示功能 15翻開串口功能 15關(guān)閉串口功能 15接收數(shù)據(jù)功能 15發(fā)送數(shù)據(jù)功能 15清空數(shù)據(jù)接收區(qū)功能 154清空數(shù)據(jù)發(fā)送區(qū)功能 15自動發(fā)送功能 15十六進(jìn)制顯示功能 15十六進(jìn)制發(fā)送功能 154.2程序運(yùn)行平臺 15總體設(shè)計 16程序類的說明 16模塊分析 18參數(shù)設(shè)置和顯示模塊 18翻開串口模塊 20發(fā)送數(shù)據(jù)模塊 21自動發(fā)送模塊 22接收數(shù)據(jù)模塊 22清空接收區(qū)模塊 23清空發(fā)送區(qū)模塊 23關(guān)閉串口模塊 24第五章系統(tǒng)測試 255.1系統(tǒng)測試 255.2測試目的 255.3測試結(jié)果 25總結(jié) 27參考文獻(xiàn) 28致謝 29第一章引言串口應(yīng)用是一種常見的應(yīng)用技術(shù)。無論是在一些工業(yè)控制領(lǐng)域還是其他行業(yè),這種應(yīng)用屢見不鮮。用于開發(fā)串口應(yīng)用的編程語言也有很多種,在諸多編程語言中,使用VisualC++進(jìn)行串口開發(fā)無疑是最好的方法。使用VisualC++進(jìn)行串口應(yīng)用開發(fā)有兩種可選方法:一是利用Microsoft提供的CMSCOMM控件進(jìn)行通訊,不過現(xiàn)在很多程序員都覺應(yīng)該放棄這種方式,因為這種方法雖然簡單快捷,但是靈活性差。二是利用WINAPI函數(shù)進(jìn)行編程,這種編程的難度高,要求掌握很多的API函數(shù),這種方法功能強(qiáng)大,針對不同的要求,有多種應(yīng)用方式。1.1課題背景隨著信息技術(shù)的迅速開展,數(shù)據(jù)采集和處理技術(shù)廣泛應(yīng)用于雷達(dá)、通信、遙測、遙感等領(lǐng)域。而在早期的計算機(jī)系統(tǒng)上通常使用串口或并口來發(fā)送數(shù)據(jù),每個接口都需要占用計算機(jī)內(nèi)部很多的資源,傳統(tǒng)的接口一般采用PCI總線或RS-232串行總線。PCI總線有較高的傳輸速率,可達(dá)132Mbit/s,也可以即插即用,但是它們的擴(kuò)充槽有限且插拔不方便;RS-232串行總線連接比擬方便,但是傳輸速率太慢,不易用于高速傳送數(shù)據(jù)和傳送大量數(shù)據(jù)。USB(通用串行總線)集中了PCI和RS-232串行總線的優(yōu)點,具有方便的即插即用和熱插拔特性以及較高的傳輸速率,因此,將USB技術(shù)應(yīng)用于數(shù)據(jù)采集是非常適宜的,可以到達(dá)數(shù)據(jù)采集系統(tǒng)的高速度處理。目前,USB已經(jīng)推出了其協(xié)議的2.0版本,速率高達(dá)480Mbit/s。計算機(jī)與外界進(jìn)行信息交換稱為通信。通常說的通信方式有并行通信和串行通信兩種。串行通信指的是一條信息的各位數(shù)據(jù)被逐位按順序傳送的通信方式。串行通信的特點是:數(shù)據(jù)位傳送,按位順序進(jìn)行,最少只需要一根傳輸線,雖然本錢低,但是傳送速度慢。串行通信的距離可以從幾米到幾千米。1.2研究現(xiàn)狀串口通訊目前流行的方法大概有三種:一是利用WINAPI函數(shù)進(jìn)行編程,這種編程的難度高,不好掌握,要求掌握很多的API函數(shù)。二是利用Microsoft提供的CMSCOMM控件進(jìn)行通訊,不過現(xiàn)在很多程序員都覺應(yīng)該放棄這種方式。三是利用現(xiàn)在網(wǎng)絡(luò)上面提供的一些串口通訊控件進(jìn)行編寫。這三種方法都沒有同Windows效勞聯(lián)系起來。1.3研究目的及意義本文研發(fā)了一套基于USB接口的數(shù)據(jù)采集系統(tǒng),整個系統(tǒng)的設(shè)計涉及到硬件、設(shè)備固件(Firmware)、USB設(shè)備驅(qū)動程序及客戶應(yīng)用軟件。傳統(tǒng)的數(shù)據(jù)采集系統(tǒng)大都采用標(biāo)準(zhǔn)的串行口和并行口作為數(shù)據(jù)傳輸接口,其局限性在于數(shù)據(jù)傳輸速率低、使用不方便.最新推出的USB2.0總線標(biāo)準(zhǔn)可以支持高達(dá)480Mbps的數(shù)據(jù)傳輸速率,并且具有支持即插即用、擴(kuò)展方便等優(yōu)點,因此用于大數(shù)據(jù)量的數(shù)據(jù)采集系統(tǒng)十分適宜.提出了一個基于Cypress公司USB2.0芯片的數(shù)據(jù)采集系統(tǒng)的設(shè)計方案,經(jīng)實驗,性能良好。第二章開發(fā)技術(shù)簡介不同的獨立系統(tǒng)通過線路連接起來交換數(shù)據(jù),就是通信,而構(gòu)成整個通信的線路那么稱為網(wǎng)絡(luò)。有復(fù)雜的通信網(wǎng)絡(luò)如互連網(wǎng)、電信網(wǎng)、衛(wèi)星網(wǎng),還有簡單的通信網(wǎng)絡(luò)如兩臺數(shù)據(jù)終端設(shè)備可通過串行接口如RS-232連接而成。RS-232C是美國電子工業(yè)協(xié)會(EIA)制定的關(guān)于數(shù)據(jù)終端通信裝置(如Modem)之間相互連接的標(biāo)準(zhǔn)接口,也是目前最常用的串行接口標(biāo)準(zhǔn)。RS-232串行接口總線適用范圍為通信設(shè)備之間距離不大于15m,傳輸速率最大為20KB/s。串行通信在發(fā)送時,把CPU送來的并行碼轉(zhuǎn)換成串行碼,逐位依次發(fā)送出去;在接收時,把發(fā)送過來的串行碼逐位接收,組裝成并行碼,并行地發(fā)送給CPU去處理。這種串行到并行的轉(zhuǎn)換功能當(dāng)然可以用軟件來實現(xiàn),但是這樣會占用CPU,所以常用硬件電路來實現(xiàn)這一功能,這種硬件電路叫做串行通信接口,即串口(SerialCommunicationPort)。PC機(jī)一般都有1個或2個串口,依次為COM1、COM2。這些串口提供了外部設(shè)備與計算機(jī)進(jìn)行數(shù)據(jù)傳輸和通信的通道。串口在系統(tǒng)控制的范疇中一直占有相當(dāng)重要的地位,不僅沒有因為時代的進(jìn)步而被淘汰,反而在規(guī)格和性能上越來越向極限挑戰(zhàn),成為每臺計算機(jī)上的必要配置之一。2.2vc++簡介VC++是在Windows平臺下構(gòu)建32位應(yīng)用程序的強(qiáng)大而又復(fù)雜的開發(fā)工具,是目前世界上使用最多的開發(fā)工具之一。VC++的應(yīng)用非常廣泛,從桌面應(yīng)用程序到效勞器端軟件,從系統(tǒng)軟件到應(yīng)用軟件,從單機(jī)程序到分布式應(yīng)用程序,從圖形圖像處理到游戲的開發(fā),VC++無所不在。有一句關(guān)于VC++的話流傳甚廣,說“偷懶的人學(xué)VB,聰明的人學(xué)iew/3297.htm"Delphi,真正的程序員學(xué)VC〞,其一方面說明了VC應(yīng)用的廣泛,另一方面也說明了學(xué)習(xí)VC是有一定難度的。[1]2004年,作者推出了一套講述VC++6.0編程的教學(xué)視頻,得到了廣闊學(xué)員的熱烈反響,許多學(xué)員通過這套視頻走上了VC++開發(fā)之路。有不少學(xué)員來信希望我能夠?qū)⒁曨l中的內(nèi)容著書出版,讓更多的人受益,然而由于自身瑣事較多,一直未能如愿。后來在博文視點公司郭立總編的介紹下,有幸結(jié)識了余安萍,并由她執(zhí)筆將視頻中的內(nèi)容整理出書。正是由于余安萍和郭立女士所付出的勞動,才有了本書的出版,在此向她們表示衷心的感謝。本書讀者本書讀者群包括:掌握了C語言,想進(jìn)一步學(xué)習(xí)Windows編程的讀者。學(xué)習(xí)VC++多年,但始終沒有真正入門的讀者。正在從事VC++開發(fā)的初級程序員。有一定VC++開發(fā)經(jīng)驗,想要系統(tǒng)地學(xué)習(xí)VC++的讀者。在本書的配套光盤中,提供了一套完整的VC++教學(xué)視頻,以幫助讀者更快、更好地掌握VC++編程。本書的內(nèi)容組織本書在內(nèi)容的組織上循序漸進(jìn)、由淺入深;在知識的介紹上,從內(nèi)到外、從原理到實踐。第1章幫助讀者掌握Windows平臺下程序運(yùn)行的內(nèi)部機(jī)制。第2章幫助讀者復(fù)習(xí)C++中的重要知識,為后續(xù)知識的學(xué)習(xí)打下良好的根底。第3章重點剖析MFC框架程序的運(yùn)行脈絡(luò),并與第1章的知識做對照,為讀者徹底掃清學(xué)習(xí)MFC的迷霧。相信通過這章的學(xué)習(xí),很多以前學(xué)過MFC的讀者都會有一種恍然大悟的感覺。前三章可以歸為根底局部,從第4章開始就是實際應(yīng)用開發(fā)的講解了,包括繪圖、文本、菜單、對話框、定制程序外觀、圖形保存和重繪、文件和注冊表例子。本書的講解理論結(jié)合實際,選用的例子和代碼具有相當(dāng)?shù)拇硇院蛯嵱脙r值,我和我的學(xué)員曾經(jīng)在實際開發(fā)工程的過程中就直接使用過很多書中的代碼。本書的實例程序作者在編寫本書時,使用的操作系統(tǒng)是Windows2000ServicePack4,開發(fā)工具是VC++6.0SP5,MSDN是2001年1月版的〔提示:與VC++6.0匹配的MSDN截止到2001年10月版,之后的版本都與.NET匹配,可能與本書使用的版本有所不同〕。本書所有的實例程序都在上述環(huán)境中運(yùn)行正常。提示:由于QQ運(yùn)行時占用了多個端口,可能與本書例子中的網(wǎng)絡(luò)程序使用的端口沖突,在運(yùn)行本書例子中的網(wǎng)絡(luò)程序時,如果出錯,請更換程序中的端口號,或者關(guān)閉QQ后再運(yùn)行程序。學(xué)習(xí)建議配套光盤提供的視頻課數(shù)與本書的章數(shù)是一一對應(yīng)的,建議讀者先看視頻,有一個初步印象后再看相應(yīng)的章節(jié),這樣能夠更快、更好地掌握VC++編程。在學(xué)習(xí)本書時,建議讀者多動腦〔想想為什么〕,多動手〔將知識轉(zhuǎn)換為自己的〕。在理解的前提下,獨立地編寫出書中每章的例子程序,可以作為是否掌握本章內(nèi)容的一個考核。由于作者的水平有限,錯誤和疏漏之處在所難免,歡送廣闊技術(shù)專家和讀者指正。信、ActiveX控件、動態(tài)鏈接庫、HOOK編程等多個主題,并且每一章都有一個完整的操作、網(wǎng)絡(luò)編程、多線程、進(jìn)程間通2.3USB接口技術(shù)簡介USB的全稱為UniversalSearialBus,即通用串行總線。與RS-232類似,USB總線也是一種串行外圍設(shè)備連接的總線形式,它是1995年由Microsoft、Compaq、IBM等公司聯(lián)合制定的一種新的PC串行通信協(xié)議,從推出之日起就得到了各大廠商的廣泛支持,得以不斷完善和開展,目前USB協(xié)議的最新版本已經(jīng)到達(dá)了2.0。USB總線作為一種新的串行總線,不僅在傳輸速度上得到了極大的提高,同時還具有接口簡單、真正的即插即用、傳輸線供電、多設(shè)備級聯(lián)等特性。USB總線的成功推出,對外設(shè)的接口產(chǎn)生了廣泛的影響,目前使用USB總線接口的如鍵盤、鼠標(biāo)、閃存、攝像頭等外圍設(shè)備在市場上已廣泛存在。2.4USB通信參考模型實現(xiàn)USB設(shè)備與USB主機(jī)之間的通信主要有兩種方法:一種是USB設(shè)備利用簡單的點對點串行連接與主機(jī)的應(yīng)用程序進(jìn)行通信;另一種是USB主機(jī)上的應(yīng)用程序通過驅(qū)動程序與USB設(shè)備進(jìn)行通信。USB通信參考模型分為3層,如下圖。最底層為總線接口層,提供主機(jī)與設(shè)備之間物理、信號和包級的連接;中間為設(shè)備層,提供USB系統(tǒng)軟件執(zhí)行通用的USB操作;最上層為功能層,通過匹配的應(yīng)用軟件實現(xiàn)設(shè)備的具體功能。一般而言,每個USB設(shè)備可以有一個或多個配置〔configuration〕,設(shè)備的每個配置中都含有一個或更多的接口〔interface〕,接口指出軟件應(yīng)該怎樣訪問硬件,另外,接口一般都有替換設(shè)置〔alternatesetting〕以適應(yīng)不同的帶寬要求。設(shè)備的接口又包含一個或多個端點〔endpoint〕,端點是作為通信管道〔pipe〕的一個終點。端點類型直接影響著USB數(shù)據(jù)的傳輸類型,它有四種:控制〔Control〕、批量〔Bulk〕、中斷〔Interrupt〕和同步〔Isochronous〕,給定類型的端點總是使用對應(yīng)類型的傳輸方式。端點和管道的區(qū)別:從用戶角度看,端點是可以直接進(jìn)行IO數(shù)據(jù)流操作的設(shè)備中的根本單位,它是一個USB設(shè)備唯一可以確認(rèn)的局部,是主機(jī)和設(shè)備之間通信流的終點。管道是一個端點與主機(jī)客戶程序進(jìn)行IO操作時使用的中介,也可以說它是主機(jī)和一個設(shè)備端點之間的信息連接,是數(shù)據(jù)流動的路徑。管道和端點是一一對應(yīng)的。端點側(cè)重于靜態(tài)的概念,而管道那么側(cè)重于動態(tài)的概念。USB總線接口包括USB主控制器和根集線器,其中USB主控制器負(fù)責(zé)處理主機(jī)與設(shè)備之間電氣和協(xié)議層的互連,根集線器那么提供USB設(shè)備連接點。USB系統(tǒng)使用USB主控制器來管理主機(jī)和USB設(shè)備之間的數(shù)據(jù)傳輸,另外它也負(fù)責(zé)管理USB資源,如帶寬等。應(yīng)用軟件是不能直接訪問USB設(shè)備硬件的,而是通過USB系統(tǒng)軟件和USB總線接口與USB設(shè)備進(jìn)行交互。2.5USB接口的通訊原理USB設(shè)備的接入USB接口中的+5V電源不但可以為外接設(shè)置提供小電流供給,并且還起著檢測功能。當(dāng)USB設(shè)置插入USB接口后,主機(jī)的+5V電源就會通過USB邊線與USB設(shè)備相通。USB外設(shè)的控制芯片會通過兩只10K的電阻來檢查USB設(shè)備是否接入了主機(jī)的USB端口。如果這兩個引腳一個為高電平,一個為低電平時就表示USB外設(shè)已經(jīng)正常確連入USB接口,這時外設(shè)的控制芯片開始工作,并通過DATA+,DATA-向外送出數(shù)據(jù)。這時主機(jī)接收數(shù)據(jù)后,就會提示發(fā)現(xiàn)新硬件,并開始安裝新硬件驅(qū)動。2.5.2USB設(shè)備的識別在USB外設(shè)向外送出數(shù)據(jù)時,其中就包括設(shè)備自身的設(shè)備名及型號等相關(guān)參數(shù),主機(jī)就是根據(jù)這些信息在顯示器上顯示出所發(fā)現(xiàn)的新硬件的名稱型號的。多說一點:如果現(xiàn)在閃存的價格降得更低時,我們就可以把掃描儀,打印機(jī),數(shù)碼相機(jī)的驅(qū)動程序存在設(shè)備內(nèi)部。當(dāng)主機(jī)需要驅(qū)動程序時,直接從設(shè)備內(nèi)部讀取就可以了,也就不再需要驅(qū)動光盤和安裝驅(qū)動等繁瑣手續(xù)了。功能需求效勞器端串口效勞器上的串口通信效勞翻開一個固定的端口,監(jiān)聽客戶端的Socket連接。假設(shè)檢測到客戶端的連接那么為客戶端分配一個串口,供客戶端發(fā)送數(shù)據(jù)??蛻舳送谄鲄f(xié)商好串口的配置信息,那么客戶端發(fā)送的數(shù)據(jù)效勞器直接發(fā)送到串口,通過串口發(fā)送除去。假設(shè)效勞器檢測到串口接受到數(shù)據(jù),者直接把接收到的數(shù)據(jù)發(fā)送到客戶端。即效勞器中轉(zhuǎn)串口和客戶端的數(shù)據(jù)。這樣一來客戶端就好似直接鏈接到串口效勞器上的串口,與效勞器串口相連接的外設(shè)進(jìn)行通信。串口效勞器具有很多個串口形成一個串口池。串口池中的串口連接著不通或相同的外設(shè),客戶通過Internet聯(lián)網(wǎng)的方式鏈接到效勞器,同效勞器的外設(shè)通信。串口通信串口通信效勞管理整個串口池。效勞程序?qū)Υ诔剡M(jìn)行合理管理和分配到客戶端的連接請求,效勞器會從串口池中選取一個串口供客戶端使用。當(dāng)客戶端通信完畢,斷開同效勞器的鏈接時,效勞器端回收這個串口,以供其他客戶端使用。在分配串口的時候不能讓不同用戶使用同一串口,讓每一個客戶端獨立的使用某一個串口。當(dāng)客戶端鏈接上效勞器后,效勞器為客戶端分配一個串口供客戶端使用。這時候串口通信需要被實現(xiàn)。包括串口的翻開,串口參數(shù)設(shè)置,讀寫數(shù)據(jù)到串口以及關(guān)閉串口。,效勞器端接收客戶端客戶端的需求相對簡單。連接效勞器的客戶端通過指定效勞器地址和端口號連接到效勞器,設(shè)置串口的通信參數(shù),同效勞器通信??梢园l(fā)送數(shù)據(jù)到效勞器和接受效勞器發(fā)送回來的數(shù)據(jù),并顯示接收到的數(shù)據(jù)。通信完畢時斷開通效勞器的連接。設(shè)計方案效勞器端效勞器端使用WindowsNT效勞來提供效勞,此效勞監(jiān)聽某一端口,等待客戶端的鏈接。為客戶端提供效勞。使用WindowsAPI自己定義效勞的行為。效勞管理串口池,效勞啟動初始化時,檢測效勞器的串口,串口統(tǒng)一進(jìn)入一個全局平安隊列。當(dāng)客戶端發(fā)起連接請求時,效勞器開啟一個線程來處理該客戶的請求,直到客戶端斷開連接,線程退出執(zhí)行。在線程中,從平安隊列的隊頭出隊列一個串口,該串口分配給該客戶使用,客戶端首先設(shè)置該串口的通信參數(shù),否那么按照默認(rèn)串口通信參數(shù)進(jìn)行通信。如果有多個客戶同時連接效勞器那么效勞器同時開啟多個線程來處理多個用戶的連接請求。分配給客戶端使用的串口接收外設(shè)發(fā)來數(shù)據(jù)時,效勞器通過連接的Socket發(fā)送到客戶端,客戶端處理接收到的數(shù)據(jù)。效勞器端接收到客戶端發(fā)來的數(shù)據(jù)時,把接收到的數(shù)據(jù)發(fā)送到分配給這個客戶端的串口,通過串口發(fā)送到外設(shè),外設(shè)處理接收到的數(shù)據(jù)從而做出反響,完成通信。串口通信使用WindowsAPI的串口操作函數(shù),封裝成串口類,來處理串口通信。此串口類統(tǒng)一操作串口池里的串口,根據(jù)不同的串口號來操作這些串口。從而到達(dá)每一個客戶的使用一個串口,每個串口都是相同的操作。可以根據(jù)不同的通信設(shè)備為不同的串口設(shè)置不同的通信參數(shù)。串口通信負(fù)責(zé)處理串口的參數(shù)設(shè)置,串口的翻開和關(guān)閉,數(shù)據(jù)的讀和寫,即寫數(shù)據(jù)到串口和從串口讀數(shù)據(jù)。翻開串口時,效勞處理此客戶的線程開啟另一線程監(jiān)聽串口是否有數(shù)據(jù)接收,當(dāng)發(fā)現(xiàn)有數(shù)據(jù)來的時候,串口讀出該數(shù)據(jù)通過Socket發(fā)送到客戶端。2.7.3客戶端客戶端使用MFC編程創(chuàng)立基于對話框的應(yīng)用程序。該程序使用WindowsSocket建立同指定效勞器的數(shù)據(jù)連接。當(dāng)建立好鏈接后,可設(shè)置串口的通信參數(shù),如:波特率,數(shù)據(jù)位,奇偶校驗,停止位等。設(shè)置好串口的通信參數(shù)后就可以同效勞器分配給的串口鏈接的外設(shè)通信了。發(fā)送數(shù)據(jù)到效勞器的串口,和接收效勞器發(fā)送回來的數(shù)據(jù)。第三章系統(tǒng)程序設(shè)計通信是指不同的獨立系統(tǒng)利用線路互相交換數(shù)據(jù),它的主要目的是將數(shù)據(jù)從一端傳送到另一端,實現(xiàn)數(shù)據(jù)的交換。在現(xiàn)代工業(yè)控制中,通常采用計算機(jī)作為上位機(jī)與下層的實時控制與監(jiān)測設(shè)備進(jìn)行通訊?,F(xiàn)場數(shù)據(jù)必須通過一個數(shù)據(jù)收集器傳給上位機(jī),同樣上位機(jī)向現(xiàn)場設(shè)備發(fā)命令也必須通過數(shù)據(jù)收集器。串行通信因其結(jié)構(gòu)簡單、執(zhí)行速度快、抗干擾能力強(qiáng)等優(yōu)點,已被廣泛應(yīng)用于數(shù)據(jù)采集和過程控制等領(lǐng)域。在我們設(shè)計的整個系統(tǒng)的工作過程中,計算機(jī)要向步進(jìn)電機(jī)系統(tǒng)發(fā)送數(shù)據(jù)和指令,這就需要通訊系統(tǒng)負(fù)責(zé)計算機(jī)和步進(jìn)驅(qū)動系統(tǒng)的通信,即計算機(jī)與單片機(jī)之間的通訊。我們設(shè)計的這套通信系統(tǒng)包括發(fā)送端、接收端、轉(zhuǎn)換數(shù)據(jù)的接口及傳送數(shù)據(jù)的通道。在軟件設(shè)計中,采用匯編和C++分別對單片機(jī)和計算機(jī)進(jìn)行編程。匯編語言可直接應(yīng)用CPU的硬件特性進(jìn)行編程,它具有程序設(shè)計快、可讀性好、代碼轉(zhuǎn)換質(zhì)量高等特點,我們將其用于單片機(jī)的編程;而采用C++Builder編寫上位機(jī)界面軟件具有界面友好,可多任務(wù)運(yùn)行的優(yōu)點,并且可以有選擇地單獨向某下位機(jī)發(fā)送信息。串口通訊的選擇串行通訊的標(biāo)準(zhǔn)接口存在多種,如RS-232,RS-485,USB接口,IEEE-1394等,它們各有特點,應(yīng)用的領(lǐng)域也各有側(cè)重。RS-485在傳輸數(shù)據(jù)時抗噪聲干擾的能力比擬強(qiáng),常用于工業(yè)生產(chǎn)領(lǐng)域;USB接口和IEEE-1394傳輸速度較快,但有些計算機(jī)和操作系統(tǒng)不支持這樣的接口;RS-232是PC機(jī)與通信工業(yè)中應(yīng)用最廣泛的一種串行接口;RS-232被定義為一種在低速率串行通訊中增加通訊距離的單端標(biāo)準(zhǔn)。綜合其性能、價格和實用性,對該系統(tǒng)而言,利用RS-232進(jìn)行端口通訊最為適宜。RS-232是現(xiàn)代計算機(jī)必備的接口,通常含有COM1和COM2兩個端口,一般計算機(jī)將COM1口以9引腳的接頭接出。新一代的計算機(jī)均以9引腳的接頭(DB9)接出所有的RS-232通信端口。為了實現(xiàn)系統(tǒng)的可靠實時性傳輸,本系統(tǒng)在設(shè)計的過程中采用了三線制接法,即僅采用RS-232端口的地端、接收數(shù)據(jù)和發(fā)送數(shù)據(jù)三引腳與外部相連,接線如圖3.1所示。 圖3.1RS-232端接口串行通信程序設(shè)計包括3方面,一方面是單片機(jī)的通信程序,另一方面為計算機(jī)的通信程序,此外為了保證通信數(shù)據(jù)的可靠性,在編寫程序之前,還要為其雙方制定通信協(xié)議。3.2通信協(xié)議(1)串行通信端口設(shè)置為1,波特率設(shè)置為2400bps,數(shù)據(jù)位數(shù)為8位。(2)如果單片機(jī)正在采集數(shù)據(jù),收到數(shù)據(jù)中第一個字節(jié)為48或49,那么進(jìn)行數(shù)據(jù)分配,否那么判定數(shù)據(jù)流是不是為“STOP〞,假設(shè)是那么向電機(jī)發(fā)送停止指令。(3)計算機(jī)發(fā)送給單片機(jī)的數(shù)據(jù)包大小為6個字節(jié),第一個字節(jié)表示轉(zhuǎn)向,當(dāng)計算機(jī)發(fā)送“1〞時,電機(jī)正轉(zhuǎn),發(fā)送“0〞時電機(jī)反轉(zhuǎn)。第二、三、四字節(jié)表示轉(zhuǎn)速,輸入數(shù)據(jù)范圍為0~16777215。后2個字節(jié)表示旋轉(zhuǎn)角度,輸入數(shù)據(jù)范圍為0~65535。數(shù)據(jù)格式如圖3.2所示。(4)數(shù)據(jù)接收完畢,單片機(jī)退出中斷,并向計算機(jī)發(fā)送字符“1〞圖3.2數(shù)據(jù)傳送格式第四章系統(tǒng)程序的主要功能4.1程序功能設(shè)置和修改串口通信參數(shù),包括端口,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。 顯示當(dāng)前串口通信參數(shù),包括端口號,波特率,奇偶校驗位,數(shù)據(jù)位,停止位。參數(shù)設(shè)置后,才能翻開串口,實現(xiàn)通信。關(guān)閉串口功能關(guān)閉串口,停止通信。接收數(shù)據(jù)功能能夠進(jìn)行單個或多個數(shù)據(jù)的接收和顯示。發(fā)送數(shù)據(jù)功能能夠進(jìn)行單個或多個數(shù)據(jù)的發(fā)送。刪除接收區(qū)所有數(shù)據(jù)。去除發(fā)送區(qū)內(nèi)所有數(shù)據(jù)。能把發(fā)送區(qū)內(nèi)的數(shù)據(jù)每2s自動發(fā)送。在接收區(qū)只顯示十六進(jìn)制數(shù),每兩個字符一個空格。只能發(fā)送十六進(jìn)制數(shù),不能發(fā)送非十六進(jìn)制數(shù)。4.2程序運(yùn)行平臺Visualstudio2021具體操作如下:〔1〕新建MSComm工程,選擇MFC應(yīng)用程序,應(yīng)用程序類型選擇“基于對話框〞,生成的類中選擇“CMSCommDlg〞;〔2〕為MSComm工程添加新建一個Dialog設(shè)置對話框;〔3〕加載MSComm控件,添加相應(yīng)的源程序,加載必要的控件;〔4〕編寫程序代碼,再編譯,鏈接,調(diào)試,執(zhí)行等,生成應(yīng)用程序。主函數(shù)參數(shù)設(shè)置和顯示翻開和關(guān)閉串口發(fā)送數(shù)據(jù)接收數(shù)據(jù)清空接收區(qū)清空發(fā)送區(qū)主函數(shù)參數(shù)設(shè)置和顯示翻開和關(guān)閉串口發(fā)送數(shù)據(jù)接收數(shù)據(jù)清空接收區(qū)清空發(fā)送區(qū)classCMSCommDlg:publicCDialog{//構(gòu)造public: CMSCommDlg(CWnd*pParent=NULL); //標(biāo)準(zhǔn)構(gòu)造函數(shù)//對話框數(shù)據(jù) intOnCreate(LPCREATESTRUCTlpCreateStruct); intString2Hex(CStringstr,CByteArray&senddata); charConvertHexChar(charch); enum{IDD=IDD_MSCOMM_DIALOG}; protected: virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDV支持//實現(xiàn)protected: HICONm_hIcon; //生成的消息映射函數(shù) virtualBOOLOnInitDialog(); afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam); afx_msgvoidOnPaint(); afx_msgHCURSOROnQueryDragIcon(); DECLARE_MESSAGE_MAP()public: CMSCommm_mscom; //聲明m_mscomm變量為CMSComm類型 CStringm_recv; //接收區(qū) CStringm_send; //發(fā)送區(qū) CSetupDlgmySetupDlg; //聲明設(shè)置對話框 BYTEmyCom; //串口號碼 CStringmyParity; //奇偶校驗類型 CStringmyBaudRate; //通信波特率 CStringmyData; //數(shù)據(jù)位 CStringmyStop; //停止位 DECLARE_EVENTSINK_MAP() voidOnCommMscomm1(); afx_msgvoidOnBnClickedSendbutton(); afx_msgvoidOnBnClickedClearsend(); afx_msgvoidOnBnClickedClearRecv(); afx_msgvoidOnBnClickedSetupcom(); afx_msgvoidOnBnClickedOpencom(); afx_msgvoidOnBnClickedClosecom(); afx_msgvoidOnTimer(UINT_PTRnIDEvent); afx_msgvoidOnBnClickedCheckAutosend(); CButtonm_Opencom; //翻開串口按鈕 CButtonm_Closecom; //關(guān)閉串口按鈕 CButtonm_Setupcom; //設(shè)置按鈕 CStringm_Para; //通信參數(shù)顯示 CButtonm_ClearRecv; //清空接收按鈕 CButtonm_ClearSend; //清空發(fā)送按鈕 CButtonm_SendText; //發(fā)送按鈕 CButtonm_ctrlHexSend; //十六進(jìn)制發(fā)送 CButtonm_ctrlHexDisplay; //十六進(jìn)制顯示 BOOLm_bAutoSend; //自動發(fā)送};單擊主界面中的【設(shè)置】按鈕,將彈出“設(shè)置〞對話框,如圖7.1所示,可以在該對話框中設(shè)置串口的通信參數(shù)。該命令的代碼如下:voidCMSCommDlg::OnBnClickedSetupcom(){ //TODO:在此添加控件通知處理程序代碼 m_Opencom.EnableWindow(TRUE); AfxMessageBox(_T("請設(shè)置通信參數(shù)并翻開串口以實現(xiàn)通信!")); CStringstrStatus,strTemp; doubledblBaund; intmdata,mstop; if(mySetupDlg.DoModal()==IDOK) { myCom=mySetupDlg.m_com+1; //求取串口編號 if(mySetupDlg.m_BaudRate<8) { dblBaund=pow(2,(double)mySetupDlg.m_BaudRate); //求取波特率 dblBaund=300*dblBaund; } else { switch(mySetupDlg.m_BaudRate) { case8: dblBaund=43000; break; case9: dblBaund=56000; break; case10: dblBaund=57600; break; case11: dblBaund=115200; break; case12: dblBaund=128000; break; case13: dblBaund=256000; break; } } strStatus.Format(_T("%.0f"),dblBaund); myBaudRate=strStatus; switch(mySetupDlg.m_Parity) //求取奇偶校驗位 { case0: { myParity="E"; break; } case1: { myParity="M"; break; } case2: { myParity="N"; break; } case3: { myParity="O"; break; } case4: { myParity="S"; break; } } mdata=4+mySetupDlg.m_Data; //求取數(shù)據(jù)位 strStatus.Format(_T("%d"),mdata); myData=strStatus; mstop=1+mySetupDlg.m_Stop; //求取停止位 strStatus.Format(_T("%d"),mstop); myStop=strStatus; strStatus="COM"; strTemp.Format(_T("%d"),myCom); strStatus+=strTemp; strStatus+=","; strStatus+=myBaudRate; strStatus+="bit/s,"; strStatus+=myParity; strStatus+=","; strStatus+=myData; strStatus+=","; strStatus+=myStop; m_Para=strStatus; //求取靜態(tài)文本顯示內(nèi)容 UpdateData(false); }}單擊主界面中的【翻開串口】按鈕,如果參數(shù)已設(shè)置好,將翻開指定的串口,提示“串口翻開成功!〞,如圖7.2所示,該命令的代碼如下:voidCMSCommDlg::OnBnClickedOpencom(){ //TODO:在此添加控件通知處理程序代碼 CStringstrPara; //串口參數(shù) m_mscom.put_CommPort(myCom); //指定串口號mycom strPara=myBaudRate; strPara+=","; strPara+=myParity; strPara+=","; strPara+=myData; strPara+=","; strPara+=myStop; //AfxMessageBox(strPara); m_mscom.put_Settings(strPara); //通信參數(shù)設(shè)置 m_mscom.put_InBufferSize(1024); //指定接收緩沖區(qū)大小 m_mscom.put_InBufferCount(0); //清空接收緩沖區(qū) m_mscom.put_InputMode(1); //設(shè)置數(shù)據(jù)獲取方式 m_mscom.put_InputLen(0); //設(shè)置每次讀取長度 m_mscom.put_RThreshold(1); //oncomm事件門限值 m_mscom.put_PortOpen(1); //翻開串口 m_Opencom.EnableWindow(false); //使翻開串口按鈕無效 m_Closecom.EnableWindow(true); //使關(guān)閉串口按鈕生效 m_SendText.EnableWindow(true); m_Setupcom.EnableWindow(false); //使設(shè)置按鈕無效 AfxMessageBox(_T("串口翻開成功!"));}單擊主界面中的【發(fā)送】按鈕,將把發(fā)送區(qū)的內(nèi)容發(fā)送到串口調(diào)試助手的接收區(qū),如果【十六進(jìn)制發(fā)送】選中,那么只能發(fā)送0~F,如圖7.3(a)(b)所示,該命令的代碼如下:voidCMSCommDlg::OnBnClickedSendbutton(){ //TODO:在此添加控件通知處理程序代碼 UpdateData(true); if(m_ctrlHexSend.GetCheck()) { CByteArrayhexdata; intlen=String2Hex(m_send,hexdata);//此處返回的len可以用于計算發(fā)送了多少個十六進(jìn)制數(shù) m_mscom.put_Output(COleVariant(hexdata));//發(fā)送十六進(jìn)制數(shù)據(jù) } else { CByteArraysendArr; WORDwLength; wLength=m_send.GetLength(); sendArr.SetSize(wLength); for(inti=0;i<wLength;i++) { sendArr.SetAt(i,m_send.GetAt(i)); } m_mscom.put_Output(COleVariant(m_send)); }}當(dāng)【自動發(fā)送】選中時,系統(tǒng)將自動每隔2s發(fā)送一次數(shù)據(jù),如圖7.4(a)(b)所示,程序代碼如下:voidCMSCommDlg::OnTimer(UINT_PTRnIDEvent){ //TODO:在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 OnBnClickedSendbutton(); CDialog::OnTimer(nIDEvent);}voidCMSCommDlg::OnBnClickedCheckAutosend(){ //TODO:在此添加控件通知處理程序代碼 m_bAutoSend=!m_bAutoSend; if(m_bAutoSend) { SetTimer(1,2000,NULL);//時間為毫秒 } else {KillTimer(1);//取消定時}}發(fā)送方發(fā)送數(shù)據(jù)后,在接受區(qū)顯示對方的發(fā)送內(nèi)容,如果【十六進(jìn)制顯示】選中,那么將只顯示十六進(jìn)制數(shù)0~F,如圖7.5(a)(b)所示,該命令的代碼如下:voidCMSCommDlg::OnCommMscomm1(){ //TODO:在此處添加消息處理程序代碼 UpdateData(true); VARIANTvariant_inp; COleSafeArraysafearray_inp; longi=0; intlen; charrxdata[2048]; CStringtmp; switch(m_mscom.get_CommEvent()) { case2: //表示接收緩沖區(qū)內(nèi)有字符 { variant_inp=m_mscom.get_Input(); safearray_inp=variant_inp; len=safearray_inp.GetOneDimSize(); for(i=0;i<len;i++) safearray_inp.GetElement(&i,&rxdata[i]);//轉(zhuǎn)換為BYTE型數(shù)組 for(i=0;i<len;i++) ///將數(shù)組轉(zhuǎn)換為Cstring型變量 { BYTEbt=*(char*)(rxdata+i);//字符型 if(m_ctrlHexDisplay.GetCheck()) { tmp.Format(_T("%02X"),bt);//將字符以十六進(jìn)制方式送入臨時變量tmp存放,注意這里參加一個空隔 m_recv+=tmp;//參加接收編輯框?qū)?yīng)字符串 } } if(!m_ctrlHexDisplay.GetCheck()) rxdata[i]='\0'; } if(!m_ctrlHexDisplay.GetCheck())m_recv+=rxdata; UpdateData(false); break; default: break; }}單擊主界面中的【清空接收區(qū)】按鈕,將清空接收區(qū)內(nèi)容,提示“清空接收區(qū)內(nèi)容!〞如圖7.6所示,該命令的代碼如下:voidCMSCommDlg::OnBnClickedClearRecv(){ //TODO:在此添加控件通知處理程序代碼 m_recv=""; UpdateData(FALSE); AfxMessageBox(_T("清空接收區(qū)成功!"));}單擊主界面中的【清空發(fā)送區(qū)】按鈕,將清空發(fā)送區(qū)內(nèi)容,提示“清空發(fā)送區(qū)內(nèi)容!〞如圖7.7所示,該命令的代碼如下:voidCMSCommDlg::OnBnClickedClearsend(){ //TODO:在此添加控件通知處理程序代碼 m_send=""; UpdateData(FALSE); AfxMessageBox(_T("清空發(fā)送區(qū)成功!"));}單擊主界面中的【關(guān)閉串口】按鈕,將關(guān)閉串口,提示“串口關(guān)閉成功!〞,如圖7.8所示,該命令的代碼如下:voidCMSCommDlg::OnBnClickedClosecom(){ //TODO:在此添加控件通知處理程序代碼 m_mscom.put_PortOpen(0); //關(guān)閉串口 AfxMessageBox(_T("串口關(guān)閉成功!")); m_Opencom.EnableWindow(true); //使翻開串口按鈕生效 m_Closecom.EnableWindow(false); //使關(guān)閉串口按鈕無效 m_Setupcom.EnableWindow(true);
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年中國水壺市場調(diào)查研究報告
- 2025年度高科技辦公場地租賃合同及智能化使用指南2篇
- 2025版蔬菜保鮮技術(shù)研發(fā)合同2篇
- 2025版軟件開發(fā)企業(yè)源代碼保密服務(wù)協(xié)議2篇
- 2024年玉米種子進(jìn)出口合同3篇
- 材料主題課程設(shè)計
- 2025版電梯門套安裝與智能化升級服務(wù)合同3篇
- 電磁爐課程設(shè)計
- 2024年電子交易信用保證合同2篇
- 2025至2030年中國蜂巢布包頭拖鞋行業(yè)投資前景及策略咨詢研究報告
- 《格林童話》課外閱讀試題及答案
- 重型再生障礙性貧血造血干細(xì)胞移植治療課件
- 私立民辦高中學(xué)校項目投資計劃書
- 《電機(jī)與電氣控制技術(shù)》教學(xué)設(shè)計及授課計劃表
- “銷售技巧課件-讓你掌握銷售技巧”
- 2019北師大版高中英語選修一UNIT 2 單詞短語句子復(fù)習(xí)默寫單
- 房地產(chǎn)項目保密協(xié)議
- 汽車配件產(chǎn)業(yè)園項目商業(yè)計劃書
- 2023年云南省初中學(xué)業(yè)水平考試 物理
- 【安吉物流股份有限公司倉儲管理現(xiàn)狀及問題和優(yōu)化研究15000字(論文)】
- 2023年污水站設(shè)備維修 污水處理廠設(shè)備維護(hù)方案(五篇)
評論
0/150
提交評論