这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. if(m_ctrlComm.GetPortOpen())
  2. m_ctrlComm.SetPortOpen(FALSE);
  3. m_ctrlComm.SetCommPort(1); //选择com1
  4. if( !m_ctrlComm.GetPortOpen())
  5. {
  6. m_ctrlComm.SetPortOpen(TRUE);//打开串口
  7. AfxMessageBox(" open serial port successfully");
  8. }
  9. else
  10. AfxMessageBox("cannot open serial port");
  11. m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
  12. m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
  13. m_ctrlComm.SetRThreshold(1);
  14. //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
  15. m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
  16. m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据


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

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

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

[html] view plain copy 在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. BYTEbt=*(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 跳转至

回复

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