




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《軟件系統(tǒng)結構與開發(fā)方法》教案主講:前言自從老師于2008年在仰恩大學開辦計算機專業(yè)試點班以來,斷斷續(xù)續(xù)到今年2012級已經是試點班第三屆的最后一個學年。對照國務院發(fā)出的指示,我認為《軟件系統(tǒng)結構與開發(fā)方法》這門課程對于計算機專業(yè)學生的能力培養(yǎng)是非常重要的。根據(jù)趙老師的安排,這門課程包含了二門課程的知識:《計算機監(jiān)控系統(tǒng)開發(fā)技術》課程和《軟件工程》課程的知識。把《軟件工程》的理論,和《計算機監(jiān)控系統(tǒng)》的開發(fā)方法結合講解。一方面,學生通過學習了計算機監(jiān)控系統(tǒng)軟件的開發(fā)技術,培養(yǎng)了利用實際的元器件構建一個真實的計算機監(jiān)控系統(tǒng)的能力。另一方面,學生結合計算機監(jiān)控系統(tǒng)軟件的制作,把《軟件工程》的理論與軟件的制作的實踐結合起來,應該能夠更好地理解和掌握軟件工程必須遵守的規(guī)范。從而達到培養(yǎng)學生能力的目的。所以,該課程的教案實際上包括這二門課程的教案,課程的名稱仍然保留原來的名稱。以下是教案:《計算機監(jiān)控技術教案》教案計算機監(jiān)控技術與系統(tǒng)開發(fā)教材:《計算機監(jiān)控系統(tǒng)的仿真開發(fā)》,國防工業(yè)出版社,馬玉春著參考書:①《計算機監(jiān)控系統(tǒng)開發(fā)與實戰(zhàn)》,機械工業(yè)出版社,馬玉春等編著②《計算機監(jiān)控技術與系統(tǒng)開發(fā)》,清華大學出版社,馬玉春編著③《VisualStudio2005高級編程》,清華大學出版社,AndrewParsons,NickRandolph著,吳雷譯《VisualBasic2010從入門到精通》,電子工業(yè)出版社,邱仲藩,宋智軍編著前言:近年來一度受到廣泛關注的物聯(lián)網(wǎng)技術,其核心技術包含兩個基本的層面和相關技術。第一個層面是基于多傳感器的計算機監(jiān)控系統(tǒng),包括多傳感器網(wǎng)絡與數(shù)據(jù)采集、實時數(shù)據(jù)傳輸和數(shù)據(jù)存儲等技術;第二層面是計算機網(wǎng)絡監(jiān)控系統(tǒng),包括計算機網(wǎng)絡與實時通信、計算機遠程監(jiān)控技術等,是一個軟硬件相結合,有著廣闊應用前景和產品市場的領域,成為許多學校計算機專業(yè)教育培養(yǎng)應用型人才時優(yōu)先考慮的一個方向。本課程就是介紹計算機監(jiān)控系統(tǒng)有關知識,通過本課程的學習,學生應該能夠利用實際的原器件構建一個真實的計算機監(jiān)控系統(tǒng)。一、課程概況計算機監(jiān)控技術綜合應用了C語言、.NET程序、計算機接口、計算機網(wǎng)絡、數(shù)據(jù)庫系統(tǒng)等技術,在計算機和電子信息相關專業(yè)的高年級開設此選修課程,可以提高學生知識的綜合應用能力,培養(yǎng)學生從事工程項目研發(fā)的經驗,可以為學生的畢業(yè)設計和就業(yè)做好鋪墊。本課程是一門實訓課程,采用邊學邊練的教學方法,以更好地提高學生的實踐能力。本課程的任務是:使學生了解計算機監(jiān)控系統(tǒng)的基本概念和原理,掌握計算機監(jiān)控系統(tǒng)的基本研發(fā)和測試方法,并可以對I-7065D或I-7013D模塊進行監(jiān)控,研發(fā)出相應的主控軟件。本課程的先修課程主要有《C語言程序設計》、《.NET程序設計》、《計算機接口》、《計算機網(wǎng)絡》、《數(shù)據(jù)庫技術》等。二、教學基本要求1.重點掌握通用多功能計算機監(jiān)控系統(tǒng)測試軟件(TestPort)的應用,了解通信協(xié)議的基本概念,對I-7065D和I-7013D模塊進行測試,進一步完成計算機監(jiān)控系統(tǒng)的初步開發(fā)。在技術上要能熟練調用數(shù)據(jù)編碼與處理和數(shù)據(jù)包的校驗技術及串口操作技術所涉及的常用函數(shù)。2.本課程實踐性很強,既是一門引導性課程,也是一門實訓課程。任課教師主要通過軟件演示來講解系統(tǒng)原理、測試方法,并在開發(fā)環(huán)境下演示核心代碼的調用方法。鼓勵學生一邊看書,一邊實踐,學會通過調試手段自行排除編程中出現(xiàn)的錯誤,從而有效提高自己的實戰(zhàn)能力。第一講概述1.1計算機監(jiān)控系統(tǒng)的概念1.2計算機監(jiān)控系統(tǒng)的主要特點1.3計算機監(jiān)控系統(tǒng)的分類 1.4計算機監(jiān)控系統(tǒng)的應用 1.5計算機監(jiān)控系統(tǒng)的實例第一章小結 1.1計算機監(jiān)控系統(tǒng)的概念計算機監(jiān)控系統(tǒng)是指具有數(shù)據(jù)采集、監(jiān)視、控制功能的計算機系統(tǒng),是以監(jiān)測控制計算機為主體,加上檢測裝置(傳感器)、執(zhí)行機構與被監(jiān)測控制的對象(生產過程)共同構成的整體。應用領域:民用、軍用、氣象、工業(yè)控制等。1.1.1計算機監(jiān)控系統(tǒng)的主要組成傳感器模擬量輸入模塊模擬量輸出模塊開關量輸入模塊開關量輸出模塊執(zhí)行器嵌入式模塊(受控機/下位機)工控機(主控機/上位機)1.1.2計算機監(jiān)控系統(tǒng)的功能采集與處理信息功能主要是對被監(jiān)控對象的參數(shù)進行檢測、采樣和必要的預處理,并以一定的形式輸出。監(jiān)督功能將檢測到的實時數(shù)據(jù)根據(jù)實際監(jiān)控過程的需要及監(jiān)控進程的情況進行分析、故障診斷、險情預測,并以圖、文、聲等多種形式進行操作指導、事故報警??刂乒δ茉跈z測的基礎上進行信息加工,根據(jù)事先決定的控制策略形成控制輸出,直接作用于監(jiān)控過程。1.1.3計算機監(jiān)控系統(tǒng)的硬件層次結構單層結構多層結構復雜結構1.1.4計算機監(jiān)控的主要技術串行通訊技術網(wǎng)絡傳輸技術接口轉換技術,例如RS232/RJ45接口轉換技術遠程調試技術通訊協(xié)議1.2計算機監(jiān)控系統(tǒng)的主要特點實時性:計算機監(jiān)控系統(tǒng)是一種實時計算機系統(tǒng),可以根據(jù)采集到的數(shù)據(jù),立即采取相應的動作。例如,檢測到化學反應罐的壓力超限,可以立即打開減壓閥,這樣就避免了爆炸的危險。實時性是區(qū)別于普通計算機系統(tǒng)的關鍵特點,也是衡量計算機監(jiān)控系統(tǒng)性能的一個重要指標??煽啃裕嚎删S護性數(shù)據(jù)自動采集處理:自動地對監(jiān)測對象進行數(shù)據(jù)采集、監(jiān)視,能將測量的數(shù)據(jù)進行分類處理、數(shù)學運算、誤差修正及工程單位換算等。例如,被測對象的溫度范圍為0~100℃,實際得到的被測數(shù)據(jù)為0-255,那么,就需要將實測數(shù)據(jù)轉換為對應溫度,進行顯示和作出相應的處理。人機交互通信功能:這里所說的通信,主要是指在監(jiān)控系統(tǒng)中,計算機與計算機之間、相同類型或不相同類型總線之間以及計算機網(wǎng)絡之間的信息傳輸。本書主要涉及串行通信和基于TCP/IP協(xié)議的網(wǎng)絡通信。自動運行、自動報警、自動校正等(簡介)1.3計算機監(jiān)控系統(tǒng)的分類計算機監(jiān)測系統(tǒng)計算機監(jiān)督系統(tǒng)計算機控制系統(tǒng)計算機監(jiān)控系統(tǒng)1.4計算機監(jiān)控系統(tǒng)的應用在電力系統(tǒng)的應用在交通監(jiān)控系統(tǒng)的應用在消防監(jiān)控系統(tǒng)中的應用在各行業(yè)中的應用1.5計算機監(jiān)控系統(tǒng)的整體印象1.9本章小結本章主要介紹了計算機監(jiān)控系統(tǒng)的基本概念、特點要求與主要分類,以及計算機監(jiān)控系統(tǒng)的主要應用領域,然后給出了一個計算機監(jiān)控系統(tǒng)的實例框架和模塊的實物圖。信息通信是計算機監(jiān)控系統(tǒng)中的關鍵部分,隨后介紹了計算機監(jiān)控系統(tǒng)中常用的串行接口、網(wǎng)絡接口,并對通信協(xié)議的格式與含義做了簡單介紹。下一章介紹軟件仿真模塊和常用工具的使用方法,這些軟件綜合應用了多種接口,利用這些軟件即可搭建計算機監(jiān)控系統(tǒng)。第二講:VisualStudio2010入門內容包括3.1,3.2,3.3,3.5以及自編部分該課程是一門強調實踐性的課程,我們實驗環(huán)境是:硬件環(huán)境-雙核、2G內存,軟件環(huán)境-Windows7,VisualStudio2010。VisualStudio2010包含了一系列高效的、智能的開發(fā)工具,它結合以往編程語言(VB,C#)的優(yōu)勢,提供了很多全新的、強大的功能。現(xiàn)在,進入了.NET時代,只要VisualC++和VisualC#能完成的事情,VB.NET幾乎都可以完成,因為它們都是面向對象的,而且,都是建立在.NETFramework之上的,共享公共語言運行庫(CommonLanguageRuntime,CLR)和.NETFramework類庫,只是語法上有所差異。所以,VB.NET是一種功能齊全的開發(fā)工具,可使編程比以前更加容易,我們應該認真學習。在進行軟件項目開發(fā)的時候,我們應該選擇哪種編程語言?首先,要考慮有無實用的開發(fā)環(huán)境支持。一個好的開發(fā)環(huán)境使用便捷,能有效地提高軟件開發(fā)效率。其次,要考慮該編程語言是否為主流語言。主流語言掌握的程序員比較多,便于交流與維護,而且,該語言能得到商家的關注而持續(xù)發(fā)展。VisualBasic是一門快速語言,有非常便捷的開發(fā)環(huán)境,也是Microsoft公司的主流語言,這就是我們選擇VisualBasic作為本書的主要編程語言的原因。2.1VisualBasic的開發(fā)環(huán)境工具箱中顯示的是常用的內置控件,如果需要其它控件,或者第三方控件,就需要打開Project(工程)菜單,選擇Components(控件)子菜單,然后,選擇合適的控件。比如,我們最常用的串行通信控件,可以核選其中的“MicrosoftCommControl6.0”,即MSComm32.ocx,此時,工具箱中就多了一個話機圖標,增加了一個控件。2.2教學計劃計算器系統(tǒng)需求:在制訂教學計劃的過程中,需要根據(jù)所講授課程的每章的學時數(shù)、起始的周數(shù)、每周講授的課時數(shù)來計算每章講授的周次。程序設計及代碼編寫:程序的源代碼見光盤目錄Ch02-1。核心代碼如下:2.3程序的調試技術對于較復雜的大型程序來說,錯誤是不可避免的。通過程序的調試,找到錯誤所在,進行修改。VisualBasic還提供了捕獲錯誤的語句──OnError語句:OnErrorResumeNext當錯誤發(fā)生時,直接執(zhí)行下一條語句。OnErrorGotoNum_Label錯誤發(fā)生時,跳轉到標號Num_Label處。Err.Number為錯誤代碼。2.4幫助文檔的制作對于一個商業(yè)軟件來說,如果沒有幫助文檔,那就顯得非常不正規(guī)。以前的幫助文檔制作非常繁瑣,現(xiàn)在采用Microsoft的HtmlHelpWorkshop免費工具(最新版本可從Microsoft的主頁下載,光盤目錄Tools中也有安裝程序),寫起來非常簡捷高效。2.5程序的發(fā)布程序設計、編寫、調試完畢,需要使用。如果在自己的計算機上使用,則沒有任何問題。對于商業(yè)程序,需要在各種不同的計算機上使用,我們不能要求客戶的計算機的環(huán)境跟我們的一樣,也安裝相關的VisualBasic工具和其它相關組件。這可以通過制作安裝包來解決,如圖2.6所示,就是MicrosoftVisualStudio6.0Tools中的PackageandDeploymentWizard。本章小結本章內容簡明扼要地介紹了VisualBasic的開發(fā)環(huán)境,并通過“教學計劃計算器”這個實例來講解編程、調試技術,最后介紹了幫助文檔的制作及程序中對幫助文檔的調用,以及程序安裝包的制作。工程技術一般并不涉及復雜的理論,但是,需要經過多次“學習、實踐、完善、靈活應用”才能掌握。通過開發(fā)第一個WINDOWS應用程序,實現(xiàn)VisualStudio2010入門一、問題定義根據(jù)《福彩雙色球玩法規(guī)則》,“雙色球”每注投注號碼由6個紅色球號碼和1個藍色球號碼組成。紅色球號碼從1-33中選擇;藍色球號碼從1-16中選擇。顯然,紅色球的6個號碼應該互不相同,但是,藍色球號碼允許與紅色球號碼相同。程序由兩個文本框和一個按鈕組成,一個文本框用紅色顯示6個紅色球號碼,另一個文本框用藍色顯示藍色球號碼,命令按鈕用于啟動計算。號碼應該隨機產生,滿足一組號碼不重復且在規(guī)定的范圍內。二、環(huán)境與界面的處理打開VS2010IDE,點擊菜單【文件】→【新建項目】,出現(xiàn)如圖3.6所示的界面。在VisualStudio已安裝的模板中,選擇Windows窗體應用程序,在圖的下部的文本框中輸入Lottery(彩票),點擊【確定】按鈕。從工具箱中找到TextBox(文本框)控件,拖兩個文本框到窗體上,通過屬性窗口將前者的Name屬性設置為txtRed,即紅色球,后者的Name屬性設置為txtBlue,如圖3.7所示,可以先在文本框的Text屬性中輸入數(shù)據(jù),然后,調整好兩個文本框的寬度,再刪除數(shù)據(jù)。兩個文本框的TextAlign(對齊方式)屬性都選擇(Center居中),txtRed文本框的ForeColor(前景色)屬性設置為Red,txtBlue文本框的ForeColor屬性設置為Blue。再從工具箱中找到按鈕Button,加入一個按鈕,Text屬性設置為Test,Name屬性設置為btTest。對于窗體,其屬性也需要做修改,如表3.1所示。FormBorderStyle為窗體邊框屬性,F(xiàn)ixedSingle為固定單邊,這種邊框在程序運行期間不能調整界面大?。⊿izable屬性反之)。福利彩票自動選號程序界面設計完畢,不需要調整界面大小,否則,就會顯得比較凌亂,所以,這里選擇FixedSingle屬性。圖標文件修改后,程序運行時窗體的圖標改變,如圖3.7所示,但是,在Windows資源管理器中,圖標依然是默認圖標。如果FormBorderStyle選擇FixedSingle屬性,一般使MaximizeBox取值為False,即取消最大化。StartPosition為CenterScreen屬性,表示程序啟動后即在屏幕的中間顯示。TopMost為True表示程序在頂層顯示,即使程序失去焦點,也不會被非頂層程序覆蓋。本項目只有一個窗體,所以,圖3.8中,啟動窗體默認為frmMain。如果一個程序的窗體和軟件模塊較多,就需要選擇合適的啟動窗體,即程序運行時,首先啟動該窗體。一旦界面設計完畢,可以點擊“鎖定控件”,這樣,窗體中的控件將被鎖定,不能更改大小,也不能被移動。三、代碼編寫1、建立一個產生指定范圍內的隨機數(shù)的函數(shù):右擊解決方案資源管理器中的項目Lottery,點擊【添加】→【新建項】,選擇【模塊】,并將模塊的名字改為Main.vb,然后,點擊【確定】。在ModuleMain和EndModule之間輸入如下代碼。PublicFunctionGetRandomByte(OptionalByValnFromAsInteger=0,OptionalByValnToAsInteger=255)AsByteIfnFrom>nToOrnFrom<0OrnTo>255Then'Error:nFrom>nTo!Return0EndIfDimrndAsRandom=NewRandom()'生成隨機對象DimbDataAsByte'存放結果DoWhileTruebData=(rnd.Next)Mod256IfbData>=nFromAndbData<=nToThenReturnbDataLoop'如果產生的隨機數(shù)除以256,余數(shù)在規(guī)定的范圍內,則退出,否則,循環(huán)EndFunction在VisualBasic中,定義函數(shù)采用如下形式。Private/PublicFunction函數(shù)名([[Optional]Byval/ByRef參數(shù)_As類型[=默認值]])As類型2、建立按鈕Test的Click事件處理程序:雙擊解決方案資源管理器中的frmMain.vb,打開主窗體,然后,雙擊按鈕Test,在其Click事件處理程序中輸入如下代碼。PrivateSubbtTest_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtTest.Click'btTest_Click是事件處理的程序名'sender是事件的發(fā)送者,e是事件參數(shù)'HandlesbtTest.Click表示處理btTest按鈕的Click事件DimIAsInteger'用來計數(shù)DimstrRedAsString=""'存放6個紅色球號碼DimstrTmpAsString=""'臨時變量DimnTmpAsInteger'臨時變量ForI=0To5'產生6個紅色球號碼WhilestrRed.Contains(strTmp)'如果紅色球號碼中包含新隨機數(shù),循環(huán)nTmp=GetRandomByte(1,33)'產生1-33之間的隨機數(shù)strTmp=nTmp.ToString("D2")'將隨機數(shù)轉換為兩個字符EndWhilestrRed&=strTmp'相當于strRed=strRed+strTmpIfI<5ThenstrRed&=""'確保兩個紅色球號碼之間有一個空格NextIDimstrArray(5)AsString'定義一個字符串數(shù)組,下標從0開始strArray=Split(strRed)'將6個紅色球號碼分拆到數(shù)組中Array.Sort(strArray)'對數(shù)組進行排序'將排好順序的數(shù)組轉換為空格分隔的字符串,并放入txtRed文本框中顯示txtRed.Text=String.Join("",strArray)Sleep(7)'休眠7毫秒nTmp=GetRandomByte(1,16)'產生一個1-16的隨機數(shù)txtBlue.Text=nTmp.ToString("D2")'轉換為兩個字符進行顯示EndSub在PublicClassfrmMain行之上輸入如下一行代碼。ImportsSystem.Threading.Thread這表示引入命名空間,如此也可消除錯誤。雙擊窗體,在窗體的Load事件處理程序中,輸入代碼btTest.Select(),這表示程序運行后,按鈕將首先獲得焦點,此時,按回車鍵與點擊按鈕的效果將是一樣的。3、啟動調試:可以通過點擊菜單【調試】→【啟動調試】、工具欄上的啟動調試圖標或者直接按【F5】運行程序,觀察一下效果,是否與圖3.14的一樣(當然,隨機數(shù)一般不一樣)。VisualBasic的界面、代碼、類、模塊等文件的后綴名都是vb,工程文件的后綴名為vbproj,解決方案的后綴名為sln。解決方案調用工程文件,因而,關閉項目后,直接點擊工程文件或解決方案,都能重新打開項目。即時窗口(如果被關閉,可以使用菜單【調試】→【窗口】→【即時】打開,或通過工具欄打開)用于在程序運行時輸出調試信息,或者在設計期間完成簡單的計算任務。四、命名空間1、命名空間的概念(由有命名對象組成的空間):一個命名空間就是一個類的層次結構。一個類可以是一個父類,父類就有子類,父類與它的子類,形成層次結構。每個類都有自己的屬性與方法等,也形成層次結構。一個命名空間把一個類的所有的層次結構都包含其中。2、一個項目的命名空間:建立一個項目需要使用的所有的類、結構、枚舉、委托和接口,都包含在項目的命名空間之中。我們可以在項目的“解決方案資源管理器”的窗口看到這些命名空間。點開“引用”文件夾,就可以看到建立該項目引用的命名空間。Lottery項目引用的命名空間如圖3.28所示。3、.NETFramework類庫是一個由Microsoft.NETFramework中包含的類、接口和值類型組成的庫。該庫提供對系統(tǒng)功能的訪問,是建立.NETFramework應用程序、組件和控件的基礎。.NETFramework類庫由命名空間組成。每個命名空間都包含可在程序中使用的類型:類、結構、枚舉、委托和接口。我們在VS2010環(huán)境下,就是使用.NETFramework類庫中的類,或者說使用這些命名空間創(chuàng)建應用程序,創(chuàng)建各種項目。所有Microsoft提供的命名空間都是以名稱System或Microsoft開頭的。4、如果項目默認引用的命名空間沒有我們所要的命名空間。例如Lottery項目默認引用的命名空間,不包含SLEEP方法所在的命名空間。所以在調試程序時出現(xiàn)錯誤。避免這個錯誤有二個方法:方法一:添加包含Sleep方法的命名空間。Sleep方法是Thread類的方法,Threading是Thread的父類,System是Threading的父類,“System.Threading.Thread”則是一個命名空間,為了調用Thread類的Sleep方法,添加了引用“ImportsSystem.Threading.Thread”,在程序中就可以直接調用Sleep方法。方法二、在方法前添加長長的命名空間。例如將語句:Sleep(7),改寫為:System.Threading.Thread.Sleep(7),錯誤即消失。由此可見,從某種意義上來說,命名空間就是一個類的層次結構。五、本章小結:本章首先介紹了VisualBasic2008的開發(fā)環(huán)境與環(huán)境的定制。在此基礎之上,以彩票程序Lottery為例,詳細分析了程序設計、調試與部署的整個過程。最后介紹了命名空間的概念以及如何尋求幫助,成為編程高手。本章內容是本書的重要基礎,而Lottery程序雖然簡單,但是,涉及許多重要概念,循環(huán)中還有循環(huán)和條件語句,需要依此為主線,將本章內容串聯(lián)起來,并達到熟練掌握的程度,以便為后續(xù)的學習打下良好的基礎。第3講串口通訊技術內容包括1.6,1.7,1.8,4.1,4.5以及自編部分1.6串行接口串行接口一般包括RS-232/422/485,其技術簡單成熟,性能可靠,價格低廉,所要求的軟硬件環(huán)境或條件都很低,廣泛應用于計算機及相關領域,遍及Modem、串行打印機、各種監(jiān)控模塊、PLC、攝像頭云臺、數(shù)控機床、單片機及相關智能設備,甚至路由器也不例外(通過串口設置參數(shù))。在計算機監(jiān)控系統(tǒng)中,主控機一般采用工控機,通過串口與監(jiān)控模塊相連,監(jiān)控模塊再連接相應的傳感器和執(zhí)行器,如此形成一個簡單的雙層結構的計算機監(jiān)控系統(tǒng)。這種結構主要用于單獨的中小型企業(yè)或部門,如果屬于綜合型企業(yè)或部門,如電力系統(tǒng)監(jiān)控,高速公路監(jiān)控和收費系統(tǒng),則可以此為基礎結構進行擴充,用集線器將眾多雙層監(jiān)控系統(tǒng)連接起來,再用交換機將若干集線器連接起來,統(tǒng)一接上路由器,從而跟Internet互聯(lián)(當然,軟件結構也得作調整),如此即可形成一個龐大的計算機監(jiān)控網(wǎng)絡。由此可見,盡管現(xiàn)代計算機的新接口層出不窮,各種網(wǎng)絡也日新月異,其規(guī)模也越來越大,但是,其基礎結構卻有不少是串行通信系統(tǒng),串行通信也成了其中的核心技術。1.6.1RS-232接口RS-232接口是一種用于近距離(一般在15米之內,最長不超過60米)、慢速度、點對點的通信協(xié)議。雖然有9根線,但是,只要發(fā)送線TxD、接收線RxD、地線GND即可工作。在RS-232中一個信號只用到一條信號線,采取與地電壓參考的方式,因而在長距離傳輸后,發(fā)送端和接收端的對地電壓有出入,容易造成通信出錯或速度降低。如果采用光電隔離的長線驅動器,也可使通信距離延長至2000米。RS-232的最高速率一般可達到115200bit/s,通常默認的工作參數(shù)為:9600bit/s,8位,無校驗。圖1.3所示是RS-232接口的實物圖,其中(a)圖為針狀,稱作公口,大部分計算機或筆記本都采用該形狀;(b)圖為孔狀,稱作母口,模塊采用此形狀的較多。兩種接口的針或孔都標有數(shù)字1-9。表1.1所示是DB-9型連接器的引腳說明,分為三類,即聯(lián)絡控制信號線、數(shù)據(jù)發(fā)送與接收線以及地線。表中的DTE(DataTerminalEquipment)是數(shù)據(jù)終端設備,是廣義的概念,計算機也可以是數(shù)據(jù)終端。DCE(DataCommunicationsEquipment)是數(shù)據(jù)通信設備,用來連接DTE,Modem就是典型的DCE。(1)聯(lián)絡控制信號線數(shù)據(jù)設備準備好(DataSetReady,DSR)其狀態(tài)為有效,表明Modem處于可以使用的狀態(tài)。數(shù)據(jù)終端準備好(DataTerminalReady,DTR)其狀態(tài)為有效,表明數(shù)據(jù)終端可以使用。有時將DSR與DTR連到電源上,一上電就立即有效。這兩個設備狀態(tài)信號有效,只表示設備本身可用,并不說明通信鏈路可以開始進行通信了,能否開始進行通信要由下面的控制信號決定。請求發(fā)送(RequestToSend,RTS)如果DTE(如計算機)要向DCE(如Modem)發(fā)送數(shù)據(jù),就使RTS有效。允許發(fā)送(ClearToSend,CTS)如果Modem有接收空間,就使CTS有效,然后,計算機開始發(fā)送數(shù)據(jù);否則,如果Modem沒有接收空間,就不會發(fā)送CTS有效信號,因而,計算機就不能發(fā)送數(shù)據(jù)。RTS/CTS用于半雙工Modem系統(tǒng)中發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中,因配置雙向通道,故不需要RTS/CTS聯(lián)絡信號。載波數(shù)據(jù)檢測(DataCarrierDetection,DCD)用來表示DCE已經接通通信鏈路,告知DTE準備接收數(shù)據(jù)。當本地的Modem收到由通信鏈路另一端(遠地)的Modem送來的載波信號時,使DCD有效,通知終端準備接收,并且,由Modem將接收下來的載波信號解調成數(shù)字量數(shù)據(jù)后,沿接收數(shù)據(jù)線RxD送到終端。振鈴指示(RingIndicator,RI)當Modem收到交換臺送來的振鈴呼叫信號時,使該信號有效,然后通知終端,已被呼叫。(2)數(shù)據(jù)發(fā)送與接收線發(fā)送數(shù)據(jù)(TransmittedData,TxD)通過TxD終端將串行數(shù)據(jù)發(fā)送到Modem。接收數(shù)據(jù)(ReceivedData,RxD)通過RxD終端接收從Modem發(fā)來的串行數(shù)據(jù)。(3)地線地線(Ground,GND)在兩個串口之間傳輸數(shù)據(jù),地線直接相連。1.6.2RS-422與RS-485接口RS-232作為一種通信標準得到了廣泛的應用,但是,通信距離短、速度慢,在一個連接中不能有超過兩臺以上的設備。為了滿足通信發(fā)展對更快的速度、更長的連接和多節(jié)點連接的需求,RS-422與RS-485應運而生。RS-422/485接口采用不同的方式:每個信號都采用雙絞線(兩根信號線)傳送,兩條線間的電壓差用于表示數(shù)字信號。例如,將雙絞線中的一根標為A(正),另一根標為B(負),當A為正電壓(通常為+5V),B為負電壓時(通常為0),表示信號“1”;反之,A為負電壓,B為正電壓時表示信號“0”。RS-422/485允許通信距離可達到1200米。RS-422與RS-485采用相同的通信協(xié)議,但有所不同:RS-422通常作為RS-232通信的擴展,它采用兩根雙絞線,數(shù)據(jù)可以同時雙向傳遞(全雙工)。RS-485則采用一根雙絞線,輸入輸出信號不能同時進行(半雙工)。1.6.3對等接口之間的通信連接方法兩臺RS-232設備之間的通信連接,只要發(fā)送線與接收線交叉連接,地線直接連接即可。圖1.4所示是一個RS-232連接簡圖。RS-422是對RS-232的擴展,RS-232只能進行半雙工通信,而RS-422可以進行全雙工通信,而且傳輸速率高,距離遠。兩臺RS-422設備之間的通信連接,也只是發(fā)送線與接收線交叉連接。由于發(fā)送線和接收線各自有兩根,交叉后正極與正極相連,負極與負極相連。這種情況主要用于受控機離主控機距離較遠,在主控機的RS-232上掛接RS-232/422轉換器,從而實現(xiàn)兩臺RS-422設備之間的連接。圖1.5所示是RS-422設備連接圖。RS-485可以說是最簡單高效的串口了,傳輸速率高,距離遠,一條信號線上一般可以連接多達128臺設備,執(zhí)行器一般配備此接口。兩臺RS-485設備之間的通信連接,只要直連即可,即正極連接正極,負極連接負極。圖1.6是RS-485設備連接圖。工程效果見圖2.1所示。1.7網(wǎng)絡接口RS-232只能用于近距離傳輸數(shù)據(jù),RS-422/485的傳輸距離也非常有限。由于Internet的普及,如果計算機監(jiān)控系統(tǒng)的數(shù)據(jù)不能通過TCP/IP協(xié)議進行傳輸,那么,這種監(jiān)控系統(tǒng)將缺乏靈活性和方便性。網(wǎng)口一般使用RJ-45接口(俗稱水晶頭),采用8芯(4對)雙絞線,只用其中2對,另外2對將來擴展使用。8芯雙絞線的作用和顏色如表1.2所示(RJ-45頭的金屬線向上,雙絞線靠近自己,從左到右即為1至8的順序)。在雙絞線中橙、綠兩對線比另外兩對繞得更緊一些,所以在有關標準中規(guī)定用這兩對線作收發(fā)線,可以有更長的傳輸距離。網(wǎng)口的傳輸速率可以根據(jù)實際需要進行設定,只要不超過網(wǎng)卡的參數(shù)和網(wǎng)絡帶寬及計算機的處理速度。如圖1.7所示是水晶頭的實物圖。有線網(wǎng)絡主要使用我們都很熟悉的雙絞線進行互連?,F(xiàn)在,千兆以太網(wǎng)正在逐步取代百兆以太網(wǎng)。網(wǎng)線主要有兩種類型: 直通線,最廣泛使用的雙絞線 交叉線,用于特殊情況下的連接使用直通線的網(wǎng)絡設備一般連接到交換機(Switch)或集線器(Hub)上,如果想要直接連接兩種同類設備,比如兩臺PC機,則可以使用交叉線而無需通過交換機或集線器,其連線方法如圖1.8所示,4、5、7、8線直連即可。1.8通信協(xié)議計算機監(jiān)控系統(tǒng)集成了計算機軟件、硬件和信息通信系統(tǒng),沒有信息通信系統(tǒng),計算機監(jiān)控系統(tǒng)就不能完成系統(tǒng)內部和系統(tǒng)外部的信息傳輸。所謂的信息通信,可以簡單地理解為“有特定意義”的字節(jié)數(shù)據(jù)的發(fā)送和接收。雙方通信必須遵循的規(guī)范就是所謂的通信協(xié)議。RS-232接口是一種用于近距離(一般在15米之內,最長不超過30至60米)、慢速度、點對點的通信協(xié)議。雖然有9根線,但是,只要發(fā)送線TxD、接收線RxD、地線GND即可工作。在RS-232中一個信號只用到一條信號線,采取與地電壓參考的方式,因而在長距離傳輸后,發(fā)送端和接收端的對地電壓有出入,容易造成通信出錯或速度降低。3.2RS-422與RS-485接口為了滿足通信發(fā)展對更快的速度、更長的連接和多節(jié)點連接的需求,RS-422與RS-485應運而生[7]。RS-422與RS-485采用相同的通信協(xié)議,但有所不同:RS-422通常作為RS-232通信的擴展,它采用兩根雙絞線,數(shù)據(jù)可以同時雙向傳遞(全雙工)。RS-485則采用一根雙絞線,輸入輸出信號不能同時進行(半雙工)。3.3對等接口之間的通信連接方法兩臺RS-232設備之間的通信連接,只要發(fā)送線與接收線交叉連接,地線直接連接即可。一般用于主控機(如工控機)與受控機(CPU模塊)之間的連接。兩臺RS-422設備之間的通信連接,也只是發(fā)送線與接收線交叉連接。由于發(fā)送線和接收線各自有兩根,交叉后正極與正極相連,負極與負極相連。RS-485可以說是最簡單高效的串口傳輸速率高,距離遠,一條信號線上一般可以連接多達128臺設備,執(zhí)行器一般配備此接口。兩臺RS-485設備之間的通信連接,只要直連即可,即正極連接正極,負極連接負極。受控機一般配備標準的串口,即RS-232,同時配備RS-485,用于跟距離較遠的多臺執(zhí)行器通信,發(fā)送命令或查詢設備狀態(tài)。4.5.4SerialPort(P76)1、串行接口(RS-232)技術簡單成熟,性能可靠,價格低廉,所要求的軟硬件環(huán)境或條件都很低,廣泛應用于計算機及相關領域,遍及Modem、串行打印機、各種監(jiān)控模塊、PLC、攝像頭云臺、數(shù)控機床、單片機及相關智能設備,甚至路由器也不例外(通過串口設置參數(shù))。所以,在VisualBasic6.0及之前有MSComm32串行通信控件,即使發(fā)展到現(xiàn)在的VisualBasic2008,微軟依然很好地支持串行通信,編寫了功能更加強大的SerialPort類(屬System.IO.Ports命名空間)。2、表4.7所示是SerialPort類的主要屬性,RtsEnable屬性經常用作硬件握手信號,如果一方設置該屬性為True,另一方設置該屬性為False,即使程序正確,數(shù)據(jù)交互也不能完成。ReceiveBytesThreshold屬性一般設置為1,表示收到一個字節(jié)的數(shù)據(jù),即產生DataReceived(數(shù)據(jù)已經接收)事件,這樣可以使數(shù)據(jù)接收靈敏可靠。SerialPort類在運行時通過IsOpen屬性判斷串口是否打開,用Open方法打開串口,用Close方法關閉串口——只有串口打開后才能收發(fā)數(shù)據(jù)。通過Write方法發(fā)送數(shù)據(jù),Write有三個重載方法,本例使用Write(textasString)方法;也可使用WriteLine方法,自動在發(fā)送的文本后面添加回車換行。Read方法用來讀取對方發(fā)送的數(shù)據(jù),有兩個重載方法;ReadExisting方法主要用來讀取收到的所有的字符串。3、SerialPort類的主要事件:DataReceived事件發(fā)生,表示收到對方的數(shù)據(jù);ErrorReceived事件發(fā)生,表示發(fā)生了錯誤;PinChanged事件則表示引腳信號發(fā)生了變化。ErrorReceived和PinChanged事件處理程序中,可以使用e.EventType.ToString()語句來提取相關文本信息。實驗2:1、新建一個窗體應用程序WinApp_SerialPort,用于兩臺計算機之間的聊天。在窗體上繪制一個SerialPort控件(在工具箱的“組件”選項卡中),其屬性不變;繪制兩個標簽(Label),將Text屬性設置為Receive和Send;繪制兩個文本框(TextBox),將Name屬性設置為txtReceive和txtSend;繪制三個按鈕(Button),將Name屬性設置為btOpen、btClose和btSend,Text屬性設置為Open、Close和Send,并將后兩者的Enable屬性設置為False。2、串口的打開與關閉:在btOpen的Click事件處理程序中輸入如下代碼:IfSerialPort1.IsOpen=FalseThenSerialPort1.Open()btOpen.Enabled=FalsebtClose.Enabled=TruebtSend.Enabled=TrueEndIf如果串口為關閉狀態(tài),那么,打開串口,關閉串口按鈕btClose和發(fā)送數(shù)據(jù)按鈕btSend才有意義,所以,將其Enable屬性設置為True。在btClose的Click事件處理程序中輸入如下代碼:IfSerialPort1.IsOpenThenSerialPort1.Close()btClose.Enabled=FalsebtSend.Enabled=FalsebtOpen.Enabled=TrueEndIf3、數(shù)據(jù)的發(fā)送:btSend按鈕用于發(fā)送數(shù)據(jù),如果txtSend文本框中的字符串長度大于0,則使用SerialPort的Write方法發(fā)送數(shù)據(jù),其源代碼如下:IftxtSend.Text.Length>0ThenSerialPort1.Write(txtSend.Text)EndIf此時,運行程序,在txtSend文本框中鍵入字符串,點擊“Open”打開串口,點擊“Send”發(fā)送,對方將能收到數(shù)據(jù)(可以使用TestPort軟件配合測試)。4、數(shù)據(jù)的接收:錯誤方法是:在SerialPort的DataReceived事件處理程序中輸入代碼:txtReceive.txt=SerialPort1.ReadExisting即,讀取對方發(fā)送的數(shù)據(jù),放入txtReceive文本框中。用交叉串行電纜連接兩臺計算機。運行程序,從另一臺計算機上發(fā)送字符串,這時,出現(xiàn)圖4.38所示的錯誤提示信息,線程間操作無效?!皌xtReceive”是窗體控件,處于前臺的線程;SerialPort1是后臺控件,處于后臺的線程。txtReceive.txt=SerialPort1.ReadExisting的錯誤在于跨線程調用。如何在SerialPort的DataReceived事件處理程序中跨線程調用Windows窗體控件呢?正確的方法:跨線程調用Windows窗體控件可以通過代理(Delegate)來實現(xiàn)。先在窗體類中做如下聲明:PublicDelegateSubDelegateCom()DimdComAsDelegateCom=NewDelegateCom(AddressOfGeneralCom)聲明一個代理DelegateCom,它的實例dCom指向函數(shù)GeneralCom,這樣,在SerialPort的DataReceived事件處理程序中就可以通過Invoke(dCom)方法調用代理,從而調用GeneralCom函數(shù),而操作Windows窗體的語句可以放置在GeneralCom函數(shù)中。最后一個問題:如何解決數(shù)據(jù)發(fā)送不連續(xù)的問題。如果將ReceiveBytesThreshold設置為大于1,那么,收到1個字節(jié)就不會有反應;如果設置為1,那么,收到一批數(shù)據(jù)將會產生多個DataReceived事件,從而,使txtReceive文本框中只能出現(xiàn)一個字符串的尾巴,即只收到最后的數(shù)據(jù)。這就要求將一批收到的數(shù)據(jù)進行匯總。將一批收到的數(shù)據(jù)進行匯總??梢栽诖绑w類中聲明兩個變量:DimbStartAsBoolean'True表示正在接收數(shù)據(jù)DimstrReceiveAsString‘收到的字符串匯總再向窗體添加一個Timer控件,Interval設置為500(毫秒)。由于SerialPort類的默認波特率為9600,因而500毫秒足夠匯總所有接收到的字符串。SerialPort中的DataReceived事件處理程序真正調用的是GeneralCom函數(shù),其源代碼如下。IfbStart=FalseThenstrReceive=""bStart=TrueTimer1.Enabled=TrueEndIfstrReceive&=SerialPort1.ReadExisting假如沒有開始數(shù)據(jù)接收,那么,準備數(shù)據(jù)接收,將用來匯總字符串的變量strReceive清空,設置數(shù)據(jù)接收開始標志,啟動定時器。這些工作完成后,將每次收到的數(shù)據(jù)匯總到strReceive變量中。500毫秒以后,在定時器的事件處理程序中,將收到的數(shù)據(jù)strReceive放到txtReceive中,再做其它調整。圖4.39所示是兩個WinApp_SerialPort程序的運行效果。4.6本章小結.NETFramework3.5所提供的控件或組件很多,功能非常齊全,使用這些控件或組件,既可以增加程序的可讀性、節(jié)約開發(fā)成本,又可以增強程序的可靠性。本章只是介紹了其中最常用的一部分。之乎者也矣焉哉,用得成章好秀才。本章所介紹的每一個控件或組件,都要求熟練掌握,因而,需要反復操練,這樣,才能將簡單的控件或組件組合成一個用戶滿意的、性能可靠和界面美觀的程序。學習本章或對本章進行教學,可以先打開本章的例程,觀察運行效果,然后,對照書本逐一學習其屬性、方法和事件,在了解了基本原理后,再進行模仿??傊?,堅持從感性認識到理性認識,先運行例程,再對照學習,最后進行模仿,從而,達到熟練使用的效果。第四講:數(shù)據(jù)編碼與處理技術和數(shù)據(jù)包校驗技術在上一個實驗中,還存在一個問題,即我們收到的數(shù)據(jù)是否完整?那么,需要對收到的數(shù)據(jù)進行校驗。如何校驗,一句話,按照通信協(xié)議進行校驗。所以,這一講的內容有3點:通信協(xié)議有關內容;數(shù)據(jù)編碼與處理技術;數(shù)據(jù)包校驗技術。一、通信協(xié)議有關內容計算機監(jiān)控系統(tǒng)集成了計算機軟件、硬件和信息通信系統(tǒng),沒有信息通信系統(tǒng),計算機監(jiān)控系統(tǒng)就不能完成系統(tǒng)內部和系統(tǒng)外部的信息傳輸。所謂的信息通信,可以簡單地理解為“有特定意義”的字節(jié)數(shù)據(jù)的發(fā)送和接收。雙方通信必須遵循的規(guī)范就是所謂的通信協(xié)議,如下所示是通信協(xié)議的常用格式:通信協(xié)議的常用格式:前導字符,地址碼,功能碼[,數(shù)據(jù)字節(jié)][,校驗碼][,結尾碼]。相同廠家或類型的模塊往往有相同的前導字符,地址碼是對一條數(shù)據(jù)總線上的設備標識,就象IP地址是對計算機的標識一樣,功能碼表示這條協(xié)議是讀取對方模塊中的數(shù)據(jù),還是發(fā)送控制命令等,如果是返回的協(xié)議,一般會跟數(shù)據(jù)字節(jié)(一個或多個字節(jié)),校驗碼用來檢查所發(fā)送或接收的數(shù)據(jù)是否正確,結尾碼是協(xié)議結束的標志。對方收到此協(xié)議后,首先對協(xié)議進行檢查:前導字符、地址碼、校驗碼與結尾碼是否正確,如果錯誤,就不予理睬;如果正確,就開始檢查功能碼,根據(jù)功能碼做出相應的處理。例如,有如下具體的通信協(xié)議:0401520D其中,前導字符是字節(jié)04,地址碼為01,功能碼為52(即“R”,讀取信息),0D表示以回車字符結尾,這里沒有使用校驗碼。通信協(xié)議中還涉及各種編碼方法(第13章介紹)和數(shù)據(jù)校驗方法(第14章介紹)。信息通信的方法,主要以串行通信、網(wǎng)絡通信和GSM通信為主。二、 數(shù)據(jù)編碼與處理技術在編程實踐中,對于信息的顯示、傳輸、加密與解密等方面的問題,經常需要對相同含義的數(shù)據(jù)采用不同的表示方法,即編碼。例如,對于人們日常使用的中文短信,一般采用PDU模式對信息進行編碼(結果為16進制字符串),其中,需要求出中文漢字的Unicode編碼。表13.1是字節(jié)0x41、0x39、0x6d、0x0d與0的不同表示方法,后兩個字節(jié)是不可見字符,所以用“-”表示。第4.5.4節(jié)介紹的串行通信聊天程序,如果接收到字節(jié)0x6d,將顯示為字符“m”;如果接收到字節(jié)0x0d,將不能顯示。通過將“16進制字節(jié)”轉換為“16進制字符串”,可以將不可見的字符(串)變成可見的16進制字符串。特別地,在VisualBasic和C系列的編程語言中,用NULL(即字節(jié)0)表示字符串的結尾,如果收到的數(shù)據(jù)中間部分有字節(jié)0,那么,后面的數(shù)據(jù)就會被截斷。如果將收到的數(shù)據(jù)轉換為16進制字符串,所有數(shù)據(jù)都可以顯示,同時,也可以充分利用VisualBasic豐富的字符串處理函數(shù)來分析處理數(shù)據(jù)。13.1枚舉類型和常量的定義本章用ByteProcess模塊實現(xiàn)了通用的數(shù)據(jù)編碼與處理功能,這些函數(shù)具有很強的通用性,可以用于計算機監(jiān)控工程、短信的收發(fā)及加密與解密等應用程序。ByteProcess模塊主要定義了一個模塊級的枚舉類型DisplayMode和一個字符串常量HEX_CHAR_SET。普通的Modem使用AT命令進行工作,傳輸?shù)臄?shù)據(jù)都是可見字符和回車換行符號,一般使用字符形式進行顯示。如果用一個字節(jié)表示8個開關的狀態(tài),肯定會出現(xiàn)不可見字符,因而,必須采用16進制字符串來顯示數(shù)據(jù)。DisplayMode枚舉型的CharMode表示以普通字符串的形式顯示數(shù)據(jù),HexMode表示以16進制字符串顯示數(shù)據(jù)。PublicEnumDisplayModeCharMode=0HexMode=1EndEnum字符串常量HEX_CHAR_SET是模塊內部使用的,因而,定義為私有類型。通過String對象HEX_CHAR_SET的IndexOf方法,可以很方便地計算出一個16進制字符(如“C”)對應的數(shù)字(如12),避免了求取ASCII碼后再做調整的麻煩。PrivateConstHEX_CHAR_SETAsString="0123456789ABCDEF"一個英文字母對應一個ASCII碼,一個漢字則對應一個Unicode編碼,前者是一個字節(jié),后者是兩個字節(jié)。既然Unicode是兩個字節(jié),就涉及到高字節(jié)和低字節(jié)的順序問題。這就需要引入System.Text命名空間,利用其ASCIIEncoding類的GetString方法將字節(jié)數(shù)組轉換為英文字符串,利用GetBytes方法將英文字符串轉換為字節(jié)數(shù)組。另外,UnicodeEncoding類用來處理中文信息,如果初始化時bigEndian為True時表示順序存放,即高字節(jié)在前,低字節(jié)在后;bigEndian為False時表示逆序存放,即低字節(jié)在前,高字節(jié)在后。13.216進制字符串的預處理對于16進制字符串“3D2A”,為了便于閱讀,中間加一個空格寫成“3D2A”將更好;如果寫成“3D2a”就顯得不整齊了,空格寫錯地方變成“3D2a”就亂了。對16進制字符串進行預處理,就是將各種形式的16進制字符串規(guī)范化成大寫且中間沒有空格的16進制字符串,這樣,便于將每兩個16進制字符轉換為一個字節(jié)。String對象的TrimEnd方法只能刪除字符串尾部的指定字符,TrimStart方法只能刪除首部的指定字符,Trim方法只能刪除首尾的指定字符,這些方法都不能刪除中間的指定字符。TrimAllChar方法可以刪除字符串strVal中的所有指定字符chVar。如果strVal中沒有指定字符chVar,則直接返回strVal。否則,調用String類的Split方法,以chVar為分隔符,結果中刪除空項,將strVal分割為子字符串組成的數(shù)組,并存放到臨時字符串數(shù)組strTmp中,最后用一個For循環(huán)將strTmp數(shù)組中的子字符串連接起來,保存到strResult變量中,并返回該變量。在ByteProcess模塊中,調用TrimAllChar方法刪除16進制字符串中的空格,因而,第二個參數(shù)應該為一個空格字符。PublicFunctionTrimAllChar(ByValstrValAsString,ByValchVarAsString)AsStringDimstrTmp()AsStringDimstrResultAsString=""IfstrVal.Contains(chVar)=FalseThenReturnstrValstrTmp=strVal.Split(chVar.ToCharArray,_System.StringSplitOptions.RemoveEmptyEntries)ForIAsInteger=0TostrTmp.Length-1strResult&=strTmp(I)NextIReturnstrResultEndFunction16進制字符串與16進制字節(jié)(數(shù)組)相對應,兩個16進制字符對應一個字節(jié),因而,對于字節(jié)3,對應的16進制字符串應該是"03",同理,16進制字符串應該包含偶數(shù)個16進制字符。GetEvenHexChars方法刪除16進制字符串中最后一個不成對的字符(如果存在的話)。首先計算字符串strVal的長度,如果模2余1,表示字符串長度為單數(shù),則減去1變成偶數(shù)。如果減1后,長度變?yōu)?,則返回空字符串,否則,取源字符串strVal中的子字符串,并返回該子字符串。PublicFunctionGetEvenHexChars(ByValstrValAsString)AsStringDimnAsIntegern=strVal.LengthIfnMod2=1Thenn-=1Ifn=0ThenReturn""ElseReturnstrVal.Substring(0,n)EndIfEndFunctionNormalizeHexChars方法完成16進制字符串的綜合標準化,首先調用TrimAllChar方法刪除其中的所有空格,然后,調用GetEvenHexChars方法將字符串個數(shù)變成偶數(shù),最后,調用String對象的ToUpper方法轉換為大寫。PublicFunctionNormalizeHexChars(ByValstrHexCharsAsString)AsStringReturnGetEvenHexChars(TrimAllChar(strHexChars,"")).ToUpperEndFunction本節(jié)的16進制字符串的預處理方法在即時窗口中的測試效果如圖13.1所示。13.4字節(jié)(數(shù)組)轉換為16進制字符串ByteToTwoHexChars方法實現(xiàn)一個字節(jié)到兩個16進制字符的轉換,例如,將字節(jié)0x3d轉換為"3D"。ByteToTwoHexChars方法主要使用了7.6.2節(jié)中的數(shù)據(jù)的格式化處理知識。PublicFunctionByteToTwoHexChars(ByValiValAsInteger)AsString'from0x3dto"3D"iVal=iValAnd&HFFReturniVal.ToString("X2")EndFunctionTwoBytesToHexChars方法實現(xiàn)將兩個字節(jié)轉換為一個16進制字符串,與ByteToTwoHexChars方法的原理類似。TwoBytesToHexChars方法主要用于將雙字節(jié)長度的數(shù)據(jù)轉換為16進制字符串。PublicFunctionTwoBytesToHexChars(ByValiValAsLong)AsString'from0x3d2cto"3D2C"iVal=iValAnd&HFFFFReturniVal.ToString("X4")EndFunction在信息傳輸過程中,一般需要將接收到的數(shù)據(jù)進行累加,最后作為一個整體進行處理。將原始的兩個字節(jié)數(shù)組連接起來,沒有連接兩個字符串方便,BytesToHexChars方法主要用于將原始字節(jié)數(shù)組以16進制字符串的形式進行保存。BytesToHexChars方法調用ByteToTwoHexChars方法,依次將一個字節(jié)轉換為兩個16進制字符,然后連接起來。PublicFunctionBytesToHexChars(ByRefbyteArrayAsByte())AsStringDimIAsIntegerDimstrHexCharsAsString=""ForI=0TobyteArray.Length-1strHexChars&=ByteToTwoHexChars(byteArray(I))NextIReturnstrHexCharsEndFunction13.516進制字符串轉換為字節(jié)(數(shù)組)要將16進制字符串轉換為字節(jié),首先需要將16進制字符轉換為對應的數(shù)值。例如,將"A"轉換為整數(shù)10、"9"轉換為整數(shù)9等。HexCharToNum方法利用16進制字符集常量HEX_CHAR_SET的IndexOf方法獲取轉換值,第二個參數(shù)表示忽略大小寫,因而,無論對于字符"A"或"a"都能得到結果10。如果給定的字符不是16進制字符,將返回0。PublicFunctionHexCharToNum(ByValcValAsString)AsByteDimbDataAsByteIfcVal.Length<>1ThenReturn0bData=HEX_CHAR_SET.IndexOf(cVal,_StringComparison.CurrentCultureIgnoreCase)ReturnbDataEndFunction實現(xiàn)了將16進制字符轉換為數(shù)值后,對于"A7",只要將第一個字符轉換所得數(shù)值乘以16再加上第二個字符轉換所得數(shù)值即可得到字節(jié),TwoHexCharsToByte方法實現(xiàn)這一功能。PublicFunctionTwoHexCharsToByte(ByValstrHexCharsAsString)AsByte'from"3D"to3*16+13DimnHex0AsByteDimnHex1AsBytestrHexChars=NormalizeHexChars(strHexChars)IfstrHexChars.Length<>2ThenReturn0nHex1=HexCharToNum(strVal.Substring(0,1))nHex0=HexCharToNum(strVal.Substring(1,1))ReturnnHex1*16+nHex0EndFunctionHexCharsToBytes方法將16進制字符串轉換為字節(jié)數(shù)組,主要調用TwoHexCharsToByte方法,將每兩個16進制字符轉換為一個字節(jié),存入字節(jié)數(shù)組。PublicFunctionHexCharsToBytes(ByValstrHexCharsAsString)AsByte()DimIAsIntegerDimnLengthAsIntegerDimbBytes()AsByteIfstrHexChars=""ThenReturnNothingstrHexChars=NormalizeHexChars(strHexChars)'規(guī)范化nLength=strHexChars.Length/2'求得字節(jié)長度ReDimbBytes(nLength-1)'可變數(shù)組保存字節(jié)序列ForI=0TonLength-1bBytes(I)=TwoHexCharsToByte((strHexChars.Substring(I*2,2)))NextIReturnbBytesEndFunction本節(jié)的HexCharsToBytes方法和上一節(jié)中的BytesToHexChars方法在即時窗口中的測試效果如圖13.3所示。前者將6個16進制字符轉換成了具有三個元素的一維字節(jié)數(shù)組,后者又將此數(shù)組轉換回原來的16進制字符串。13.11字節(jié)的位操作與二進制轉換在匯編語言中,對一個字節(jié)中的指定位進行測試、置位或復位,是一種基本技巧。在計算機監(jiān)控系統(tǒng)中,常用1表示開關閉合,0表示開關打開(反之也可),因而,測試開關狀態(tài)是通過位測試進行的,控制開關閉合和打開則是通過對控制字節(jié)置位和復位進行的。13.11.1字節(jié)的位操作CheckByteBit方法測試字節(jié)中的某一位是否為1,第一個參數(shù)bData是需要測試的字節(jié),第二個參數(shù)nBit表示第幾位。bTmp將nBit位置1,然后,bData和bTmp相與(And),如果結果不等于0,則返回True,表示nBit位為1;否則,返回False,表示nBit位為0。PublicFunctionCheckByteBit(ByValbDataAsByte,ByValnBitAsInteger)AsBooleanDimbTmpAsByteDimbResultAsByteIfnBit>7OrnBit<0ThenReturnFalsebTmp=2^nBitbResult=bDataAndbTmpIfbResult<>0ThenReturnTrueElseReturnFalseEndIfEndFunctionSetByteBit方法利用或運算(Or)給nBit位置位,并返回置位后的字節(jié)。PublicFunctionSetByteBit(ByValbDataAsByte,ByValnBitAsInteger)AsByteDimbTmpAsByteIfnBit>7OrnBit<0ThenReturnbDataEndIfbTmp=2^nBitReturnbDataOrbTmpEndFunctionResetByteBit方法使得nBit位復位,并返回復位后的字節(jié)。如果一個字節(jié)的某位為0,其它位為1,那么,這個字節(jié)與其它字節(jié)相與,即可使得該位復位,且其它位不受影響。ResetByteBit方法首先通過異或生成這樣的一個字節(jié),并保存到bTmp中,然后,利用bTmp與bData相與,即可得到期望的結果。PublicFunctionResetByteBit(ByValbDataAsByte,ByValnBitAsInteger)AsByteDimbTmpAsByteIfnBit>7OrnBit<0ThenReturnbDataEndIfbTmp=(2^nBit)Xor&HFFReturnbDataAndbTmpEndFunction13.11.2二進制轉換為了查看一個字節(jié)中1和0的具體情況,需要將字節(jié)轉換為二進制字符串進行顯示;如果用戶提供8位二進制字符串,也應該能夠轉換為一個字節(jié)進行處理。ByteToBinaryString方法實現(xiàn)將一個字節(jié)轉換為二進制字符串的功能,主要在一個For循環(huán)中調用CheckByteBit方法從高位到低位進行逐位檢查,如果為1,就累加"1";如果為0,就累加"0",最后返回結果。PublicFunctionByteToBinaryString(ByValbDataAsByte)AsStringDimstrResultAsString=""ForIAsInteger=7To0Step-1IfCheckByteBit(bData,I)ThenstrResult&="1"ElsestrResult&="0"EndIfNextIReturnstrResultEndFunctionBinaryStringToByte方法實現(xiàn)將8個二進制字符串轉換為一個字節(jié)的功能。J是二進制字符串strBinary的索引號,從0開始依次截取二進制字符存入strChar中。For循環(huán)從7到0,如果strChar中包含非二進制字符,說明strBinary是一個錯誤的二進制字符串,就直接返回0;如果strChar為"1",則存放結果的bResult與該位的權值相加,最后返回bResult即可。PublicFunctionBinaryStringToByte(ByValstrBinaryAsString)AsByteDimbResultAsByteDimJAsInteger=0DimstrCharAsStringIfstrBinary.Length<>8ThenReturn0ForIAsInteger=7To0Step-1strChar=strBinary.Substring(J,1)SelectCasestrCharCase"0","1"IfstrChar="1"ThenbResult+=2^IEndIfCaseElseReturn0EndSelectJ+=1NextIReturnbResultEndFunction13.11.3應用測試新建一個窗體應用程序WinApp_Binary,分別繪制4個標簽、文本框和命令按鈕,并添加ByteProcess模塊。Hex文本框中用于輸入兩個16進制字符,Bit文本框中輸入所要處理的位(0-7),為了盡量使程序簡單,本程序沒有檢查用戶輸入的數(shù)據(jù),要求這兩個文本框中必須都輸入數(shù)據(jù),且符合要求。在窗體類中做如下定義,bData是所要處理的字節(jié),nBit是字節(jié)中的位。RefreshData方法將Hex文本框中的兩個16進制字符轉換為一個字節(jié),存入bData中;將Bit文本框中的文本解析為整型數(shù),存入nBit中。DimbDataAsByteDimnBitAsIntegerPrivateSubRefreshData()bData=TwoHexCharsToByte(txtHex.Text)nBit=Integer.Parse(txtBit.Text)EndSub【ToBinary】按鈕首先調用RefreshData方法刷新數(shù)據(jù),然后,調用ByteToBinaryString方法將字節(jié)轉換為二進制字符串,放入Binary文本框中進行顯示。RefreshData()txtBinary.Text=ByteToBinaryString(bData)【Check】按鈕調用CheckByteBit方法進行位測試,結果通過MessageBox告知用戶。RefreshData()IfCheckByteBit(bData,nBit)ThenMessageBox.Show("Theresultis1.")El
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地理實踐力視域下高中地理項目式學習教學設計研究
- 第1課 課題二《中外節(jié)日·中秋節(jié)和感恩節(jié)的比較》(教學設計)-2024-2025學年六年級上冊綜合實踐活動浙教版
- Unit 4 My body(教學設計)-2024-2025學年科普版(2024)英語三年級上冊
- Chapter 1 Buying Snacks(教學設計)-2023-2024學年新思維小學英語2B
- 第 7課 隋唐制度的變化與創(chuàng)新 教學設計-2023-2024學年高一統(tǒng)編版2019必修中外歷史綱要上冊
- 第23課《真理誕生于一百個問號之后》教學設計-2024-2025學年統(tǒng)編版語文(五四學制)六年級上冊
- Unit2 Improving Yourself Writing a Reflection 教學設計-2024-2025學年高中英語外研版(2019)選擇性必修第二冊
- 連帶責任保證擔保借款合同(6篇)
- 第四單元《邏輯的力量》教學設計 2024-2025學年統(tǒng)編版高中語文選擇性必修上冊
- 第6課 責任與角色同在2024-2025學年八年級道德與法治上冊同步教學設計 河北專版
- 控制測量-全站儀傳統(tǒng)法導線測量(工程測量課件)
- 《我的家族史》課件
- 干部考察報告表()
- 《攝影圖片分析》課件
- 青少年社會支持評定量表
- kW直流充電樁的設計
- 施工圖總目錄
- 《裝配化工字組合梁鋼橋六車道3x30m通用圖》(3911-05-2021)【可編輯】
- 02S404給排水圖集標準
- 人民醫(yī)院診斷證明書
- 六年級勞動與技術下冊《課程綱要》
評論
0/150
提交評論