电竞比分网-中国电竞赛事及体育赛事平台

分享

VC++.NET和VC++6.0串行通信控件的使用區(qū)別(精華)

 筱肆 2013-12-26

2009-04-24 00:35:21|  分類: VC++6.0/NET |字號 訂閱

//////////////////////////////////////明文的編程心得,原創(chuàng)技術(shù)文章////////////////////////////////////////////////

1 MSComm介紹

在WINDOWS環(huán)境下,用戶不能直接對PC的串行端口進(jìn)行操作。Visual C++.NET中,通過使用微軟公司提供的Microsoft Comm Control控件(簡稱MSComm),可以方便地實現(xiàn)PC與外部設(shè)備之間的串行通信,編程工作量相對較少。

2.Visual C++.NET中控件MSComm的函數(shù)與Visual C++6.0中的控件函數(shù)有所不同。

MSComm有二十多個屬性,其中主要的屬性有:

CommPort:設(shè)置和返回通信端口號,CommPort=1即使用串行端口Com1。

PortOpen:打開或關(guān)閉通信端口。

InBufferSize:設(shè)置接收緩沖區(qū)大小。

OutBufferSize:設(shè)置發(fā)送緩沖區(qū)大小。

Input:讀取并刪除緩存區(qū)中的數(shù)據(jù)。

Output:將數(shù)據(jù)寫入發(fā)送緩存區(qū)。

Settings:設(shè)置波特率、奇偶校驗、數(shù)據(jù)位和停止位參數(shù),默認(rèn)值為“9600,N,8,1”,即波特率9600b/s、不進(jìn)行奇偶校驗、8個數(shù)據(jù)位、1個停止位。

InputLen:設(shè)置每次從緩存區(qū)讀取的字節(jié)數(shù)。

InputMode:設(shè)置和返回數(shù)據(jù)類型,設(shè)置為0時讀取的數(shù)據(jù)為文本形式,設(shè)置為1時讀取的數(shù)據(jù)為二進(jìn)制數(shù)據(jù)。PC與單片機通信時,InputMode屬性常設(shè)置為二進(jìn)制數(shù)據(jù)形式。

Rthreshold:設(shè)置OnComm事件發(fā)生前,接收緩存區(qū)可以接收的字符數(shù)。若設(shè)置為0,則不產(chǎn)生OnComm事件。

串行通信控件MSComm有二種處理通信的工作方式:事件驅(qū)動方式和查詢工作方式。事件驅(qū)動方式是指:當(dāng)串行端口接收或發(fā)送完指定數(shù)量數(shù)據(jù)以及發(fā)生通信錯誤等情況時,MSComm控件觸發(fā)OnComm事件,作出相應(yīng)處理。查詢工作方式是指:通過查詢控件的某些屬性值(如InBufferCount屬性)來作出進(jìn)一步的處理。以下的程序?qū)嵗捎檬录?qū)動方式來接收數(shù)據(jù)。

3.NET下添加步驟

按照已有的步驟注冊串口控件MScomm32.ocx,注冊完成后,新建一個MFC應(yīng)用程序,選 工具—添加/移除工具箱項—COM組件—添加Microsoft Communication Control, version 6.0, 就會出現(xiàn)一個電話圖標(biāo)哦!??!

添加控件,右擊添加變量m_com4,這個時候會生成2個重要的文件mscomm1.cpp和mscomm1.h(這是與6.0下不同點,mscomm.cpp mscomm1.h)

控件的函數(shù)不一樣的啊,Set變?yōu)閜ut_, Get變?yōu)間et_ 就搞定。

////////////////////////////////////////////////////////////////////////////////VC.NET 的代碼

void CRobotDlg::InitCom(void)

{   m_com4.put_CommPort(4);//1=表示是COM1,若要使用COM2,則將此參數(shù)改成2、以此類推 

         m_com4.put_InputMode(1);//設(shè)置輸入方式為二進(jìn)制

         m_com4.put_InBufferSize(1024);//設(shè)置輸入緩沖區(qū)大小

         m_com4.put_OutBufferSize(1024);//設(shè)置輸出緩沖區(qū)大小

         m_com4.put_Settings("9600,n,8,1");//設(shè)置參數(shù)

if(!m_com4.get_PortOpen())//打開串口

         m_com4.put_PortOpen(true);

         m_com4.put_RThreshold(2);//2表示有2個字節(jié)引發(fā)一個事件

         m_com4.put_InputLen(0);//清除輸入緩沖

}

void CRobotDlg::ComSend(BYTE data)

{

         CByteArray array1;              //定義字節(jié)流

         array1.RemoveAll();  //清空

         array1.SetSize(1);   //設(shè)置字節(jié)的長度

         array1.SetAt(0,data);  //以2進(jìn)制方式發(fā)送0xAA

         m_com4.put_Output(COleVariant(array1));   //發(fā)送

}

void CRobotDlg::OnBnClickedButton1()

{       // TODO: 在此添加控件通知處理程序代碼

         InitCom();

         ComSend(0x00);

}

/////////////////////////////////////////////////////////6.0的代碼

void CrobotDlg::InitCom4(void)

{       m_com4.SetCommPort(4);//1=表示是COM1,若要使用COM2,則將此參數(shù)改成2、以此類推      m_com4.SetInputMode(1);//設(shè)置輸入方式為二進(jìn)制

         m_com4.SetInBufferSize(1024);//設(shè)置輸入緩沖區(qū)大小

         m_com4.SetOutBufferSize(1024);//設(shè)置輸出緩沖區(qū)大小

         m_com4.SetSettings("9600,n,8,1");//設(shè)置參數(shù)

         if(!m_com4.GetPortOpen())//打開串口

                   m_com4.SetPortOpen(true);

         m_com4.SetRThreshold(2);//2表示有2個字節(jié)引發(fā)一個事件

         m_com4.SetInputLen(0);//清除輸入緩沖

}

void CrobotDlg::OnBnClickedComsendButton()

{// TODO: 在此添加控件通知處理程序代碼

         InitCom4();

         ComSend(0x00);

}

void CrobotDlg::ComSend(BYTE mydata)

{

         CByteArray array1;              //定義字節(jié)流

         array1.RemoveAll();  //清空

         array1.SetSize(1);   //設(shè)置字節(jié)的長度

         array1.SetAt(0,mydata);  //以2進(jìn)制方式發(fā)送0xAA    

         m_com4.SetOutput(COleVariant(array1));   //發(fā)送

}

4.請看源代碼的區(qū)別,詳見mscomm1.h,  mscomm.cpp

如mscomm1.h下的一段串口定義函數(shù)代碼

void put__CommPort(short newValue)

     {

         static BYTE parms[] = VTS_I2 ;

         InvokeHelper(0x0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);

     }

如mscomm.cpp下的一段串口定義函數(shù)的代碼

void CMSComm::SetCommPort(short nNewValue)

{       static BYTE parms[] =          VTS_I2;

         InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,   nNewValue);

}

分享到:        
閱讀(539)| 評論(0)| 轉(zhuǎn)載 (0) |舉報

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多