vc--基於mfc的上位機設計(一)

        經過這兩天的調試,基本上搞定了dsp和機器人上位機界面,先記錄下我的上位機。

       實驗室是做機器人控制的,經常會用到上位機,我只搞過簡單的上位機的編寫,是基於mfc的對話框的,很多原理性的東西現在也是懵懵懂懂的,但好歹是功能也實現了。回顧自己的上位機主要涉及過的東西爲一些基本控件的使用(編輯框,按鈕等等),1.串口發送和接收數據,2.手柄掃描(因爲實驗室用手柄來遙控機器人,掃描到手柄上不同的按鈕發送不同的指令和數據,這樣來實現對機器人的遙控),3.usb攝像的顯示(不過這東西只是一個象徵性的視頻回顯,似乎還沒真正有什麼作用)。

       接下來這個實驗先實現串口發送和接收數據,後面實驗加上手柄,至於usb攝像頭的顯示不是很想加上去。到時候在看看吧。開始vc6.0實現串口發送和接收數據吧!!(已實現一個串口收發爲例)

指導書參考:http://download.csdn.net/detail/xzyfeixiang/6601493,自己按照自己的要求修改就行了。

1新建工程


選擇對話框


一路next和finish即可。


刪除確定,取消,TODO。


2.在項目中插入MSComm控件 

    選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls


    選擇MicrosoftCommunications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受缺省的選項。


    在ClassView視窗中就可以看到CMSComm類了,你在控件中可以看到多了一個跟電話一樣的東西。拖入到對話框中,程序運行時,他不會出現的。


3.利用ClassWizard定義CMSComm類控制對象

    打開ClassWizard>Member Viariables選項卡,選擇CSCommTestDlg類,爲IDC_MSCOMM1添加控制變量:m_ctrlComm,(自己取好,前後一致)這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES()include "mscomm.h" //}}AFX_INCLUDES


4.打開串口和設置串口參數

    拖入一個按鈕,命名爲打開串口,雙擊,編輯函數

if(m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(FALSE);
	
	m_ctrlComm.SetCommPort(1); //選擇com1
	if( !m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(TRUE);//打開串口
		AfxMessageBox(" open serial port successfully");
	}
	else
		AfxMessageBox("cannot open serial port");
	
	m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數據位,1個停止位
	m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
	m_ctrlComm.SetRThreshold(1); 
	//參數1表示每當串口接收緩衝區中有多於或等於1個字符時將引發一個接收數據的OnComm事件
	m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度爲0
	m_ctrlComm.GetInput();//先預讀緩衝區以清除殘留數據


5添加串口事件消息處理函數OnComm()

    打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數名改爲OnComm。

    這個函數是用來處理串口消息事件的,如每當串口接收到數據,就會產生一個串口接收數據緩衝區中有字符的消息事件,我們剛纔添加的函數就會執行,我們在OnComm()函數加入相應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:

 VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
    CString strtemp;
    if(m_ctrlComm.GetCommEvent()==2) //事件值爲2表示接收緩衝區內有字符
    {             ////////以下你可以根據自己的通信協議加入處理代碼
        variant_inp=m_ctrlComm.GetInput(); //讀緩衝區
        safearray_inp=variant_inp; //VARIANT型變量轉換爲ColeSafeArray型變量
        len=safearray_inp.GetOneDimSize(); //得到有效數據長度
        for(k=0;k<len;k++)
            safearray_inp.GetElement(&k,rxdata+k);//轉換爲BYTE型數組
        for(k=0;k<len;k++) //將數組轉換爲Cstring型變量
        {
            BYTE bt=*(char*)(rxdata+k); //字符型
            strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
        }
    }
    UpdateData(FALSE); //更新編輯框內容


6最後的測試

    需要一跟串口線,一個usb轉串口(這樣一臺電腦就可以測試了),我們要實現的功能是串口助手發送一個字節到上位機,上位機顯示這個字節,並把它發送出去,串口助手接收這個字節,這裏我們還需要做一些工作。

    我們首先要在上位機中接收的字節顯示出來,添加一個編輯框就可以了,我們顯示在編輯框中。

SetDlgItemTextA(IDC_EDIT1,strtemp);
m_ctrlComm.SetOutput(COleVariant(strtemp));//發送數據

    在OnComm()添加上面兩行就可以了,


編譯,運行,測試結果:


    串口助手發送3F,在上位機顯示?(呵呵,你可以去查找一下ASCLL碼錶就知道了),串口收到了來自上位機發送過來的數據,實驗就是這麼簡單。下一篇博客寫手柄和串口的聯合使用。





發佈了55 篇原創文章 · 獲贊 15 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章