vc--基于mfc的上位机设计(一)

        经过这两天的调试,基本上搞定了dsp和机器人上位机界面,先记录下我的上位机。

       实验室是做机器人控制的,经常会用到上位机,我只搞过简单的上位机的编写,是基于mfc的对话框的,很多原理性的东西现在也是懵懵懂懂的,但好歹是功能也实现了。回顾自己的上位机主要涉及过的东西为一些基本控件的使用(编辑框,按钮等等),1.串口发送和接收数据,2.手柄扫描(因为实验室用手柄来遥控机器人,扫描到手柄上不同的按钮发送不同的指令和数据,这样来实现对机器人的遥控),3.usb摄像的显示(不过这东西只是一个象征性的视频回显,似乎还没真正有什么作用)。

       接下来这个实验先实现串口发送和接收数据,后面实验加上手柄,至于usb摄像头的显示不是很想加上去。到时候在看看吧。开始vc6.0实现串口发送和接收数据吧!!(已实现一个串口收发为例)

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

1新建工程

vc--基于mfc的上位机设计(一)_第1张图片

选择对话框

vc--基于mfc的上位机设计(一)_第2张图片

一路next和finish即可。

vc--基于mfc的上位机设计(一)_第3张图片

删除确定,取消,TODO。

vc--基于mfc的上位机设计(一)_第4张图片

2.在项目中插入MSComm控件 

    选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls

vc--基于mfc的上位机设计(一)_第5张图片

    选择MicrosoftCommunications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。

vc--基于mfc的上位机设计(一)_第6张图片

    在ClassView视窗中就可以看到CMSComm类了,你在控件中可以看到多了一个跟电话一样的东西。拖入到对话框中,程序运行时,他不会出现的。

vc--基于mfc的上位机设计(一)_第7张图片

3.利用ClassWizard定义CMSComm类控制对象

    打开ClassWizard>Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,(自己取好,前后一致)这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES()include "mscomm.h" //}}AFX_INCLUDES

vc--基于mfc的上位机设计(一)_第8张图片

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();//先预读缓冲区以清除残留数据

vc--基于mfc的上位机设计(一)_第9张图片

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

vc--基于mfc的上位机设计(一)_第10张图片

6最后的测试

    需要一跟串口线,一个usb转串口(这样一台电脑就可以测试了),我们要实现的功能是串口助手发送一个字节到上位机,上位机显示这个字节,并把它发送出去,串口助手接收这个字节,这里我们还需要做一些工作。

    我们首先要在上位机中接收的字节显示出来,添加一个编辑框就可以了,我们显示在编辑框中。

SetDlgItemTextA(IDC_EDIT1,strtemp);
m_ctrlComm.SetOutput(COleVariant(strtemp));//发送数据

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

vc--基于mfc的上位机设计(一)_第11张图片

编译,运行,测试结果:

vc--基于mfc的上位机设计(一)_第12张图片

    串口助手发送3F,在上位机显示?(呵呵,你可以去查找一下ASCLL码表就知道了),串口收到了来自上位机发送过来的数据,实验就是这么简单。下一篇博客写手柄和串口的联合使用。





你可能感兴趣的:(vc界面,vc6.0,机器人上位机,串口)