![基于WINDOWS API的異步串口通信軟件設(shè)計(jì).doc_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/24/4051b99b-e4b7-454d-a08e-5d3d7271daaa/4051b99b-e4b7-454d-a08e-5d3d7271daaa1.gif)
![基于WINDOWS API的異步串口通信軟件設(shè)計(jì).doc_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/24/4051b99b-e4b7-454d-a08e-5d3d7271daaa/4051b99b-e4b7-454d-a08e-5d3d7271daaa2.gif)
![基于WINDOWS API的異步串口通信軟件設(shè)計(jì).doc_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/24/4051b99b-e4b7-454d-a08e-5d3d7271daaa/4051b99b-e4b7-454d-a08e-5d3d7271daaa3.gif)
![基于WINDOWS API的異步串口通信軟件設(shè)計(jì).doc_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/24/4051b99b-e4b7-454d-a08e-5d3d7271daaa/4051b99b-e4b7-454d-a08e-5d3d7271daaa4.gif)
![基于WINDOWS API的異步串口通信軟件設(shè)計(jì).doc_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/24/4051b99b-e4b7-454d-a08e-5d3d7271daaa/4051b99b-e4b7-454d-a08e-5d3d7271daaa5.gif)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于WINDOWS API的異步串口通信軟件設(shè)計(jì)摘 要: 串口是常用的計(jì)算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,在VC+6.0中利用第三方控件實(shí)現(xiàn)串口通信時(shí)實(shí)時(shí)性較差,系統(tǒng)資源利用不足,為了提高串口通信的速度和資源利用率,軟件采用WINDOWS API函數(shù)并基于多線(xiàn)程技術(shù)和自定義消息機(jī)制的異步串口通信的設(shè)計(jì)理念,結(jié)合串口通信的機(jī)理和多線(xiàn)程同步技術(shù),分析了Win32系統(tǒng)下多線(xiàn)程異步串口通信軟件的開(kāi)發(fā)方法。軟件主線(xiàn)程是數(shù)據(jù)采集程序的管理者,串口監(jiān)測(cè)線(xiàn)程(輔助線(xiàn)程)在后臺(tái)對(duì)串口進(jìn)行實(shí)時(shí)監(jiān)視,獲得了良好穩(wěn)定的通信效果。關(guān)鍵詞:串口通信;異步(重疊)I/O;多線(xiàn)程;中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 0 引 言串口通信是計(jì)算機(jī)與其他設(shè)備進(jìn)行數(shù)據(jù)通信時(shí)經(jīng)常使用的方法之一,他具有實(shí)現(xiàn)簡(jiǎn)單,使用靈活方便,數(shù)據(jù)傳輸可靠等優(yōu)點(diǎn),因而在工業(yè)控制、數(shù)據(jù)采集和實(shí)時(shí)監(jiān)控系統(tǒng)中得到廣泛應(yīng)用1。 在通常的串口通信軟件開(kāi)發(fā)的時(shí)候,大多數(shù)人采用的是使用如MSComm等第三方控件控件進(jìn)行程序的開(kāi)發(fā)。MSComm控件在串口編程時(shí)非常方便,程序員不必花時(shí)間去了解較為復(fù)雜的API函數(shù),只需要在串口通信資源的屬性(Properties)一項(xiàng)中配置串口,完成串口配置之后即可打開(kāi)串口,進(jìn)行數(shù)據(jù)讀寫(xiě)。 但由于控件本身對(duì)于接收緩沖區(qū)大小設(shè)置的限定,如果接收緩沖區(qū)不能滿(mǎn)足設(shè)計(jì)的要求,當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)達(dá)到消息響應(yīng)值并響應(yīng)存儲(chǔ)命令,而新的數(shù)據(jù)傳輸速度大于已接收到數(shù)據(jù)的存儲(chǔ)速度時(shí),就會(huì)造成接收緩沖區(qū)的溢出,進(jìn)而直接導(dǎo)致軟件的崩潰2。本文的串口通信軟件的開(kāi)發(fā)沒(méi)有使用任何串口通信的第三方封裝控件,全部使用windows API函數(shù)對(duì)串口進(jìn)行操作和配置,而且使用了多線(xiàn)程技術(shù)和異步I/0操作,提高了串口通信的效率和程序的靈活性。1 軟件結(jié)構(gòu)本串口通信軟件主要由三個(gè)主要模塊構(gòu)成,分別是:串口配置模塊,數(shù)據(jù)采集模塊和數(shù)據(jù)發(fā)送模塊。三個(gè)模塊分別對(duì)應(yīng)CinData,CoutData和CGetComSet三個(gè)類(lèi)。串口配置模塊完成對(duì)串口關(guān)鍵參數(shù)的設(shè)置,采集和發(fā)送模塊中分別創(chuàng)建了單獨(dú)的線(xiàn)程控制數(shù)據(jù)的收發(fā),同時(shí)在采集模塊中還創(chuàng)建了對(duì)端口的監(jiān)視事件,負(fù)責(zé)對(duì)串口進(jìn)行實(shí)時(shí)監(jiān)測(cè)。軟件的組成結(jié)構(gòu)如圖1所示: 圖1 串口通信軟件結(jié)構(gòu) 2 串口配置模塊串口的本質(zhì)功能是作為CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從 CPU經(jīng)過(guò)串行端口發(fā)送出去時(shí),字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時(shí),串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。對(duì)于兩個(gè)通信的串口,最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位3。由于每臺(tái)電腦或者外設(shè)對(duì)自身串口的默認(rèn)設(shè)置不盡相同,所以我們?cè)谶M(jìn)行通信之前一定要設(shè)置好這些參數(shù),使通信雙方的串口配置一致,才能確保通信的正常。本軟件中串口配置模塊完成發(fā)送端和接收端串口的配置,并可以自動(dòng)識(shí)別本機(jī)上使有串口端口號(hào),方便了用戶(hù)的選擇。串口配置模塊界面如下圖所示:圖2 串口配置模塊界面3 數(shù)據(jù)采集和發(fā)送模塊數(shù)據(jù)采集和發(fā)送模塊是本軟件的兩個(gè)核心模塊,兩個(gè)模塊中都分別創(chuàng)建了單獨(dú)的采集線(xiàn)程和發(fā)送線(xiàn)程負(fù)責(zé)對(duì)串口進(jìn)行讀寫(xiě)操作,采集線(xiàn)程接收并保存收到的數(shù)據(jù)。配置模塊完成對(duì)串口相關(guān)參數(shù)的配置后,也是通過(guò)全局變量把設(shè)定的參數(shù)值傳到此兩個(gè)模塊中來(lái)進(jìn)行對(duì)相關(guān)結(jié)構(gòu)體成員附值的。界面如下:圖3 數(shù)據(jù)采集模塊配置界面3.1 異步I/0的使用Windows文件操作分為同步I/O和異步I/O (Overlapped I/ O)兩種方式,在同步I/O方式中,API會(huì)阻塞直到操作完成以后才能返回(在多線(xiàn)程方式中,雖然不會(huì)阻塞主線(xiàn)程,但是仍然會(huì)阻塞監(jiān)聽(tīng)線(xiàn)程);而在異步I/O方式中,API會(huì)立即返回,操作在后臺(tái)進(jìn)行,避免線(xiàn)程的阻塞5。異步I/O非常靈活,它也可以實(shí)現(xiàn)阻塞(例如我們可以設(shè)置一定要讀取到一個(gè)數(shù)據(jù)才能進(jìn)行到下一步操作),這就使得線(xiàn)程可以從費(fèi)時(shí)的I/O操作中解放出來(lái),從而極大地提高了程序的運(yùn)行效率。為了使用異步I/O方式打開(kāi)串口,在用CreateFile創(chuàng)建創(chuàng)建串口時(shí),必須指定文件的屬性為FILE_FLAG_OVERLAPPED:m_Comm= CreateFile(m_sPort, GENERIC_READ, 0, NULL,OPEN_EXISTING, ILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);然后在 ReadFile()時(shí)lpOverlapped參數(shù)一定不能為NULL,接著檢查函數(shù)調(diào)用的返回值,調(diào)用GetLastError(),看是否返回ERROR_IO_PENDING。如是,最后調(diào)用GetOverlappedResult()返回異步操作(overlapped operation)的結(jié)果;WriteFile()的使用類(lèi)似。異步I/O的信息包含在結(jié)構(gòu)體OVERLAPPED當(dāng)中,其定義為:typedef struct _OVERLAPPED DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; HANDLE hEvent; OVERLAPPED; 其中hEvent是讀寫(xiě)事件,當(dāng)串口使用異步通訊時(shí),函數(shù)返回時(shí)操作可能還沒(méi)有完成,程序可以通過(guò)檢查該事件得知是否讀寫(xiě)完畢。當(dāng)調(diào)用ReadFile, WriteFile 函數(shù)的時(shí)候,該成員會(huì)自動(dòng)被置為無(wú)信號(hào)狀態(tài);當(dāng)重疊操作完成后,該成員變量會(huì)自動(dòng)被置為有信號(hào)狀態(tài)。該事件的創(chuàng)建,可以對(duì)串口進(jìn)行監(jiān)測(cè)。3.2DCB和COMMTIMEOUTS結(jié)構(gòu)體的配置使用windows api進(jìn)行串口通信的編程,對(duì)DCB和COMMTIMEOUTS兩個(gè)結(jié)構(gòu)體的配置是非常重要的工作,參數(shù)配置得是否科學(xué)將直接影響到通信的品質(zhì)。我們使用的第三方控件實(shí)質(zhì)就是封裝了此些結(jié)構(gòu)體在其中來(lái)對(duì)串口進(jìn)行配置。DCB是設(shè)備控制塊DCB(Device Control Block),在我們打開(kāi)串口后,需要對(duì)串口進(jìn)行初始化的工作,這些工作就是通過(guò)對(duì)DCB成員的賦值來(lái)實(shí)現(xiàn)的5。在查詢(xún)或配置串口的屬性時(shí),都要用DCB結(jié)構(gòu)來(lái)作為緩沖區(qū)。DCB的定義為:typedef struct _DCB / dcb DWORD DCBlength; / sizeof(DCB) DWORD BaudRate; / current baud rate DWORD fBinary: 1; / binary mode, no EOF check DWORD fParity: 1; / enable parity checking DWORD fOutxCtsFlow:1; / CTS output flow control DWORD fOutxDsrFlow:1; / DSR output flow control DWORD fDtrControl:2; / DTR flow control type DWORD fDsrSensitivity:1; / DSR sensitivity DWORD fTXContinueOnXoff:1; / XOFF continues Tx DWORD fOutX: 1; / XON/XOFF out flow control DWORD fInX: 1; / XON/XOFF in flow control DWORD fErrorChar: 1; / enable error replacement DWORD fNull: 1; / enable null stripping DWORD fRtsControl:2; / RTS flow control DWORD fAbortOnError:1; / abort reads/writes on error WORD XonLim; / transmit XON threshold WORD XoffLim; / transmit XOFF threshold BYTE ByteSize; / number of bits/byte, 4-8 BYTE Parity; / 0-4=no,odd,even,mark,space BYTE StopBits; / 0,1,2 = 1, 1.5, 2 DCB;其中包括常用的波特率,數(shù)據(jù)位,奇偶校驗(yàn)位和停止位的設(shè)置。另外,DCB還給程序員提供了對(duì)硬件流控制的設(shè)置。我們知道通,過(guò)串口傳輸數(shù)據(jù)時(shí),由于計(jì)算機(jī)之間處理速度或其他因素的影響,會(huì)造成丟失數(shù)據(jù)的現(xiàn)象發(fā)生,數(shù)據(jù)流控制就是用于解決這個(gè)問(wèn)題的。它通過(guò)控制發(fā)送數(shù)據(jù)的速度,確保數(shù)據(jù)在通信中不會(huì)出現(xiàn)丟失。數(shù)據(jù)流控制可以分為軟件流控制(Xon/Xoff)和硬件流控制。軟件流控制使用特殊的字符作為啟動(dòng)或停止的標(biāo)志。而硬件流控制通過(guò)使用硬件信號(hào)(CTR/RTS)來(lái)實(shí)現(xiàn)。串口通信中的硬件流控有兩種,DTE(data terminal equipment即數(shù)據(jù)終端設(shè)備)/DSR(Data Set Ready)方式和RTS(請(qǐng)求發(fā)送,當(dāng)數(shù)據(jù)終端準(zhǔn)備好送出數(shù)據(jù)時(shí),就發(fā)出有效的RTS信號(hào))/CTS(Clear-To-Send protocol 的簡(jiǎn)寫(xiě),是清除發(fā)送協(xié)議,通常和RTS連在一起)方式,這與DCB結(jié)構(gòu)的初始化有關(guān)系,DCB結(jié)構(gòu)中的OutxCtsFlow、 fOutxDsrFlow、fDsrSensitivity、fRtsControl、fDtrControl幾個(gè)成員的初始值很關(guān)鍵,不同的值代表不同流控,也可以自己設(shè)置流控。硬件流控是靠軟件實(shí)現(xiàn)的,之所以強(qiáng)調(diào)“硬件”二字,僅僅是因?yàn)橛布骺靥峁┝擞糜诹髁壳闆r指示的硬件連線(xiàn)方法。在通常的串口通信中,我們一般建議采用標(biāo)準(zhǔn)流行的軟件流控方式,對(duì)硬件流控制的設(shè)置對(duì)于一般用戶(hù)使用默認(rèn)值即可,但對(duì)于特定需求來(lái)說(shuō),這些設(shè)置是非常必要的。當(dāng)對(duì)DCB設(shè)置完成后,必須使用SetCommState使配置生效3,5。本程序中對(duì)DCB的部分配置代碼為:dcb. DCBlength = sizeof(DCB);dcb.fBinary=TRUE;dcb.BaudRate = m_anBaud; / 數(shù)據(jù)傳輸速率dcb.ByteSize = m_anDataBits; / 每字節(jié)位數(shù)dcb.fParity = TRUE;dcb.Parity=EVENPARITY;/ 校驗(yàn)設(shè)置dcb.StopBits=ONESTOPBIT;SetCommState(m_Comm, &dcb);/把配置寫(xiě)入設(shè)備COMMTIMEOUTS結(jié)構(gòu)體是用進(jìn)行超時(shí)設(shè)置的。在通信中,超時(shí)是個(gè)很重要的考慮因素,特別是在對(duì)實(shí)時(shí)性要求比較高的應(yīng)用中,因?yàn)槿绻跀?shù)據(jù)接收過(guò)程中由于某種原因突然中斷或停止,如果不采取超時(shí)控制機(jī)制,將會(huì)使得I/O線(xiàn)程被掛起或無(wú)限阻塞,嚴(yán)重影響正常的通信。用ReadFile和WriteFile讀寫(xiě)串口時(shí),需要考慮超時(shí)問(wèn)題,如果在指定的時(shí)間內(nèi)沒(méi)有讀出或?qū)懭胫付〝?shù)量的字符,那么ReadFile或WriteFile的操作就會(huì)結(jié)束,避免阻塞的發(fā)生。在用異步方式讀寫(xiě)串口時(shí),雖然ReadFile和WriteFile在完成操作以前就可能返回,但超時(shí)仍然是起作用的。在這種情況下,超時(shí)規(guī)定的是操作的完成時(shí)間,而不是ReadFile和WriteFile的返回時(shí)間。本程序中對(duì)COMMTIMEOUTS的配置代碼如下:comTimeOut.ReadIntervalTimeout =MAXDWORD ; / 接收時(shí),兩字符間最大的時(shí)延comTimeOut.ReadTotalTimeoutMultiplier =0; / 讀取每字節(jié)的超時(shí)comTimeOut.ReadTotalTimeoutConstant =0; / 讀串口數(shù)據(jù)的固定超時(shí)comTimeOut.WriteTotalTimeoutConstant =0; / 寫(xiě)串口數(shù)據(jù)的固定超時(shí)SetCommTimeouts(m_Comm, &comTimeOut); / 將超時(shí)參數(shù)寫(xiě)入設(shè)備控制 4 多線(xiàn)程的設(shè)計(jì)4.1 多線(xiàn)程程序設(shè)計(jì)思想 在32位Windows系統(tǒng)中,術(shù)語(yǔ)多任務(wù)是指系統(tǒng)可以同時(shí)運(yùn)行多個(gè)進(jìn)程,而每個(gè)進(jìn)程也可以同時(shí)執(zhí)行多個(gè)線(xiàn)程。進(jìn)程就是應(yīng)用程序的運(yùn)行實(shí)例。每個(gè)進(jìn)程都有自己私有的虛擬地址空間,每個(gè)進(jìn)程都有一個(gè)主線(xiàn)程,但可以建立另外的線(xiàn)程4。進(jìn)程中的線(xiàn)程是并行執(zhí)行的,每個(gè)線(xiàn)程占用CPU的時(shí)間由系統(tǒng)來(lái)劃分.可以把線(xiàn)程看作是操作系統(tǒng)分配CPU時(shí)間的基本實(shí)體,系統(tǒng)不停的在各個(gè)線(xiàn)程之間切換,它對(duì)線(xiàn)程的中斷是匯編語(yǔ)言級(jí)的.系統(tǒng)為每一個(gè)線(xiàn)程分配一個(gè)CPU時(shí)間段,某個(gè)線(xiàn)程只有在分配的時(shí)間段內(nèi)才有對(duì)CPU的控制權(quán)。進(jìn)程中所有的線(xiàn)程共享進(jìn)程的虛擬地址空間,這意味著所有線(xiàn)程都可以訪(fǎng)問(wèn)進(jìn)程的全局變量和資源。這一方面為編程帶來(lái)了方便,但另一方面也容易造成沖突.雖然在進(jìn)程中進(jìn)行費(fèi)時(shí)的工作不會(huì)導(dǎo)致系統(tǒng)的掛起,但會(huì)導(dǎo)致進(jìn)程本身的掛起9。所以,如果進(jìn)程即要進(jìn)行長(zhǎng)期工作,又要響應(yīng)用戶(hù)的輸入,那么它可以啟動(dòng)一個(gè)線(xiàn)程來(lái)專(zhuān)門(mén)負(fù)責(zé)費(fèi)時(shí)的工作,而主線(xiàn)程仍然可以與用戶(hù)進(jìn)行交互.由此可見(jiàn),利用Windows的異步(重疊)I/O操作和多線(xiàn)程特性,可以編出高效的通信程序。 4.2 多線(xiàn)程程序設(shè)計(jì)根據(jù)多線(xiàn)程程序的開(kāi)發(fā)思想,該串口通信軟件由負(fù)責(zé)人機(jī)交互的主線(xiàn)程和對(duì)串口進(jìn)行處理的后臺(tái)監(jiān)測(cè)線(xiàn)程組成4.主線(xiàn)程是數(shù)據(jù)采集程序的管理者,用來(lái)初始化串口(通過(guò)調(diào)用相應(yīng)的Windows API函數(shù)),自定義通信事件消息,創(chuàng)建、刪除輔助線(xiàn)程,進(jìn)行人機(jī)交互的操作及協(xié)調(diào)好各線(xiàn)程的運(yùn)行。程序流程如圖4所示: 圖4 多線(xiàn)程流程圖 串口監(jiān)測(cè)線(xiàn)程在后臺(tái)對(duì)串口進(jìn)行實(shí)時(shí)監(jiān)視,當(dāng)監(jiān)視到預(yù)定義的事件時(shí),立即調(diào)用相
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有關(guān)抵押借款合同范文
- oem委托加工合同協(xié)議常用范本年
- 變電站安裝工程承包合同模板
- 2024年高考英語(yǔ) (全國(guó)甲卷)真題詳細(xì)解讀及評(píng)析
- 個(gè)人商品購(gòu)銷(xiāo)合同
- 2025年外研版九年級(jí)歷史下冊(cè)月考試卷含答案
- 貨物運(yùn)輸合同、法規(guī)與保險(xiǎn)
- 2025年外研版九年級(jí)歷史下冊(cè)階段測(cè)試試卷
- 造紙機(jī)購(gòu)買(mǎi)合同
- 民政局離婚的協(xié)議書(shū)范本
- 全過(guò)程造價(jià)咨詢(xún)服務(wù)的質(zhì)量、進(jìn)度、保密等保證措施
- 開(kāi)工第一課安全培訓(xùn)內(nèi)容
- 湖北省石首楚源“源網(wǎng)荷儲(chǔ)”一體化項(xiàng)目可研報(bào)告
- 經(jīng)顱磁刺激增強(qiáng)定神狀態(tài)的研究
- Creo-7.0基礎(chǔ)教程-配套課件
- 六年級(jí)人教版上冊(cè)數(shù)學(xué)計(jì)算題練習(xí)題(及答案)100解析
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評(píng)價(jià)細(xì)則
- 初中物理滬粵版八年級(jí)下冊(cè)《第六章 力和機(jī)械》章節(jié)練習(xí)(含答案)
- 金礦管理制度
- 橋梁樁基礎(chǔ)施工概述及施工控制要點(diǎn)
- JB/T 20036-2016提取濃縮罐
評(píng)論
0/150
提交評(píng)論