




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
*******************實(shí)踐教學(xué)*******************蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院2015年秋季學(xué)期計(jì)算機(jī)通信課程設(shè)計(jì)題目:基于WindowsAPI編程的串行異步通信程序設(shè)計(jì)專業(yè)班級: 姓名: 學(xué)號: 指導(dǎo)教師: 王惠琴 成績: 摘要本文系統(tǒng)介紹了VisualC++實(shí)現(xiàn)異步串行通信的基本原理及過程,講述了用Windows函數(shù)庫API函數(shù)實(shí)現(xiàn)和C運(yùn)行時(shí)的實(shí)現(xiàn)方法,利用VC++6.0來做用戶界面,根據(jù)所需可以自己設(shè)計(jì)界面布局,設(shè)備的數(shù)據(jù)設(shè)置和ID設(shè)置,我們可以將主要工作集中在串口編程方面,結(jié)合串口通信的機(jī)理和同步技術(shù),最終實(shí)現(xiàn)串口異步通信功能。關(guān)鍵詞:串口通信;異步I/O;VisualC++應(yīng)用目錄TOC\o"1-5"\h\z前言 2\o"CurrentDocument"一.串口簡單介紹 3\o"CurrentDocument"RS-232簡介 3\o"CurrentDocument"串口通信參數(shù) 4\o"CurrentDocument"數(shù)據(jù)校驗(yàn)方法 4\o"CurrentDocument"串口通信原理與特點(diǎn) 4\o"CurrentDocument"串口通信的傳輸方式 5\o"CurrentDocument"二.串行通信中主要的技術(shù)問題 5\o"CurrentDocument"調(diào)用Win32API通信函數(shù) 5數(shù)據(jù)的傳輸 6\o"CurrentDocument"三.串行異步通信系統(tǒng)設(shè)計(jì) 6\o"CurrentDocument"3.1系統(tǒng)需求分析 6\o"CurrentDocument"系統(tǒng)分析 7系統(tǒng)設(shè)計(jì) 7\o"CurrentDocument"總結(jié) 12\o"CurrentDocument"附錄: 14VisualC++是建立在WindowArray5和WindowNT32位程序上的可視化編程環(huán)境,對于控制系統(tǒng)的可視化開發(fā)提供了極大的便利,但是對于計(jì)算機(jī)控制系統(tǒng)中數(shù)據(jù)采集、控制,用VisualC++實(shí)現(xiàn)的介紹卻很少?;诖耍榻BVisualC++在測控系統(tǒng)應(yīng)用中的基本原理及應(yīng)用,其中異步串行通信是關(guān)鍵。其基本構(gòu)成是:(單片機(jī)系統(tǒng))完成信號檢測、A/D轉(zhuǎn)換和簡單的控制功能,通過系統(tǒng)總線(如RS-232C與上位機(jī)(PC機(jī))相連,進(jìn)行監(jiān)測、控制,形成主從式結(jié)構(gòu)。串口通信是計(jì)算機(jī)與其他設(shè)備進(jìn)行數(shù)據(jù)通信時(shí)經(jīng)常使用的方法之一,他具有實(shí)現(xiàn)簡單,使用靈活方便,數(shù)據(jù)傳輸可靠等優(yōu)點(diǎn),因而在工業(yè)控制、數(shù)據(jù)采集和實(shí)時(shí)監(jiān)控系統(tǒng)中得到廣泛應(yīng)用本文的串口通信軟件的開發(fā)沒有使用任何串口通信的第三方封裝控件,全部使用windowsAPI函數(shù)對串口進(jìn)行操作和配置,而且使用了多線程技術(shù)和異步I/0操作,提高了串口通信的效率和程序的靈活性。.串口簡單介紹RS-232簡介在RS-232標(biāo)準(zhǔn)中,字符是以一序列的位元串來一個(gè)接一個(gè)的串列(serial)方式最常用的編碼格式是異步起停asynchronousstart-stop格式,它使用一個(gè)起始位元后面緊跟7或8個(gè)數(shù)據(jù)位元(bit),這個(gè)可能是奇偶位元,然后是兩個(gè)停止位元。所以發(fā)送一個(gè)字符至少需要10位元,帶來的一個(gè)好的效果是使全部的傳輸速率,發(fā)送信號的速率以10劃分。一個(gè)最平常的代替異步起停方式的是使用高級數(shù)據(jù)鏈路控制協(xié)議(HDLC)。在RS-232標(biāo)準(zhǔn)中定義了邏輯一和邏輯零電壓級數(shù),以及標(biāo)準(zhǔn)的傳輸速率和連接器類型。信號大小在正的和負(fù)的 3-15v之間。RS-232規(guī)定接近零的電平是無效的,邏輯一規(guī)定為負(fù)電平,有效負(fù)電平的信號狀態(tài)稱為傳號marking,它的功能意義為OFF邏輯零規(guī)定為正電平,有效正電平的信號狀態(tài)稱為空號spacing,它的功能意義為ON根據(jù)設(shè)備供電電源的不同,土5、土10、土12和土15這樣的電平都是可能的。在TxD和RxD上:邏輯1(MARK)=-3V--15V,邏輯0(SPACE)=+3-+15V,在RTSCTSDSRDTR和DCD等控制線上:信號有效(接通,ON狀態(tài),正電壓)=+3V?+15V信號無效(斷開,OFF狀態(tài),負(fù)電壓)=-3V?-15mark和space是從電傳打字機(jī)中來的術(shù)語。電傳打字機(jī)原始的通信是一個(gè)簡單的中斷直流電路模式,類似與圓轉(zhuǎn)盤電話撥號的中的信號。Marking狀態(tài)是指電路是斷開的,spacing狀態(tài)就是指電路是接通的。一個(gè)space就表明有一個(gè)字符要開始發(fā)送了,相應(yīng)的停止的時(shí)候,停止位就是 marking。當(dāng)線路中斷的時(shí)候,電傳打字機(jī)不打印任何有效字符,周期性的連續(xù)收到全零信號。在串行通訊時(shí),要求通訊雙方都采用一個(gè)標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來進(jìn)行通訊.RS232的邏輯電平與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。因此,為了能夠同計(jì)算機(jī)接口或終端的TTL器件連接,必須在EIA-RS-232C與TTL電路之間進(jìn)行電平和邏輯關(guān)系的變換。實(shí)現(xiàn)這種變換的方法可用分立元件,也可用集成電路芯片。目前較為廣泛地使用集成電路轉(zhuǎn)換器件,如MC1488SN75150芯片可完成TTL電平到EIA電平的轉(zhuǎn)換,而MC1489SN75154可實(shí)現(xiàn)EIA電平到TTL電平的轉(zhuǎn)換。MAX23芯片可完成TTL^tEIA雙向電平轉(zhuǎn)換。串口通信參數(shù)波特率:表示每秒鐘傳輸?shù)乃俾省_@個(gè)值與距離正好成反比。速率越大它通信的距離就越短。數(shù)據(jù)位:衡量實(shí)際通信數(shù)據(jù)位的參數(shù)。一般標(biāo)準(zhǔn)的值為5位、7位和8位,這取決于通信協(xié)議。我們一般用數(shù)據(jù)包來表示通信的情況。停止位:單個(gè)數(shù)據(jù)包的最后一位。數(shù)據(jù)在傳輸時(shí)兩端設(shè)備都會存在一點(diǎn)點(diǎn)不同步。所以停止位在用來表示數(shù)據(jù)傳輸結(jié)束時(shí),它還能提供校正時(shí)間同步機(jī)會。停止位數(shù)據(jù)越多,不同時(shí)鐘同步容忍度越大,相對傳輸?shù)臄?shù)率就越慢。基偶校驗(yàn):串口通信中一種簡單的校驗(yàn)方式,它分為基、偶、高和低。數(shù)據(jù)校驗(yàn)方法串行數(shù)據(jù)在傳輸過程中,由于干擾可能引起信息的出錯,例如,傳輸字符’E'其D7到D0各位為:0100,0101=45H由于干擾,可能使碼元變由0變?yōu)?,或則由1變?yōu)?,這種情況,我們稱為出現(xiàn)了“誤碼”。我們把如何發(fā)現(xiàn)傳輸中的錯誤,叫“檢錯”。發(fā)現(xiàn)錯誤后,如何消除錯誤,叫“糾錯”。最簡單的檢錯方法是“奇偶校驗(yàn)”,即在傳送字符的各位之外,再傳送1位奇偶校驗(yàn)位??刹捎闷嫘r?yàn)或偶校驗(yàn)。奇校驗(yàn):所有傳送的數(shù)位(含字符的各數(shù)位和校驗(yàn)位)中,“1”的個(gè)數(shù)為奇數(shù),如:10110,010,100110,0001第一位為奇校驗(yàn)位,其余各位為D7到D0位。偶校驗(yàn):所有傳送的數(shù)位(含字符的各數(shù)位和校驗(yàn)位)中,“ 1”的個(gè)數(shù)為偶數(shù),如:10100,010100,1000001第一位為偶校驗(yàn)位,其余各位為D7到D0位。奇偶校驗(yàn)?zāi)軌驒z測出信息傳輸過程中的部分誤碼(1位誤碼能檢出,2位及2位以上誤碼不能檢出),同時(shí),它不能糾錯。在發(fā)現(xiàn)錯誤后,只能要求重發(fā)。但由于其實(shí)現(xiàn)簡串口通信原理與特點(diǎn)串行端口是CPI與串行設(shè)備間的編碼轉(zhuǎn)換器,當(dāng)CPUS過串行端口發(fā)數(shù)據(jù)時(shí),字節(jié)數(shù)據(jù)列隊(duì)成串行位,串行端口接收數(shù)據(jù)時(shí),串行位轉(zhuǎn)換成字節(jié)數(shù)據(jù).所以必須安裝相應(yīng)的驅(qū)動程序.串行通信有成本低的特點(diǎn),而且可以在現(xiàn)有的電話網(wǎng)絡(luò)上進(jìn)行傳輸,家庭通過電話線上網(wǎng)即是這種方式.只要配置一個(gè)相應(yīng)的通信接口,如:Modem.串口通信的傳輸方式單工:只能從一頭傳輸?shù)搅硪活^,如只能從A向B傳或者B向A傳,如看電視,只允許電視臺向電視發(fā)數(shù)據(jù),不允許電視向電視臺發(fā)數(shù)據(jù).在單工傳輸方式上一般采用兩個(gè)通信,一個(gè)通道傳輸數(shù)據(jù),一個(gè)通道傳輸控制信號.半雙工:允許互傳信息,但是不能同時(shí)進(jìn)行,如對講機(jī),A說話時(shí),B不能說話,B說話時(shí)A不能說話.全雙工:允許雙同時(shí)通信,如講電話.異步傳輸:按字節(jié)為單位傳輸,異步傳輸方式也叫起止方式,在被傳輸?shù)淖止?jié)前后加起止位,起止位無信號時(shí)處于高電平,接收方檢測到低電平信號表示開始接收,收到停止信號表示傳輸完成.物理連接建立后,需要使用一種機(jī)制使對方正確解釋發(fā)送的數(shù)據(jù),發(fā)送方安位發(fā)出數(shù)據(jù)后,接收方如何識別這些數(shù)據(jù),并如何正確組裝成正確的字節(jié).這就需要同步技術(shù).數(shù)據(jù)同步技術(shù)一般解決如下問題:確定發(fā)送數(shù)據(jù)起始時(shí)間,發(fā)送數(shù)據(jù)的傳輸速率,發(fā)送數(shù)據(jù)所需的時(shí)間,發(fā)送時(shí)間間隔同步傳輸:以數(shù)據(jù)塊為單位傳輸,在塊的前后加一個(gè)特殊字節(jié)表示起止,傳輸效率高,線路利用率高,設(shè)備負(fù)擔(dān)也大.單,仍得到了廣泛使用。二.串行通信中主要的技術(shù)問題2.1調(diào)用Win32API通信函數(shù)直接調(diào)用WindowsAPI函數(shù),可以清楚地理解串口通信的機(jī)制,根據(jù)需要靈活地配置串口的各種參數(shù)和屬性,而且直接調(diào)用低層API函數(shù),通信效率比較高,但付出的代價(jià)就是程序較復(fù)雜,編程周期長,適合于大型通信程序及通訊質(zhì)量要求較高的場合。在32位的Windows系統(tǒng)中,串口通信是作為文件處理的,串口操作一般為打開、關(guān)閉、讀取、寫入等操作,相應(yīng)的WindowsAPI函數(shù)如下:CreateFile()函數(shù):實(shí)現(xiàn)串口的初始化并打開串口,返回串口句柄資源以供后續(xù)進(jìn)程調(diào)用。CloseFile()函數(shù):關(guān)閉串口,串口是非共享資源,應(yīng)用程序以獨(dú)占方式使用通信結(jié)束應(yīng)立即關(guān)閉。ReadFile()函數(shù):從串口輸入緩沖區(qū)讀取數(shù)據(jù)流。WriteFile()函數(shù):向串口輸出緩沖區(qū)發(fā)送數(shù)據(jù)。GetCommState()函數(shù):獲取串口的當(dāng)前配置。⑹SetCommState()函數(shù):重新分配串口資源的各個(gè)參數(shù)。由于WindowsAPI函數(shù)大部分是用C或C++編寫,所以在VisualBasic6.0中調(diào)用WindowsAPI函數(shù)之前必須先在模塊級代碼上用Declare語句對所調(diào)用的函數(shù)和用到的數(shù)據(jù)結(jié)構(gòu)進(jìn)行聲明,具體的函數(shù)聲明及數(shù)據(jù)結(jié)構(gòu)請參考朱友芹編《新編WindowsAPI參考大全》。2.2數(shù)據(jù)的傳輸串行通信中主要有兩個(gè)技術(shù)問題,一個(gè)是數(shù)據(jù)傳送、另一個(gè)是數(shù)據(jù)轉(zhuǎn)換。數(shù)據(jù)傳送主要解決傳送中的標(biāo)準(zhǔn)、格式及工作方式等問題。數(shù)據(jù)轉(zhuǎn)換是指數(shù)據(jù)的串并行轉(zhuǎn)換。具體說,在發(fā)送端,要把并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù);而在接收端,卻要把接收到的串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)。三.串行異步通信系統(tǒng)設(shè)計(jì)3.1系統(tǒng)需求分析一.確定基本功能自動尋找串口,并自動添加到下拉框中共選擇;有波特率、數(shù)據(jù)位、停止位、校驗(yàn)位的選擇設(shè)置;串口打開控制按鈕;發(fā)送、清除按鈕;接收是自動實(shí)現(xiàn)的;有定時(shí)自動發(fā)送功能;有傳送文件功能;有狀態(tài)欄顯示,指示串口狀態(tài),設(shè)置參數(shù)和發(fā)送接收顯示。二.一般編制串行通信程序分以下幾個(gè)部分:打開串行端口:打開通信資源,設(shè)置通信參數(shù)、設(shè)置通信事件、創(chuàng)建讀、寫事件、進(jìn)入等待串口消息循環(huán)。讀取串行端口信息:當(dāng)串口發(fā)生EV_RXCHA接收到字符并放入了輸入緩沖區(qū))消息后讀取串口、數(shù)據(jù)傳輸錯誤處理、字符串處理如回車符、空格并相應(yīng)轉(zhuǎn)化成數(shù)據(jù),如果模擬量還要進(jìn)行數(shù)據(jù)檢驗(yàn)等功能。寫串行端口信息:將要發(fā)送的信息寫入串口,相應(yīng)進(jìn)行錯誤處理。
斷開串行端口連接:關(guān)閉事件,清除通信事件,丟棄通信資源并關(guān)閉。3.2系統(tǒng)分析(1) 編程思想:因?yàn)榇谕ㄐ挪糠执a我可能用在以后的單片機(jī)上位機(jī)上,因此考慮單獨(dú)形成CPF和H文件,定義為comm.cpp和comm.h在comm.cpp中編寫串口創(chuàng)建、打開、關(guān)閉以及用于自動接收的代碼,同時(shí)加入進(jìn)制轉(zhuǎn)換或顯示的函數(shù),這些在comm.h文件中申明,在主對話框中包含comm.h即可。(2) 串口編程的基本流程圖:打開串口L 關(guān)閉串口3.3系統(tǒng)設(shè)計(jì)打開串口L 關(guān)閉串口3.3系統(tǒng)設(shè)計(jì)1.創(chuàng)建項(xiàng)目File->New->Projects選擇MFCAppWizard(exe),項(xiàng)目名稱Commassist圖1新建工程圖創(chuàng)建界面IDR_MAINFRAME原為MFC提供的圖標(biāo),這里我直接改成自己的,生成EXE后I-i|v^lCd fiilfll£9comnnas-sii^t^Picture,在打開按鈕旁Lilc>3ovmn ilaiCBIFRbIH-HKiHi■!4InI-i|v^lCd fiilfll£9comnnas-sii^t^Picture,在打開按鈕旁Lilc>3ovmn ilaiCBIFRbIH-HKiHi■!4Inlift4.0mmn-siul^it4l向HefliifriiFCipJhllfl:SI■快h|4LJPltsBourtBV-ileic-才加入自繪的打開和關(guān)閉圖標(biāo):先加入工具條中的并如圖將― e選為默認(rèn)的IDI_ICON_CLOSE如下圖二.Vil.用[ hI 寓厲£■IE!HcnilMehcl⑴匚|f Dep£■rid哼止扭|^tefi廠5SL-I■六逸軻且你Ctaiic寶ii局口打疔肆口:育云tel靈巨云喬-自動生空「迓注衣件-riih圖2創(chuàng)建界面圖L十六電制雄諼F面對各個(gè)按鈕及編輯框ID和標(biāo)題的設(shè)置進(jìn)行描述:咗…丄心擠書曲口'牛匚1'護(hù)持牟PusLhSutton底性-?V常規(guī)|偉攻|L十六電制雄諼F面對各個(gè)按鈕及編輯框ID和標(biāo)題的設(shè)置進(jìn)行描述:咗…丄心擠書曲口'牛匚1'護(hù)持牟PusLhSutton底性-?V常規(guī)|偉攻|廳儲件我|inr'■止便l_S-lAtLc.空逆eta口十曰¥EHh總科 白ifirfriSI'DCCOMGONTROL可口阿 _蛆[國已攀用IA1 頁申I蒜站陽IZI標(biāo)趣邸 |扌丁幵申口L精HJ1心什打圖2按鈕ID及標(biāo)題設(shè)置ra曰
血曰
nmm
rr屈圖3按鍵標(biāo)題及ID設(shè)置右鍵串口對應(yīng)的ComboBoxID設(shè)置為IDC_COMLISJType設(shè)置為DropList右鍵波特率對應(yīng)的ComboBoxID設(shè)置為IDCBAUD右鍵數(shù)據(jù)位對應(yīng)的ComboBoxID設(shè)置為IDCBDATA右鍵停止位對應(yīng)的ComboBox右鍵串口對應(yīng)的ComboBoxID設(shè)置為IDC_COMLISJType設(shè)置為DropList右鍵波特率對應(yīng)的ComboBoxID設(shè)置為IDCBAUD右鍵數(shù)據(jù)位對應(yīng)的ComboBoxID設(shè)置為IDCBDATA右鍵停止位對應(yīng)的ComboBoxID設(shè)置為IDCBSTOP右鍵校驗(yàn)位對應(yīng)的ComboBoxID設(shè)置為IDC_CALType及Sort同上。接收EDIT框ID設(shè)置為IDCEDITRX發(fā)送EDIT框ID設(shè)置為IDCEDITTX自動發(fā)送時(shí)間間隔的EDIT框ID設(shè)置為IDC_EDIT_TIMER選擇文件后面的EDIT框ID設(shè)置為IDC_EDIT_FILEPATH接收區(qū)的十六進(jìn)制顯示的CheckBox復(fù)選框ID設(shè)置為IDC_CHECK_HEXRX發(fā)送區(qū)的十六進(jìn)制發(fā)送的CheckBox復(fù)選框ID設(shè)置為IDC_CHECK_HEXTX按鈕“打開串口”ID設(shè)置為IDC_COMCONTROL按鈕“清空顯示區(qū)”ID設(shè)置為IDC_BTN_CLRRX按鈕“手動發(fā)送”ID設(shè)置為IDC_BTN_HANDSEND按鈕“清空發(fā)送區(qū)”ID設(shè)置為IDC_BTN_CLRTX按鈕“自動發(fā)送”ID設(shè)置為IDC_BTN_AUTOSEND按鈕“選擇文件”ID設(shè)置為IDC_BTN_SELCTFILE按鈕“發(fā)送文件”ID設(shè)置為IDC_BTN_SENDFILE程序編寫1.打開串口在對串行口進(jìn)行所有的操作之前,首先要將其打開。串行口的打開可以使用
CreateFile函數(shù),CreateFile函數(shù)將返回一個(gè)句柄,在隨后與該串行口相關(guān)的各種操作中使用。與文件操作相同,在利用CreateFile打開串行口時(shí),也可以將串行口指定為“讀訪問權(quán)限”、“寫訪問權(quán)限”或“讀寫訪問權(quán)限”3上3上zzJS<DurceFilesfSletjnijin.f2p|p”盅SIdAlx+cpp.-:HeanderFileiESIcxinrini.hSIoiJiPiinuiEulLilil-j|口1Hll|k啊c^rmrriHifH3iirii4lg]FLcsourc;cBliiSIStdabc.h4HEB^uurEeKIIes*二JFxiernnlPftgitifirica?UM.KEADCnHII:"-上:’||消懇“H4eadC0nm();ibr*ak;}fturn□Dialog:^ytinriowFrcK:(atessjg?,wFar^rnPlP^rr?ni); }n 二 帝息處理㈤故結(jié)除 扌丁幵串□圈齡程口,ua*ddlCConwnassi.stiilDiLq:lOnCopicointrolf)//IiIDhsniidyuurGnutro11notifiedtLun'hjiRtJlrrininAfimrlvnDfiira nppnRail?nTrn(p石ilZStpingsTeiip,siTt*np;"渥特率F拉征魁査nreimp^Ri_t>aua?tietcurSffK>;醒■空0nRjiuil1醒■空0nRjiuil110;bta<hjik;11nFlauil-CPRny母carse2mklHiiidi—[:舊尺Qrfalk;CaseJnLiaudi—cub_12DO;break:CHffJ|n^dUiJi=CSRtirvdk;car?5P5nRAiivt=RfSR■ifEftHi;ihrpah:fiMuQciUdl—CER96BE3:itiia^ahz圖4打開串口程序編寫(2)串口的狀態(tài)讀取和屬性設(shè)置對串口進(jìn)行設(shè)置:windows系統(tǒng)利用SetCommState函數(shù)修改串行口的當(dāng)前參數(shù)配置。GetCommState函數(shù)的第一個(gè)參數(shù)hFile是由CreateFile函數(shù)返回指向已打開串行口的句柄。第二個(gè)參數(shù)指向設(shè)備控制塊DCB如果函數(shù)調(diào)用成功,則返回值為非0;若函數(shù)調(diào)用失敗,則返回值為0。當(dāng)應(yīng)用程序僅僅需要修改一部分串行口的配置值時(shí),可以通過GetCommState函數(shù)獲得當(dāng)前的DCE結(jié)構(gòu),然后更改參數(shù),再調(diào)用SetCommState函數(shù)設(shè)置修改過的DCB來配置串行口。清空接收和發(fā)送緩沖區(qū):最好使用PurgeCommS最好使用PurgeCommS數(shù)將串“清空顯示區(qū)”和“清空發(fā)送區(qū)”的編碼:F-_3Bauref-File&J]<.om>rfi.cppfl村F-_3Bauref-File&J]<.om>rfi.cppfl村commas-sis-1t<J]SWAt^l:|lpI-p~JHe*dBfFilrscomm.fiCOMillilbflAldit#corBmassi-sKI0coPwmwal-BtiiRir^-nU'rrn.fi*SidsfiMcbi?ljric■巾mc杞riiitflFLeAdMf.tHl_LMte-rniflli|JE|i£ihiJl{丿FItftb-UiiAddi¥<!<!*■iLCjfbtrfilnntlf1c.Atlorbli^fiJh*reUipil #fTKU>F):CStrlngh^wln:q^triny9T^?|iSif(m_chech:_tirKrw><no-MLn-bl-=ipl E CiEtrIih.碇尸“;C?lfiiiiKjilifiri[I?C_IEJi_NLX)>IfiCMnauwIvalfhejiKn)£ Inf:-^ 1M 為斗色"J?怦U> 空"。Q^thl^iltoriCIbCEDIT. KUt ibuT^Mfc<ct^Int?//fltr11ftp-.7^-7A.IBC 旺貳*岸>uoi4SGnpirirti.^t11upi尊::QnGm戶耳qJ<##Tbb-D£. 歲fink亡由利ErirlilOtIf1 lu<i>Pidrbiil^r h#rpupdAt a{);C^trin^is-trbpip;!JrtDikl]l<l*FiClli&_£DJI_VJKJi>?etVlh<h>MlrNt1>;1F(HI.£III117It11■KtK)<■strantciplauiC-strln)4?H?KCiiitrOMt?;&trDut■str;圖5“清空顯示區(qū)”和“清空發(fā)送區(qū)”的編碼圖3.行數(shù)據(jù)的發(fā)送和接收與普通的文件操作相同,在對串行口進(jìn)行操作時(shí),通常利用ReadFile函數(shù)讀取串行口收到的數(shù)據(jù),利用WriteFile將需要發(fā)送的數(shù)據(jù)寫如串行口。串行數(shù)據(jù)的發(fā)送利用WriteFile函數(shù)可以向串行口寫入數(shù)據(jù)。WriteFile函數(shù)原型如下:BOOLWriteFile(HANDLEhFileLPVIODlpBufferDWORDnNumberOfBytesToWriteLPDWORDlpNumberOfBytesWrittenLPOVERLAPPEDlpOverlapped);其中參數(shù)hFile指向已經(jīng)打開的串行口句柄;lpBuffer指向一個(gè)發(fā)送數(shù)據(jù)緩沖區(qū);nNumberOfBytesToRead指定要從串行設(shè)備中發(fā)送的字節(jié)數(shù);IpNumberOfBytesRead指明實(shí)際從串行口中發(fā)送的字節(jié)數(shù);IpOverlapped指向一個(gè)OVERLAPPED構(gòu)變量,該結(jié)構(gòu)變量中包含一個(gè)同步事件。串行數(shù)據(jù)的接收利用ReadFile函數(shù)可以讀取將串行口接收到的數(shù)據(jù)。ReadFile函數(shù)原型如下:BOOLReadFile(HANDLEhFileLPVIODlpBufferDWORDnNumberOfBytesToReadLPDWORDlpNumberOfBytesReadLPOVERLAPPEDlpOverlapped);其中參數(shù)hFile指向已經(jīng)打開的串行口句柄;lpBuffer指向一個(gè)讀取數(shù)據(jù)緩沖區(qū);nNumberOfBytesToRead指定要從串行設(shè)備中讀取的字節(jié)數(shù);IpNumberOfBytesRead指明實(shí)際從串行口中讀出的字節(jié)數(shù);lpOverlapped指向一個(gè)OVERLAPPED構(gòu)變量,該結(jié)構(gòu)變量中包含一個(gè)同步事件。通常如果調(diào)用成功,ReadFile返回非0值;否則返回值為0。但是對于接收
操作在后臺進(jìn)行的串口來說,返回值為0不一定說明函數(shù)調(diào)用失敗。此時(shí)可以調(diào)用GetLastError函數(shù)獲取進(jìn)一步的信息。如果GetLastError返回值為ERROR_IO_PENDIN0說明該讀取串口的操作仍然處于后臺等待狀態(tài),而非一個(gè)真正意義上的錯誤。關(guān)閉串行口在用完串行口后通常要將其關(guān)閉。如果忘記關(guān)閉,該串口會始終處于打開狀態(tài),其它的應(yīng)用程序就不能打開或使用它。首先要添加OnClose函數(shù):MFC 讓C-lAnsInickC-lAnsInickfcJJrolealtI(JE?rljc-wM-jm<iisVl E■■ vti曰bZwtD1衛(wèi)*ct?pAdd!<Z[BfG-G.nsIIIIBf"HniFIObiectILKoi;MeasOwIihIihFitiiifzlliiIOCIOC■i^cIL>C
mefcJJrolealtI(JE?rljc-wM-jm<iisVl E■■ vti曰bZwtD1衛(wèi)*ct?pAdd!<Z[BfG-G.nsIIIIBf"HniFIObiectILKoi;MeasOwIihIihFitiiifzlliiIOCIOC■i^cIL>C
meILJC2LuUMAnsITr曰nRUHLlNAUUOULNOHi_CZlFtFOCN—eLrtixMv-8HaIII ili-h-IliriiF在onciose滋數(shù)里編寫代碼:WQinCh^vIcHcmr?WM<■HAJllOITFMa(iiMTEXTMI^NiCiWMCQI^JVUAIACFIFATiFWM2?ZtlLCOLiOlIIKUOIWUSM^CUCKEDSeiMDFIUE;BIMCLiCICECIiQN_lDC_CHECK_HEXreK:BM_CLIC1ICFO詢杠■吟 ObiI陋基艸匚心耗屮匸X空:旳M三GM雯KL0Oncio^ himwmciO-hi圖6添加close函數(shù)編輯close函數(shù)代碼:C15?&lo^eC(inn<);"詞用關(guān)用串口函Gonnf)"TerninateThreid(pRecriveTlirrad,0);ShowStatust);■_cancontra1.Set!ext("打JT串口M);n<_ccincontrcl.SctFcrcCaiflr<RCB{255t0F8));nctrLTcon.Sptlconf(H]CON)Lo^dIm3ge(AfxGttnpprMfiCE_ICOHtC^tSystenMetries(rMfiCE_ICOHtC^tSystenMetries(SN_CXICON).CetS^£tenH#trid5{SM_CXICON),町);打昱亍關(guān)可iconncninli^t.Fniibl^Uindow(true):"設(shè)舊由口呂下?lián)炜蚩杉譵baud.Fn^hlpUindnuCt^up) 'm_bstop.EnableWind*true):■caL.Enablettlndoufftrue):nbd^tj.FnAbl^UindnM(t^p>: "設(shè)道數(shù)設(shè)置邈世可月丄位下l§框可用- "設(shè)魏醯位「樹匡可用Get01g]ten(I?C_BfN_Hfil?SEH?)->EMatoleJin<10tf(False):"設(shè)置手動發(fā)隹按鈕不可用CetDlglte(ni(圖7關(guān)閉串口函數(shù)總結(jié)通過本次課設(shè),在老師的耐心指導(dǎo)和同學(xué)的相互探討下,我了解到了很多有意義的東西,一方面,不但對VC6.0系統(tǒng)的開發(fā)過程有了自己的操作體會,而且對VC6.0編程有了更深入的理解與練習(xí);更重要的是,通過自己動手完成了開發(fā)操作的過程,對自己大學(xué)所學(xué)的C語言和所學(xué)的通信串口連接基礎(chǔ)知識有了更深刻的理解,并且做到了充分的實(shí)踐練習(xí),培養(yǎng)了自己對本門課程極大地學(xué)習(xí)熱情和學(xué)習(xí)興趣,同時(shí)也培養(yǎng)了自己在學(xué)習(xí)過程中獨(dú)立思考的習(xí)慣。另一方面,我通過閱讀文獻(xiàn)和所學(xué)的書籍,對基于windowsAPI異步串行通信等各種過程有了一定的了解,通過對串口連接仿真模型的設(shè)計(jì),我不僅對同步,異步傳輸有了更多的熟悉和了解,還知道了如何用軟件編程來實(shí)現(xiàn)串口的連接。在這長達(dá)三周的課設(shè)時(shí)間里,我深刻體會到,學(xué)習(xí)不僅僅是要記住老師要求的知識點(diǎn),還應(yīng)該不斷地?cái)U(kuò)展自己的知識面,更重要的是,要理解知識點(diǎn)所包含的含義,這樣才能更好的應(yīng)運(yùn)與實(shí)踐中。同時(shí),在老師的身上我學(xué)得到很多實(shí)用的知識,在此表示感謝!參考文獻(xiàn)[1] 李鵬.計(jì)算機(jī)通信技術(shù)及其程序設(shè)計(jì).西安:西安電子科技大學(xué)出版社,1999.6(美)史蒂芬(Stevens,A.),林麗閩譯.標(biāo)準(zhǔn)C++寶典[M].北京:電子工業(yè)出版社,2001楊永田.計(jì)算機(jī)通信.哈爾濱:哈爾濱工程大學(xué)出版社,2002韓毅剛.計(jì)算機(jī)通信技術(shù).北京市:北京航空航天大學(xué)出版社,2007王莉,陽春華.基于VC+的串口通信設(shè)計(jì)及其應(yīng)用[J].控制工程,2004龔建偉,熊光明.VisualC++/TurboC 串口通信編程實(shí)踐[M].電子工業(yè)出版社.2004潘新民.計(jì)算機(jī)通信技術(shù)(第2版)[M].北京市;電子工業(yè)出版社,2006.8(美)JanAxelson.串行端口大全[M].北京市;中國電力出版社,2001附錄:comm.h編寫如下:#ifndefcomm_H#definecomm_H#defineWM_FOUNDCOMMWM_USER+1/自定義消息WM_FOUNDCO收到該消息表示串口已經(jīng)找到#defineWM_READCOMMWM_USER+2〃自定義消息WM_READCO收到該消息緩沖區(qū)有數(shù)據(jù),可以讀取externvoidFindComm();// 申明為外部函數(shù)externvoidOpenComm(intnBaud,intnData,intnStop,intnCal);externvoidCloseComm();externUINTThreadFunc(LPVOIDpParam);//申明全局線程處理函數(shù)externCStringDisplayCString2Hex(CStringData,boolBlank_allow);externCStringDisplayHex2CString(CStringData);externintConvertHexC2String(CStringstr,CByteArray&senddata);externboolComIsOK;// 申明為外部變量externHANDLEhCom;externCStringstrcomname;#endifCWinThread*pReceiveThread;voidShowStatus();intm_intTxCnt;intm_intRxCnt;BOOLm_bAutoSend;DWORDReadComm();在commassistDlg.cpp中加入頭文件comm.h#include"comm.h"CStringstrIn;CStringstrOut;CStringm_strFile; 變量初始化如//CCommassistDlgdialogCCommassistDlg::CCommassistDlg(CWnd*pParent/*=NULL*/):CDialog(CCommassistDlg::IDD,pParent)
{{AFX_DATA_INIT(CCommassistDlg)m_strTimer=_T("");m_strFilePath=_T("");m_strOut=_T("");m_strStatus=_T("");m_check_hexrx=FALSE;m_check_hextx=FALSE;//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//下面就是自己添加的變量初始化m_strTimer="1000";m_strFilePath="m_strFilePath="請選擇要發(fā)送的文件";m_intTxCnt=0;m_intRxCnt=0;m_bAutoSendm_intTxCnt=0;m_intRxCnt=0;m_bAutoSend=0;strIn="";strOut="";在OnInitDialog函數(shù)中添加代碼如下//TODO:Addextra在OnInitDialog函數(shù)中添加代碼如下//TODO:Addextrainitializationherem_comcontrol.SetForeColor(RGB(255,0,0));FindComm();//FindComm();//調(diào)用自動找串口函數(shù)m_comlist.SetCurSel(0);//設(shè)置串口號下拉框默認(rèn)值為第一個(gè)m_baud.SetCurSel(6);//設(shè)置波特率下拉框默認(rèn)值為9600m_bdata.SetCurSel(3);m_comlist.SetCurSel(0);//設(shè)置串口號下拉框默認(rèn)值為第一個(gè)m_baud.SetCurSel(6);//設(shè)置波特率下拉框默認(rèn)值為9600m_bdata.SetCurSel(3);//設(shè)置數(shù)據(jù)位下拉框默認(rèn)值為8位m_bstop.SetCurSel(0);//m_bstop.SetCurSel(0);//設(shè)置停止位下拉框默認(rèn)值為m_cal.SetCurSel(0);//設(shè)置校驗(yàn)位下框默認(rèn)值為m_cal.SetCurSel(0);//設(shè)置校驗(yàn)位下框默認(rèn)值為None無//設(shè)置手動發(fā)送按鈕不可用//設(shè)置手動發(fā)送按鈕不可用//設(shè)置自動發(fā)送按鈕不可用GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false);GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false);
GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false);//設(shè)置發(fā)送間隔按鈕不可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(false);//設(shè)置選擇文件按鈕不可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(false);//設(shè)置發(fā)送文件按鈕不可用//設(shè)置發(fā)送間隔按鈕不可用//下面語句用于解決程序運(yùn)行后初始化EDIT框內(nèi)容被默認(rèn)自動選中狀態(tài)//返回值需更改為FALSEGetFocus();// 獲取焦點(diǎn)SetFocus();// 設(shè)置焦點(diǎn)m_CEditStatus.SetSel(-1,-1,FALSE);//設(shè)置//PostMessage(EM_SETSEL,-1,0);returnFALSE;//returnTRUEunlessyousetthefocustoacontrol用ClassWizard添加WindowProc函數(shù)來處理自定義消息//功能:處理自定義消息=========================================LRESULTCCommassistDlg::WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam){//TODO:Addyourspecializedcodehereand/orcallthebaseclassswitch(message){caseWM_FOUNDCOM:M//已找到串口,串口號以字符串形式由wParam傳遞m_comlist.AddString((LPCTSTR)wParam);// 用AddString添加一個(gè)字符串即 COM號至Um_comlist列表框中break;caseWM_READCOMM://讀串口消息ReadComm();break;}returnCDialog::WindowProc(message,wParam,lParam);}雙擊“打開串口”按鈕編輯代碼如下:voidCCommassistDlg::OnComcontrol()//TODO:AddyourcontrolnotificationhandlercodehereintnBaud,nData,nStop,nCal,nTemp;CStringsTemp,siTemp;// 波特率下拉框設(shè)置=================nTemp=m_baud.GetCurSel();switch(nTemp){case6:nBaud=CBR_9600;break;}//數(shù)據(jù)位下拉框設(shè)置=================nTemp=m_bdata.GetCurSel();switch(nTemp){case0:nData=5;break;case1:nData=6;break;case2:nData=7;break;case3:nData=8;break;}// 停止位下拉框設(shè)置=================nTemp=m_bstop.GetCurSel();switch(nTemp){case0:nStop=ONESTOPBIT;break;case1:nStop=ONE5STOPBITS;break;case2:nStop=TWOSTOPBITS;break;}// 校驗(yàn)位下拉框設(shè)置=================nTemp=m_cal.GetCurSel();switch(nTemp){case0:nCal=NOPARITY;break;case1:nCal=ODDPARITY;break;case2:nCal=EVENPARITY;break;case3:nCal=MARKPARITY;break;case4:nCal=SPACEPARITY;break;}intcommnum_buf;commnum_buf=m_comlist.GetCurSel();if(commnum_buf<0){MessageBox("獲取串口錯誤","錯誤",MB_ICONERROR);ComIsOK=FALSE;return;}m_comlist.GetLBText(commnum_buf,strcomname);if(!ComIsOK){OpenComm(nBaud,nData,nStop,nCal);if(ComIsOK)//調(diào)用打開串口函數(shù)OpenComm()pReceiveThread=AfxBeginThread(ThreadFunc,this,THREAD_PRIORITY_LOWEST);//啟動接收線程ShowStatus();if(!ComIsOK)m_comcontrol.SetWindowText("打開串口");Elsem_comcontrol.SetText("關(guān)閉串口");//按鈕顯示狀態(tài)m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON_OPEN),IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CXICON),0));//顯示打開Iconm_comlist.EnableWindow(false);//設(shè)置串口號下拉框不可用m_baud.EnableWindow(false);//設(shè)置波率下拉框不m_bdata.EnableWindow(false);//設(shè)置數(shù)據(jù)下拉框不設(shè)置停止位下拉框不可用設(shè)置停止位下拉框不可用m_bstop.EnableWindow(false);//m_cal.EnableWindow(false);//設(shè)置校驗(yàn)下拉框不GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(true);//設(shè)置手動發(fā)送按鈕不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(true);//設(shè)置自動發(fā)送按鈕可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(true);//設(shè)置發(fā)送間隔按鈕可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(true);//設(shè)置選擇文件按鈕可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(true);//設(shè)置發(fā)送文件按鈕可用}return;}else{CloseComm();//調(diào)用關(guān)閉串口函數(shù)CloseComm()//TerminateThread(pReceiveThread,0);ShowStatus();m_comcontrol.SetText("打開串口");m_comcontrol.SetForeColor(RGB(255,0,0));m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON_CLOSE),IMAGE_ICON,GetSystemMetrics(SM_CXICON),設(shè)置串口號下拉框可用GetSystemMetrics(SM_CXICON),0));//顯示關(guān)閉icon設(shè)置串口號下拉框可用m_comlist.EnableWindow(true);//m_baud.EnableWindow(true);//置波特率下拉框可用m_bdata.EnableWindow(true);//設(shè)置數(shù)據(jù)位下拉框可用m_bstop.EnableWindow(true);//設(shè)置停止位下拉框可用m_cal.EnableWindow(true);//設(shè)置校驗(yàn)位下拉框可用GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false);//設(shè)置手動發(fā)送按鈕不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false);//設(shè)置自動發(fā)送按鈕不可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false);//設(shè)置發(fā)送間隔按鈕不可用m_baud.EnableWindow(true);//置波特率下拉框可用m_bdata.EnableWindow(true);//設(shè)置數(shù)據(jù)位下拉框可用m_bstop.EnableWindow(true);//設(shè)置停止位下拉框可用m_cal.EnableWindow(true);//設(shè)置校驗(yàn)位下拉框可用GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false);//設(shè)置手動發(fā)送按鈕不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false);//設(shè)置自動發(fā)送按鈕不可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false);//設(shè)置發(fā)送間隔按鈕不可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(false);//設(shè)置選擇文件按鈕不可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(false);//設(shè)置發(fā)送文件按鈕不可用return;}}添加讀串口函數(shù),代碼如下:DWORDCCommassistDlg::ReadComm(){CStringstrTemp;OVERLAPPEDm_osRead;memset(&m_osRead,0,sizeof(OVERLAPPED));m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);charlpInBuffer[1024];DWORDdwBytesRead=1024;BOOLbReadStatus;bReadStatus=ReadFile(hCom,lpInBuffer,dwBytesRead,&dwBytesRead,&m_osRead);if(!bReadStatus)// 如果ReadFile函數(shù)返回FALSE{if(GetLastError()==ERROR_IO_PENDING)〃GetLastError() 函數(shù)返回ERROR_IO_PENDIN表明串口正在進(jìn)行讀操作{WaitForSingleObject(m_osRead.hEvent,2000);//使用WaitForSingleObject函數(shù)等待,直到讀操作完成或延時(shí)已達(dá)到2000ms//當(dāng)串口讀操作進(jìn)行完畢后,m_osRead的hEvent事件會變?yōu)橛行盘?PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); returndwBytesRead;}return0;}lpInBuffer[dwBytesRead]=NULL;strTemp=lpInBuffer;m_intRxCnt+=strTemp.GetLength();//GetDlgItemText(IDC_EDIT_RX,strIn);strIn+=strTemp;OnCheckHexrx();ShowStatus();return1;}添加OnClose函數(shù)voidCCommassistDlg::OnClose(){//TODO:Addyourmessage接收到字節(jié)數(shù)統(tǒng)計(jì)//handlercodehereand/orcalldefault接收到字節(jié)數(shù)統(tǒng)計(jì)//handlercodehereand/orcalldefault程序退出時(shí),關(guān)閉串口監(jiān)聽線程WaitForSingleObject(pReceiveThread,INFINITE);CDialog::OnClose();}雙擊“手動發(fā)送”按鈕,編輯代碼如下:UINTCCommassistDlg::OnBtnHandsend(){//TODO:Addyourcontrolnotificationhandlercodehereif(ComIsOK==FALSE){MessageBox("請先打開串口","提示",MB_ICONINFORMATION);return0;}BOOLbWriteStat;UpdateData(TRUE);CStringstr,sTemp;DWORDdwBytesWritten=1024;OVERLAPPEDm_osWrite;memset(&m_osWrite,0,sizeof(OVERLAPPED));m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);COMSTATComStat;DWORDdwErrorFlags;//dwBytesWritten=OnCheckHextx();GetDlgItem(IDC_EDIT_TX)->GetWindowText(strOut);if(m_check_hextx){inti,n;CStringstrTemp;CByteArrayhexdata;//GetDlgItem(IDC_EDIT_TX)->GetWindowText(strOut);dwBytesWritten=ConvertHexC2String(strOut,hexdata);n=hexdata.GetSize();for(i=0;i<n;i++){str.Format("%c",hexdata[i]);strTemp+=str;}//SetDlgItemText(IDC_EDIT_TX,strTemp);strOut=strTemp;}Else{GetDlgItem(IDC_EDIT_TX)->GetWindowText(str);SetDlgItemText(IDC_EDIT_TX,"");sTemp=DisplayHex2CString(str);dwBytesWritten=str.GetLength();SetDlgItemText(IDC_EDIT_TX,strOut);}UpdateData();if(dwBytesWritten==0){MessageBox("請?jiān)诎l(fā)送區(qū)內(nèi)輸入要發(fā)送的內(nèi)容","提示",MB_ICONINFORMATION);return0;}m_intTxCnt+=dwBytesWritten;ShowStatus();ClearCommError(hCom,&dwErrorFlags,&ComStat);bWriteStat=WriteFile(hCom,strOut,dwBytesWritten,&dwBytesWritten,&m_osWrite);if(!bWriteStat){if(GetLastError()==ERROR_IO_PENDING){WaitForSingleObject(m_osWrite.hEvent,1000);returndwBytesWritten;}return0;}ShowStatus();PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);returndwBytesWritten;}編輯ShowStatus函數(shù),代碼如下:voidCCommassistDlg::ShowStatus(){//狀態(tài)欄顯示狀態(tài)CStringstrTXcnt;CStringstrRXcnt;CStringsTemp;CStringcomnum;CStringstrBaud,strStop,strData,strCal;UpdateData(true);if(ComIsOK){m_comlist.GetLBText(m_comlist.GetCurSel(),sTemp);comnum=sTemp+"已打開";}elsecomnum="未打開串口";strTXcnt.Format(" 發(fā)送:%d",m_intTxCnt);strRXcnt.Format(" 接收:%d",m_intRxCnt);m_baud.GetLBText(m_baud.GetCurSel(),strBaud);m_bstop.GetLBText(m_bstop.GetCurSel(),strStop);m_bdata.GetLBText(m_bdata.GetCurSel(),strData);m_cal.GetLBText(m_cal.GetCurSel(),strCal);m_strStatus="串口:"+comnum+""+"狀態(tài):"+strTXcnt+","+strRXcnt+","+"波特率:"+strBaud+","+"數(shù)據(jù)位:"+strData+","+"停止位:"+strStop+","+" 校驗(yàn)位:"+strCal;UpdateData(FALSE);}雙擊“清空顯示區(qū)”按鈕,編輯代碼如下:voidCCommassistDlg::OnBtnClrrx(){//TODO:AddyourcontrolnotificationhandlercodehereGetDlgItem(IDC_EDIT_RX);SetDlgItemText(IDC_EDIT_RX,"");m_intRxCnt=0;m_intTxCnt=0;strIn="";ShowStatus();}雙擊“清空發(fā)送區(qū)”按鈕,編輯代碼如下:voidCCommassistDlg::OnBtnClrtx(){//TODO:AddyourcontrolnotificationhandlercodehereGetDlgItem(IDC_EDIT_TX);SetDlgItemText(IDC_EDIT_TX,"");}添加WM_TIME定時(shí)器OnTimer函數(shù)代碼如下:voidCCommassistDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultif(nIDEvent==1) OnBtnHandsend();elseif(nIDEvent==2)return;CDialog::OnTimer(nIDEvent);}雙擊“自動發(fā)送”按鈕,編輯代碼如下:voidCCommassistDlg::OnBtnAutosend(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);m_bAutoSend=!m_bAutoSend;if(!m_strOut.GetLength()){MessageBox("請先輸入要發(fā)送的內(nèi)容","提示",MB_ICONINFORMATION);m_bAutoSend=!m_bAutoSend;}else{if(m_bAutoSend){SetTimer(1,atoi(m_strTimer.GetBuffer(m_strTimer.GetLength())),NULL);//設(shè)置定時(shí)m_autosend.SetText("停止");GetDlgItem(IDC_COMCONTROL)->EnableWindow(false);GetDlgItem(IDC_BTN_CLRTX)->EnableWindow(false);GetDlgItem(IDC_BTN_CLRRX)->EnableWindow(false);GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit2 Lesson 1 教學(xué)設(shè)計(jì) 2024-2025學(xué)年冀教版英語七年級下冊
- Unit3 Weather Part A Let's spell(教學(xué)設(shè)計(jì))-2023-2024學(xué)年人教PEP版英語四年級下冊
- 25 憶讀書 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語文五年級上冊統(tǒng)編版
- 《二、建立素材庫》教學(xué)設(shè)計(jì) 2024-2025學(xué)年初中信息技術(shù)人教版七年級上冊
- 天津四中2025年高三第二次高中畢業(yè)生復(fù)習(xí)統(tǒng)一檢測試題語文試題含解析
- 齊魯名校2025屆高三下學(xué)期期末質(zhì)檢物理試題含解析
- 四川省資陽市安岳縣岳陽鎮(zhèn)東方紅小學(xué)2025年數(shù)學(xué)四年級第二學(xué)期期末復(fù)習(xí)檢測試題含解析
- 2025年廣東省培正中學(xué)高三第三次聯(lián)合模擬考試物理試題試卷含解析
- 工會對食堂監(jiān)管的措施
- 關(guān)于香水瓶容器的調(diào)研
- 二零二五年度醫(yī)療健康產(chǎn)業(yè)貸款擔(dān)保合同
- 2025年安徽醫(yī)學(xué)高等??茖W(xué)校單招職業(yè)適應(yīng)性測試題庫及答案一套
- 2025年贛西科技職業(yè)學(xué)院單招職業(yè)技能測試題庫帶答案
- 急性ST段抬高型心肌梗死溶栓治療專家共識2024解讀
- 電影《哪吒之魔童降世》主題班會
- 2025年湖南科技職業(yè)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年鎮(zhèn)江市高等專科學(xué)校高職單招高職單招英語2016-2024年參考題庫含答案解析
- 《病例隨訪匯報(bào)》課件
- 2025江蘇省沿海開發(fā)集團(tuán)限公司招聘23人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年09月2024華夏金融租賃有限公司校園招聘筆試歷年參考題庫附帶答案詳解
- 鋰電池技術(shù)研發(fā)生產(chǎn)合同
評論
0/150
提交評論