数据采集器课题总结Read.docx
《数据采集器课题总结Read.docx》由会员分享,可在线阅读,更多相关《数据采集器课题总结Read.docx(16页珍藏版)》请在冰豆网上搜索。
数据采集器课题总结Read
数据采集器课题总结
一.课题目的
在嵌入式应用领域,串口是目前应用非常广泛的一种接口。
我们以后基本都会遇到串口编程的相关需求,所以这是我们不能回避的一个学习要点。
我们通过自己编写的数据采集器来接收串口的数据,并且能够将数据保存为文本形式,方便分析与利用。
它给我们提供了一个很好的工作平台,在编程的同时,我们也学习了串口通信的原理与图片处理的知识。
二.课题要求
1.使用MS控件实现串口编程;
2.使用serialport类实现串口编程;
3.在实现串口编程的基础上结合单片机开发板(也可以是其他架构的嵌入式处理器)编写数据传送服务;
4.在实现第3点的基础上将下位机的数据以文本的形式实时显示在PC上;每个数据包内容为(X轴坐标值,Y轴坐标值)。
5.在实现第4点的基础上将下位机的数据以图形的方式实时绘制在PC上;
6.坐标系可以根据接收到的数据动态改变范围。
7.可以把当前显示的数据曲线保存成图片文件和txt文件。
8.利用鼠标可以放大缩小显示区域。
9.实现进程间传递数据,即串口进程接收另一个进程的数据并显示出来(其显示方式和4,5中要求一样)。
三.小组分工细则
本组有三个人组成。
按照实验的要求,我们将课题分为三个大的模块:
串口编程:
周志辉
图形显示:
严灿祥
数据处理、进程通信:
张孟威
相关说明:
1.串口编程部分我们采用了MS控件,因为它操作简便,网上有不少的实例,对我们编程有很大帮助。
2.图形显示方面用BMP格式存储位图,在内存中进行图形处理。
在构建了图形坐标后,就要建立相应的数据接口,可以和串口通信和数据导入相结合。
3.数据包括导入数据、导出数据、显示数据三个部分,另外还包括一些数据显示的优化。
重点要实现的是将图形的坐标读取并保存。
4.最后我们要做的是将各功能组合,并完善。
四.课题功能实现
图形显示
我们用的是基于对话框的MFC编程,在其中添加相关的菜单实现要求。
由MFC生成图形界面的框架,再由三人在此基础上进行分别的调试,如下图:
图形编程相对来说比较复杂,本组在接到课题时,还不了解有关图形方面的知识,但只要努力专研就一定能看懂!
为此,在查阅了许多有关图形方面的知识后,我们对图形这一方面也有了一定的了解,知道了一些有关坐标图的原理。
将此模块分为以下几个模块:
1.voidDrawCurvePanel(CDC*pDC);
初始化坐标盘
2.voidDrawGrid(CDC*pDC);
初始化画网格
3.voidDrawCurve(CDC*pDC)
画出数据对应坐标
4.voidDrawAxis(CDC*pDC);
画出X、Y轴的坐标。
5.intConvertTimeToAxisX(doubledTime);
将得到的坐标点x转化到坐标系中。
6.intConvertValueToAxisY(doubledValue);
将得到的坐标点y转化到坐标系中。
7.voidRecovery();
让窗口图像复位,用于放大图后的串口位图复原。
8.voidAmplify(void);
放大位图。
9.voidSetDimy(doublenewDimY);
用于设置y坐标相邻两个之间的最小单位。
10.voidSetDimT(doublenewDimT);
用于设置y坐标相邻两个之间的最小单位。
11.voidSaveBMP(CStringfilename);
保存位图。
12.voidDraw(CDC*pDC);
主画图函数,用于初始化整个坐标系。
13.voidClear();
将用于存取数据的链表清零,并含有voidRecovery();的功能。
14.voidUpdateCurve(intmaxtime,intmaxvalue);
更新坐标系,再接收新的数据后要将坐标图重画,加入坐标点。
15.voidAddValue(doubledTime,doubledValue);
用于将数据加入链表中。
16.virtual~CScope();
析构函数。
17.CScope();
用于相关数据的初始化,包括画刷,画笔,链表,CScope成员等。
18.BOOLOnEraseBkgnd(CDC*pDC)
坐标初始化背景函数,可以定位图中的坐标位置轴位置,及相关参数。
用Draw()函数初始化后的坐标图如下:
串口编程
串口方面的编程相对简洁,可以借助串口调试助手进行实验,我们采用的是将两个数据一组对单片机发过来的数据进行采样,中间为逗号隔开。
串口通信是目前工程中应用非常广泛的一种接口;在Win32下,可以使用三种编程方式实现串口通信。
1.调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且使用起来比较自由灵活,但由于涉及到Windows的底层接口函数,对于初学VC++的人来说,应用起来比较困难;
2.是使用ActiveX控件,VisualC++为我们提供了一种好用的ActiveX控件MicrosoftCommunicationsControl(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控件后就可以较为方便地实现对通过计算机串口收发数据。
虽然在灵活性方面比较欠缺,但对初学者来说使用起来非常简单,很容易上手,因此在本程序中我们采用的是这种方法。
3.使用串口类。
由于MSComm控件的使用存在着诸多不便,因此国内外许多优秀的程序员自己编写了一些串口类,使用这些类我们可以更方便地操作串口。
由于本程序的串口通信比较简单,采用控件也能很方便地实现,因此,也就没采用该种方法。
首先,我们将ActiveX控件MSComm将其添加入工程,其方法是:
(1)单击主菜单project的子菜单AddToproject的ComponentsandControls选项;
(2)在弹出的"ComponentsandControlsGallery"对话框中RegisteredActiveXControls文件夹中的"MicrosoftCommunicationsControl,version6.0"选项,如下图:
单击其中的"Insert"按钮,MSComm控件就被增加到工程中了。
接下来就是进行串口的编程,以下是进行串口设置的部分代码:
{//m_mscomm为mscomm控件变量
m_mscomm.SetCommPort(tmp);//设置端口号为tmp,其中tmp为一整型值,本程序中可取1~4
m_mscomm.SetInBufferSize(1024);//设置串口输入缓存区的大小为1024字节
m_mscomm.SetOutBufferSize(512);//设置串口输出缓存区的大小为512字节
/*如果串口没有打开,就打开串口*/
if(!
m_mscomm.GetPortOpen())
{
m_mscomm.SetPortOpen(TRUE);
}
m_mscomm.SetInputMode
(1);//设置以二进制读写数据
baudrate.Format("%s%s",setdlg.m_btrate,",n,8,1");
m_mscomm.SetSettings(baudrate);//设置波特率,是否奇偶校验,数据位数,停止位,格式为“9600,n,8,1”
m_mscomm.SetRThreshold
(1);//一接收到字符就发送OnComm事件
m_mscomm.SetInputLen(0);//每次读取缓存区中的所有数据
}
串口数据的接收部分代码如下:
variant_inp=m_mscomm.GetInput();//获取缓存区的数据
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();//获得接收到的数据的个数
for(i=0;i{
safearray_inp.GetElement(&i,&rxdata[i]);//读取数据到rxdata数组中
}
rxdata[i]='\0';
以下是通过串口调试助手发送的数据以及本程序对其的显示图:
数据处理
我们在Cscope类中添加了数据导出函数voidCScope:
:
Export(),该函数的功能是将接收到的数据导出到指定路径下的txt文件中,当点击程序菜单中的“导出数据”子菜单后主对话框CDateCollDlg类中的voidCDateCollDlg:
:
OnExportData()函数就会调用Cscope类中的Public函数voidCScope:
:
Export()来输出数据。
当需要重新显示以前保存的数据时,点击程序菜单中的“打开数据”子菜单,主对话框CDateCollDlg类中的voidCDateCollDlg:
:
OnOpenData()函数就会将已保存在txt文件中的数据重新在坐标中显示。
为了方便随时观察图形中描绘的数据,我们添加了“坐标显示”菜单,单击“显示”子菜单,就会在图像的右侧将该图像中描点连线的坐标给显示出来,当不需要时单击“隐藏”子菜单就会恢复到原来的界面。
该功能是通过voidCDateCollDlg:
:
OnShowData()和voidCDateCollDlg:
:
OnHide()函数来实现的,在对话框显示之前,在初始化函数BOOLCDateCollDlg:
:
OnInitDialog()中将图像右侧的数据显示区先隐藏起来。
进程通信
我们并没有搞很复杂的进程通信,具体实现如下。
将一个发送数据的进程实例打开,点击发送后就能将数据送到剪切板上,再有另一个进程,也就是我们的数据采集器获剪切板上的数据,做出相应的图。
1.数据发送窗口
2.数据接收窗口
为下图下方的窗口,由于显示相应的进程通信坐标。
功能整合
完成上述功能之后,就要进行整合,能让各模块协调工作。
下面是效果图
1.导入数据:
将“参数.txt”文件导入后显示如下,里面存储的是正弦波的坐标,当为乱序时,软件有坐标自动从小到大排列功能
放大后:
采用鼠标拖动,用矩形框选择所需要的放大的区域,放大后效果如下。
由采样的数据本身的间隔较大,显示的图形比较粗糙,再加上没有进行相关的图形优化算法,放大后的连线明显的有锯齿痕迹,有待改进。
文档参数如下:
2.BMP格式图形保存:
点击菜单中的“保存BMP”就可以生成*.bmp图片
3.串口设置
五.一些BUG与体会
如下图:
当图形放大后,坐标会跟着放大,这个问题其实很好解决,但是有一点就是在放大了之后还要显示特定区域的坐标,我们查看了Pspice画图软件,看到它的坐标处理的很好,值得我们思考,所以这么功能还有待完善。
还有就是坐标根据输入数据的变换,放大后它的坐标要跟着变。
一开始我们用的是“纯”的对话框,用按钮来实现功能,虽然我们的功能基本能实现,但是在进行坐标变换时很麻烦,图如下
我们在GetWindowRect和GetClientRect之间纠结了很长时间,再加上GetClientRect,会将获得的矩形框的左上角默认赋值为(0,0)所以坐标的转换很困难,在用了菜单之后,将整个坐标盘拉满整个客户区,就省去了不少的麻烦。
最让人头痛的要算是单片机的BUG了。
我们用单片机发送四个点作图,但在发送5个点的时候出现内存错误,于是我们用串口调试助手接收数据,发现单片机能将数据传出去。
仔细分析后我们将程序进行了调试,发现数据居然被准确地存进了我们的链表!
有同学提出会不会是按键抖动的问题,但很快被排除。
最后只好换了一种发送数据的方法。
这个问题只好让它留着。
在进程通信时,我们利用的剪切板有问题,只能接收一次数据,在第二次发送时图得不到更新!
我们发现剪切板的内容变了,但那个接收的还是原来的数据,也用了UpdateData()
没能解决。
值得高兴地是,我们最后基本实现了课题的要求,在整个过程中,很考究各组的分工合作,每个人对自己的任务要好好完成,并能按照一定的规范,方便队友的功能组合。
遇到困难要学会交流,也许某位队友在那方面厉害也说不定,可千万不能选择放弃,虽然这不是什么大的项目,但也要求我们有耐心去协调,融合。
六.操作技巧
1.按下鼠标左键,拖动产生矩形框,用于显示放大区。
2.放大后想还原原图,按鼠标右键
3.“文件->导入数据”后能及时显示图形,并在“坐标数据->显示”后,可看到坐标点。
导入数据格式:
4.点击“保存BMP”来保存图形。
5.打开进程通信的“TongXin.exe”后发送数据,在DateColl.exe中“进程通信->通信数据作图”后有图形出现,按“坐标数据->显示”可看到接收的数据。
发送的数据格式:
6.串口通信在串口在“串口通信->串口配置”中,有端口号和波特率,设置完成后如果接收正确,则“串口通信->作图”后,出显图形
单片机及串口调试助手发送数据格式:
其中
发送的数据以逗号为分隔符,且为偶数(因为坐标是x,y值共同决定的)。