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

来源:互联网 发布:程序员出路 编辑:程序博客网 时间:2024/05/21 08:42

        经过这两天的调试,基本上搞定了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); //选择com1if( !m_ctrlComm.GetPortOpen()){m_ctrlComm.SetPortOpen(TRUE);//打开串口AfxMessageBox(" open serial port successfully");}elseAfxMessageBox("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); //设置当前接收区数据长度为0m_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码表就知道了),串口收到了来自上位机发送过来的数据,实验就是这么简单。下一篇博客写手柄和串口的联合使用。





原创粉丝点击