經過這兩天的調試,基本上搞定了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碼錶就知道了),串口收到了來自上位機發送過來的數據,實驗就是這麼簡單。下一篇博客寫手柄和串口的聯合使用。