資源描述:
《VC串口編程了解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、用VC6.0實現(xiàn)串行通信的三種方法在實驗室和工業(yè)應(yīng)用中,串口是常用的計算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,由于串行通信方便易行,所以應(yīng)用廣泛。依據(jù)不同的條件實現(xiàn)對串口的靈活編程控制是我們所需要的。----在光學(xué)鏡片鍍膜工藝中,用單片機(jī)進(jìn)行多路溫度數(shù)據(jù)采集控制,采集結(jié)果以串行方式進(jìn)入主機(jī),每隔10秒向主機(jī)發(fā)送一次采樣數(shù)據(jù),主機(jī)向單片機(jī)發(fā)送相關(guān)的控制命令,實現(xiàn)串行數(shù)據(jù)接收、處理、記錄、顯示,實時繪制曲線。串行通信程序開發(fā)環(huán)境為VC++6.0。Windows下串行通信----與以往DOS下串行通信程序不同的是,窗口不提倡應(yīng)用程序直接控制硬件,而是通過窗口操作系統(tǒng)提供的設(shè)備驅(qū)動程序來進(jìn)行
2、數(shù)據(jù)傳遞。串行口在WIN32中是作為文件來進(jìn)行處理的,而不是直接對端口進(jìn)行操作,對于串行通信,WIN32提供了相應(yīng)的文件I/O函數(shù)與通信函數(shù),通過了解這些函數(shù)的使用,可以編制出符合不同需要的通信程序。----與通信設(shè)備相關(guān)的結(jié)構(gòu)有COMMCONFIG、COMMPROP、COMMTIMEOUTS、COMSTAT、DCB、MODEMDEVCAPS、MODEMSETTINGS共7個,與通信有關(guān)的WindowsAPI函數(shù)共有26個,詳細(xì)說明可參考MSDN幫助文件。以下將結(jié)合實例,給出實現(xiàn)串行通信的三種方法。實現(xiàn)串行通信的三種方法----方法一:使用VC++提供的串行通信控件MSComm--
3、--首先,在對話框中創(chuàng)建通信控件,若Control工具欄中缺少該控件,可通過菜單Project→AddtoProject→ComponentsandControl插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關(guān)心控件提供的對Windows通信驅(qū)動程序的API函數(shù)的接口。換句話說,只需要設(shè)置和監(jiān)視MSComm控件的屬性和事件。----在ClassWizard中為新創(chuàng)建的通信控件定義成員對象(CMSCommm_Serial),通過該對象便可以對串口屬性進(jìn)行設(shè)置,MSComm控件共有27個屬性,這里只介紹其中幾個常用屬性:CommPort???設(shè)置并返回通信端口號,缺省為??
4、?????????COM1。Settings?????以字符串的形式設(shè)置并返回波特???????????率、奇偶校驗、數(shù)據(jù)位、停止位。?PortOpen????設(shè)置并返回通信端口的狀態(tài),也可???????????以打開和關(guān)閉端口。?Input???????從接收緩沖區(qū)返回和刪除字符。?Output??????向發(fā)送緩沖區(qū)寫一個字符串。InputLen????設(shè)置每次Input讀入的字符個數(shù),缺???????????省值為0,表明讀取接收緩沖區(qū)中的全???????????部內(nèi)容。InBufferCount??返回接收緩沖區(qū)中已接收到的字符?????????????數(shù),將其置0可以清除
5、接收緩沖區(qū)。InputMode????定義Input屬性獲取數(shù)據(jù)的方式(為?????????????0:文本方式;為1:二進(jìn)制方式)。----RThreshold和SThreshold屬性,表示在OnComm事件發(fā)生之前,接收緩沖區(qū)或發(fā)送緩沖區(qū)中可以接收的字符數(shù)。----以下是通過設(shè)置控件屬性對串口進(jìn)行初始化的實例:??BOOL???CSampleDlg::PortOpen(){??BOOL??m_Opened;??……??m_Serial.SetCommPort(2);???//指定串口號??m_Serial.SetSettings(“4800,N,8,1");?????//通信
6、參數(shù)設(shè)置??m_Serial.SetInBufferSize(1024);//指定接收緩沖區(qū)大小??m_Serial.SetInBufferCount(0);//清空接收緩沖區(qū)??m_Serial.InputMode(1);?????//設(shè)置數(shù)據(jù)獲取方式??m_Serial.SetInputLen(0);????//設(shè)置讀取方式 m_Opened=m_Serail.SetPortOpen(1);????//打開指定的串口??回來?m_Opened;??}----空的?CSampleDlg::OnComm(){?…… switch(m_Serial.G
7、etCommEvent())?{????盒子?2:??????//?串行口數(shù)據(jù)接收,處理;??}} ----方法二:在單線程中實現(xiàn)自定義的串口通信類----控件簡單易用,但由于必須拿到對話框中使用,在一些需要在線程中實現(xiàn)通信的應(yīng)用場合,控件的使用顯得捉襟見肘。此時,若能夠按不同需要定制靈活的串口通信類將彌補(bǔ)控件的不足,以下將介紹如何在單線程中建立自定義的通信類。----該通信類CSimpleComm需手動加入頭文件與源文件,其基類為CObject,大致建立步驟如下:-