|
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)文收藏》