经过这两天的调试,基本上搞定了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
- 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()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:
[html] view plaincopy- 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码表就知道了),串口收到了来自上位机发送过来的数据,实验就是这么简单。下一篇博客写手柄和串口的联合使用。