OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » VC上位机MFC利用串口控件发送接收数据

共10条 1/1 1 跳转至

VC上位机MFC利用串口控件发送接收数据

专家
2014-11-02 18:32:43    评分

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

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

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

指导书参考:,自己按照自己的要求修改就行了。

——回复可见内容——


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.打开串口和设置串口参数

    拖入一个按钮,命名为打开串口,双击,编辑函数

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. if(m_ctrlComm.GetPortOpen())  
  2.         m_ctrlComm.SetPortOpen(FALSE);  
  3.       
  4.     m_ctrlComm.SetCommPort(1); //选择com1  
  5.     if( !m_ctrlComm.GetPortOpen())  
  6.     {  
  7.         m_ctrlComm.SetPortOpen(TRUE);//打开串口  
  8.         AfxMessageBox(" open serial port successfully");  
  9.     }  
  10.     else  
  11.         AfxMessageBox("cannot open serial port");  
  12.       
  13.     m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位  
  14.     m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据  
  15.     m_ctrlComm.SetRThreshold(1);   
  16.     //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件  
  17.     m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0  
  18.     m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据  


5添加串口事件消息处理函数OnComm()

    打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm。

    这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. VARIANT variant_inp;  
  2.    COleSafeArray safearray_inp;  
  3.    LONG len,k;  
  4.    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.  
  5.    CString strtemp;  
  6.    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符  
  7.    {             ////////以下你可以根据自己的通信协议加入处理代码  
  8.        variant_inp=m_ctrlComm.GetInput(); //读缓冲区  
  9.        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量  
  10.        len=safearray_inp.GetOneDimSize(); //得到有效数据长度  
  11.        for(k=0;k<len;k++)  
  12.            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组  
  13.        for(k=0;k<len;k++) //将数组转换为Cstring型变量  
  14.        {  
  15.            BYTE bt=*(char*)(rxdata+k); //字符型  
  16.            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放  
  17.        }  
  18.    }  
  19.    UpdateData(FALSE); //更新编辑框内容  


6最后的测试

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

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

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

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

编译,运行,测试结果:


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





关键词: VC     MFC     上位机    

专家
2014-11-02 20:34:52    评分
2楼

嘿嘿  上位机啊~~

话说使用C#开发会快很多


助工
2014-11-02 21:01:35    评分
3楼
很想了解

工程师
2014-11-02 23:46:03    评分
4楼
感觉你什么都会的样子。。。

专家
2014-11-03 08:46:43    评分
5楼
这样子。。。我一直都用MFC来做的。

专家
2014-11-03 08:47:14    评分
6楼
看看有没有帮助哈。

专家
2014-11-03 08:47:48    评分
7楼
杂而不精,这是比较痛苦的一件事情

专家
2014-11-03 11:16:24    评分
8楼
MFC并不属于快速开发软件

菜鸟
2015-03-14 21:27:17    评分
9楼
学习。。。。。。

菜鸟
2015-03-16 20:20:07    评分
10楼
谢谢分享

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]