資源描述:
《在VC++6.0中利用串行通信控件》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、在VC++6.0中利用串行通信控件崔杰梁計春王國軍目前,在用計算機(jī)進(jìn)行數(shù)據(jù)傳輸時,常用的是串行通信方式。在VisualC++的編程中,既可以用WindowsAPI函數(shù)進(jìn)行串行通信編程,也可以利用環(huán)境自帶的控件進(jìn)行編程。利用API函數(shù)編寫實際應(yīng)用程序時,往往要考慮多線程的問題,這樣編出來的程序不但十分龐大,而且結(jié)構(gòu)比較復(fù)雜,繼承性差,維護(hù)困難。但是使用串行通信控件就相對簡單一些,而且功能強(qiáng)大,性能安全可靠。本文以MicrosoftCommunicationsControl(version6.0)為例,介紹串行通信控件在VC++中的使用方法。嵌入通信控件使用串行通
2、信控件前,首先要進(jìn)行系統(tǒng)注冊。1、在建立新工程時,將ActiveXControls復(fù)選框選中,表示本程序支持ActiveX控件。2、單擊Project菜單,從中選擇AddtoProject,在彈出的對話框中單擊ComponentsandControls選項,然后在彈出的對話框中再單擊RegisteredActiveXControls選項。3、在列表中選擇MicrosoftCommunicationsControl(version6.0),形狀為帶有紅色底座的黃色電話機(jī)。單擊Insert按鈕,確認(rèn)后,會出現(xiàn)一個ConfirmClasses對話框,其中列出了該控件
3、的類名(CMSComm)、頭文件名(MSComm.h)、執(zhí)行文件名(MSComm.cpp)。關(guān)閉此對話框,在程序主界面的控件列表中,可以看到該通信控件已被加入,拖動該控件就可以將其放入程序中。編寫通信程序通信控件的工作原理類似于中斷方式,當(dāng)有通信事件發(fā)生時,如發(fā)送、接收數(shù)據(jù),就會觸發(fā)OnComm事件。在OnComm事件的處理函數(shù)中調(diào)用GetCommEvent()函數(shù),由該函數(shù)的返回值即可確定是什么類型的事件,并由此做出相應(yīng)的處理。下面以接收處理串口的GPS信號為例,說明該控件在編程中的具體應(yīng)用。利用MFC生成一個基于對話框的應(yīng)用程序,對話框中的控件及其相應(yīng)的消
4、息與響應(yīng)函數(shù)如下表所示??丶Q控件ID對應(yīng)變量通信控件IDC_MSCOMMm_Comm接收按鈕IDC_BUTTON_RECEIVEGPSDATAOnbuttonStartreceivegps()GPS信號顯示IDC_EDIT_COMDATAm_comdata停止接收按鈕IDC_BUTTON_ENDRECEIVEGPSDATAOnbuttonEndreceivegps()設(shè)置控件各部分屬性:CommPort:1;DTREnable:1;InBufferSize:4096;EOFEnable:TRUE;Handshaking:nohandshaking;Inpu
5、tMode:1-Binary;NullDiscard:False;Rthreshold:250;RTSEnable:False;Settings:9600,n,8,1;Sthreshold:0。部分程序如下://開始接收GPS信號voidCGpsDlg::OnButtonStartreceivegps(){//判斷串口的狀態(tài),如果是關(guān)閉狀態(tài),則打開if(!m_Comm.GetPortOpen())//打開串口m_Comm.SetPortOpen(TRUE);UpdateData(TRUE);}//停止接收GPS的信號voidCGpsDlg::OnButtonE
6、ndreceivegps();{//判斷串口的狀態(tài),如果是打開狀態(tài),則關(guān)閉if(m_Comm.GetPortOpen())m_Comm.SetPortOpen(FALSE);UpdateData(FALSE);}//相應(yīng)的OnComm事件處理voidCGpsDlg::OnComm(){m_comdata.Empty();VARIANTm_input1;COleSafeArraym_input2;LONGlength,i;BYTEdata[1024];CStringstr;//接收緩沖區(qū)內(nèi)字符if(m_Comm.GetCommEvent()==2){m_comd
7、ata.Empty();//讀取緩沖區(qū)內(nèi)的數(shù)據(jù)m_input1=m_Comm.GetInput();//將VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量m_input2=m_input1;//確定數(shù)據(jù)長度length=m_input2.GetOneDimSize();//將數(shù)據(jù)轉(zhuǎn)換為BYTE型數(shù)組for(i=0;i8、c",a);m_comdata+=st