上位机应用软件设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 错误!文档中没有指定样式的文字。
硕士论文
1.1上位机应用软件设计
在用户看来,USB系统就是USB设备到主机的连接,但对开发人员来说,这种连接可以被分为3个逻辑层:功能层、USB设备层和USB总线接口层,且每一层都是由主机和USB设备的不同模块组成如图 1.1.1所示。
图 1.1.1 USB通信模型
在主机和设备之间通信最终都通过USB电缆进行,在上层水平层之间存在逻辑的主机到设备信息流。
主机上客户软件和设备功能部件之间的通信是基于实际应用需求及设备所能提供的能力,客户软件与功能部件之间的透明通信的要求,决定主机和设备下层部件的功能以及它们的界面。
1、客户软件
负责和USB设备的功能单元进行通信,以实现其特定功能。
这是本系统开发重点。
客户软件不能直接访问USB设备。
它一般包括USB设备驱动程序和界面应用程序两部分。
USB设备驱动程序负责和USB系统软件实现接口,通常USB总线驱动程序发出I/O 请求包以启动一次USB数据传输。
界面应用程序负责和USB设备驱动程序实现接口,以操控USB设备,并向用户提供可视化操作。
2、USB系统软件
负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据传输。
一般包括USB总线驱动程序、USB主控制器驱动程序和非USB主机软件三部分。
这部分软件通常是由操作系统提供,本系统开发不需要涉及此部分。
3、USB总线接口
包括主控制器和根集线器两部分。
根集线器为USB系统提供连接起点,主控制器负责完成主机和USB设备之间数据的实际传输。
该模块与USB系统软件的接口依赖于主控制器的硬件实现[2]。
在USB系统中只允许一个主机,本系统主要分为3个不同模块:客户软件、USB 系统软件和USB总线接口。
对于本弹丸速度测试系统来说,工作重点是放在客户软件即上位机应用软件的编写,包括USB设备驱动程序和用户端应用程序。
1.1.1上位机软件总规划
如上节所介绍的,上位机的软件主要包括两个方面:一方面是USB设备驱动程序,针对系统设计所使用的USB接口芯片,给系统提供完善的应用层操作接口;另一方面是本弹丸速度测试系统的用户端应用程序设计,负责和USB设备驱动程序实现接口,以控制USB设备,这方面也就是本节着重要介绍的。
整个软件采用MFC开发工具进行编写,界面简洁流畅,便于用户操作。
1.1.2CH375设备驱动程序
USB设备的开发需要计算机端的驱动程序,驱动程序文件图标如图1.1.2所示。
图 1.1.2 CH375驱动程序
由于USB设备属于PnP(即插即用)设备,因此当第一次插入CH375设备时,PnP 管理器能够自动检测硬件并分配I/O资源。
系统初次使用该设备时,系统会提示安装驱动程序,这就是在上节提到的硬件查找。
CH375WDM.INF包括了安装驱动程序的位置和信息,CH375DLL.DLL相当于给应用层的接口。
图 1.1.3 CH375头文件和库文件
上位机要进行数据传输,就需要用到接口函数,因此需要有相应头文件和链接库文件,如图 1.1.3所示。
CH375DLL.H是USB总线接口芯片CH375的应用层接口库。
在上位机程序和MCU程序中都要添加头文件CH375DLL.H和动态链接库。
1.1.3上位机用户端程序设计
1.1.3.1用户界面设计
用户界面是用户操作的平台,在设计时应在完成各功能同时需最大程度地做到简洁、美观、使用方便,主操作界面如图 1.1.4所示。
图 1.1.4 上位机主操作界面
下面介绍下主操作界面的各控件含义:
“系统初始化”:测试子对话框—“数据处理”运行是否正常,同时对各变量进行初始化。
“打开USB”:测试USB设备是否已连接。
若USB设备未连接时,点击此控件后会弹出“打开设备失败”的提示框;若USB设备连接成功,点击此控件后则“USB设备信息”栏中会出现相应的设备信息和状态提示,同时速度上传框中上会显示“准备采集速度”字样,系统可正常进行USB通信。
“选择靶种”:本系统针对光电靶和天幕靶两种靶种(区截装置),在实际测试时可以现场实验情况选择靶种。
系统初始默认的靶种为光电靶。
“确定”:即靶距确定键。
当靶距根据现场测量输入完毕后,按“确定”键即将靶距传给下位机MCU为计算速度v提供L,下传过程中此控件不可用,下传成功后此控件恢复可用状态。
“靶距确认框”:测试下传到MCU的靶距是否正确。
用户点击“上传”控件将靶距重新上传至上位机操作界面上相应的靶距确认框。
如果上传靶距与输入的靶距不符时,需重新系统初始化,若相同则说明靶距输入正确,可进行下一步的操作。
靶距正确下
传是整个系统正确测试弹丸速度的基础。
“上传速度”:当下位机LCD屏出现“请上传数据”字样,提示用户可进行上传速度操作,点击此控件后此发弹丸速度将会显示在速度上传框中。
下一发弹丸射击结束后重复这个操作即可再次上传。
“原始文件保存”:保存未进行数据处理的文件,提供给用户原始测试报告,包括速度、动能、比动能等。
“数据处理”:是打开子对话框数据分析的界面,界面如图1.1.5所示。
图 1.1.5 上位机数据处理界面
数据分析操作界面上包括“ctrl列表”、“ctrl保存”、“3σ标准”控件。
“ctrl列表”:显示本次测试的所有弹丸速度、动能、比动能;
“3σ标准”:是根据3σ准则标记异常数据,用户根据标记自主剔除异常数据;
“ctrl保存”:为保存数据处理后的文件。
测试结束,原始文件和数据处理后的文件都保存完毕后,点击主界面的“结束关闭界面”退出。
图 1.1.6为上位机操作流程,用户可根据此流程图完成上位机测试操作。
图 1.1.6 上位机主流程图
1.1.3.2端对端的USB传输
CH375在计算机应用层与本地端单片机(MCU)之间提供了端对端的连接,有两种通信方式可供选择:单向数据流方式和请求应答方式。
单向数据流方式使用两个方向相反的单向数据流进行通信,具有较高的数据传输速率,但是数据不容易同步;请求应答方式是使用主动请求和被动应答的查询方式进行通信,数据自动同步,具有较好的交互性和可控性,程序设计相对简单,但是数据传输速率相对较低[10]。
请求应答方式使用一个下传的主动请求和一个上传的被动应答进行交互式的双向数据通信,两者是相互对应的。
主动请求是指由计算机应用层下传给单片机的数据请求,被动应答时指单片机收到数据请求后,上传给计算机应用层的应答数据,所有通信都是有计算机应用层发起,然后以接收到单片机的应答结束,
在操作主界面上提到的靶距“确认”、靶距“上传”、“上传速度”都是采用的的请求应答方式的USB传输方式。
下面将做具体介绍。
HANDLE T2DHandle; //端点2下传设备打开句柄
HANDLE T1Handle; //端点1上传设备打开句柄
HANDLE T2UHandle; //端点2上传设备打开句柄
表 1.1.1 读写API函数
端点状态函数名函数内容函数作用
端点2下传CH375WriteData BOOLWINAPICH375WriteData(
ULONG iIndex,
PVOID iBuffer,
PULONG ioLength );
写出数据块,指定
设备号iIndex,将指
定数据长度
ioLength的数据写
入写入缓冲区
iBuffer,
端点1上传CH375ReadInter BOOL WINAPI
CH375ReadInter(
ULONG iIndex,
PVOID oBuffer,
PULONG ioLength );
读取中断数据,指
定设备号iIndex,读
取指定缓冲区
oBuffer中指定数
据长度ioLength的
数据
端点2上传CH375ReadData BOOLWINAPICH375ReadData(
ULONG iIndex,
PVOID oBuffer,
PULONGioLength );
写出数据块,指定
设备号iIndex,将指
定数据长度
ioLength的数据写
入写入缓冲区
iBuffer,
表 1.1.1为端点上传下传中使用到的CH375DLL.H头文件中的三个API函数,因此上位机主程序需添加此头文件#include "CH375DLL.H"。
1、靶距下传
靶距下传是使用端点2下传端点。
当点击“确认”控件时,执行void CCH375UpDownDlg::OnButton2Down()代码段,程序流程图见图1.1.7。
程序主要语句如下:
mTrdDown2=AfxBegiThread(mThreadDown2,this,THREAD_PRIORITY_NORMAL,0,0, NULL);是建立端点2下传线程
CCH375UpDownDlg *pDlg = (CCH375UpDownDlg *)pParam;
memcpy(mBuf,pDlg->m_downdata2,datalen);//将要下传的数据传至mBuf
if(!CH375WriteData((ULONG)pDlg->T2DHandle,&mBuf[0],&dlen))
{
if ( !pDlg->m_close ) MessageBox(NULL,"端点2下传失败!如果设备断开过那么请先关闭本程序","DEBUG375",MB_OK|MB_ICONSTOP);
}
else{
char tem[50]="";
DownCount=DownCount+1;
sprintf(tem,"Down: %d",DownCount);
SetDlgItemText(pDlg->m_hWnd,IDC_DownCount,tem);
}//如果上传成功,则靶距确认次数加1,否则出现错误提示框
图 1.1.7 输入靶距下传软件流程图
图 1.1.8 上位机靶距下传框
如图 1.1.8 上位机靶距下传框,“5位”代表输入的靶距位数,如图中的“94700”代表的0.947m,“DOWN:3”表示这是本次测试第三次换靶距。
本系统设计的靶距可输入5位或6位,因此靶距改变范围在0.1m~9.99999m。
2、靶距确认
靶距确认是采用了端点1上传端点。
靶距确认上传和输入靶距下传思路基本相同,区别在于1、上传时读数据,下传为写数据;2、端点2下传缓冲区有64字节,端点1上传缓冲区为8字节。
软件编写思路为:
1、USB设备打开,数据长度在范围以内的情况下,打开端点1上传设备:
T1Handle=CreateFile((char*)&DeviceName[0],GENERIC_READ|GENERIC_WRIT E,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXIS
TING,FILE_ATTRIBUTE_NORMAL,NULL);
2、打开端点1上传线程:
mTrdUp1=AfxBeginthread(mThreadUp1,this,THREAD_PRIORITY_NORMAL,0,0,N ULL);
3、启动线程成功后,将端点2下传的数据传至端点1上传缓冲区:
CH375ReadInter((ULONG)pDlg->T1Handle,&mBuf,&dlen);
4、读出数据至上位机操作界面靶距确认框:
sprintf(&buffer[j],"%01d ",mBuf[i]);
SetDlgItemText(pDlg->m_hWnd,IDC_EDIT1_UPDATA,buffer);
5、上传成功,退出线程。
图 1.1.9 上位机靶距上传确认框
图 1.1.8、图 1.1.9所示的靶距完全相同,说明下位机MCU接收到的靶距正确,系统可以开始等待正式测试。
3、上传速度
图 1.1.10 测试主界面
图 1.1.10 测试主界面是进行实弹气枪实验时的工作主界面,“上传次数UP:5”代表用户已经采集了5次速度,因此速度上传框中一共有5发弹丸速度。
当LCD屏上显示“请上传”,每按一次“上传速度”键,速度列表框中即显示所上传的弹丸速度。
具体软件流程见图 1.1.11。
图 1.1.11 上传速度流程图
关键程序语句:
memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));
T2UHandle = CreateFile( (char *)&DeviceName[0], GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, N_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
//打开端点2下传设备
CCH375UpDownDlg *pDlg = (CCH375UpDownDlg *)pParam;
if ( pDlg->T2UHandle != INV ALID_HANDLE_VALUE ) {//如果打开设备成功
if(CH375ReadData((ULONG)pDlg->T2UHandle,&mBuf[0],&dlen)){//如果将需上传的速度值成功写入端点2上传管道中,即传至mBuf[],则进行下一步工作for(i=0,j=0;i<dlen;i++)
{
sprintf(&buffer[j],"%01d ",mBuf[i]);
j += 1;
buffer[4]='.';
}
buffer[j] = '\0'; //将上传到的速度值按一定格式传至buffer[]
ShowUpdata(buffer,j);//将速度值显示在速度列表框中
char tem[50]="";
UpCount=UpCount+1;
sprintf(tem,"Up: %d",UpCount);
SetDlgItemText(pDlg->m_hWnd,IDC_UpCount,tem);
} //每上传成功一次,UP次数加1,
在下位机MCU中测时模块得到的速度值v[]在数据上传端点2采用命令函数WR_USB_DATA7将数据上传至数据上传管道,点击“上传速度”键,调用void CCH372UpDownDlg::OnButton2Up()函数,启动端点2上传线程,线程成功启动后,上位机通过CH375ReadData()将函数读出速度值,假设速度值为2117.57m/s,则在下位机中数组v[]中存储的数据位[2 1 1 7 5 7],首先读出到数组buffer[]中的依然是[2 1 1 7 5 7],然后根据具体情况,弹丸速度最大不会超过10000m/s,因此buffer[4]必为小数点”.”,即buffer[0]~buffer[3]代表整数位,buffer[5]~buffer[6]代表小数点后的位数,然后将按照格式的速度值显示在速度列表框中,这一次速度上传结束,上传数加1,这也是弹丸采集数,也是为了方便用户获知本次测试已射击的枪弹数。
4、靶种选择
在整个主程序中涉及到下传的还有靶种选择,它是利用端点2下传通道进行数据的传输,软件设计是通过下传数据长度来判断上位机选择的是光电靶还是天幕靶,如果选择光电靶则下传一位数字,否则下传至MCU的是两位数字,下位机用RD_USB_DATA读出数据块长度后,根据长度值设置标志S17=0或是S17=1,然后根据硬件电路的设计,当S17=0时为选择光电靶,S17=1时为选择天幕靶。
1.1.3.3数据处理
在上传完所有的弹丸速度后,点击主界面的“数据处理”控件,进入如图 1.1.5 上位机数据处理界面。
数据操作界面上包括:ctrl列表,3σ标准、ctrl保存这三个控件。
下面将进行分别介绍。
5、控件介绍
1、ctrl列表
在主界面上用户可在范围内(≤100)任意设定子弹数n,点击“数据处理”键后,速度列表框(list control控件)会自动显示n列,如图 1.1.5所示,点击“ctrl列表”键后,在主操作界面上上传得到的速度值,以及随之计算出来的动能、比动能都会全部列表到list control框中,若主操作子弹数设为11,如果采集了11发子弹,则会出现11发子弹速
度值如图 1.1.12。
若采集的次数只有9发,则第10和11发的各值均为0.000。
图 1.1.12 ctrl列表图
由于涉及到要从父对话框传递变量到子对话框的问题,首先需要调用父对话框指针:CCH375UpDownDlg*pMainDlg=(CCH375UpDownDlg*)AfxGetMainWnd();然后将父对话框变量传递给子对话框的相应变量:zidanshu=pMainDlg->m_zidanshu;这样就将父对话框的m_zidanshu传递给zidanshu,以便子对话框调用,类似这样的其它变量采用同样的方法进行调用。
将父对话框中的单个弹丸速度数组ve[]、单个弹丸动能E[]、单个弹丸比动能BE[]设为全局变量,速度数组的大小由采集的弹丸数UpCount来决定,子对话框中的速度数组直接调用ve[]、E2[]、BE2[]显示在速度列表框中:
for (int i=1;i <=zidanshu;i++){
strNum.Format("%.3f",ve[i]);
velocitylist2->SetItemText(i-1, 1, strNum);}
以上可将速度值列表如图 1.1.12所示,由于ve[]是double型,首先要转换成字符型的strNum[],然后用SetItemText将ve[]列表出来。
动能和比动能列表方法是相同的。
2、3σ标准
在实验过程中,常常会出现在一组测量数据中,有个别的测得值会显得与众不同,它的数值或是特别大或特别小。
对于这一类异常数据的测得值的处理,我们既不应当保留含有粗大误差的数据,也不能够随意舍弃对于误差分布规律来说是合理的那些含有大误差的测得值[7]。
在实验过程中,如果只是因为某个测得值的误差不合主观意想,就把它剔除掉,这是没有科学根据,是不恰当的。
在本系统中对于误差的处理方法采用的是统计判断的方法。
统计判断是根据误差的统计分布的规律来决定数据的取舍。
随机误差的一个特点是极大地正、负误差出现的机会是极小的,根据误差的统计理论,可以科学地规定一个界限,认为大于这个界
限的误差,由于出现的几率很小,在实际测量中,实际上是不可能出现的。
如果出现了超过规定的界限的误差,它必然不是产生随机误差的影响因素造成的,而是粗大误差的体现,因此,该测量数据应当舍弃。
这就是统计判断的中心思想。
由于规定的界限的不同,本系统中采用的统计判断方法是3σ标准。
首先需要判断本次测量是否有超过±3S (S 为标准差)范围的异常数据,剔除异常数据后,对在范围以内的数据运用3σ标准,求出S 、σ等,图 1.1.13所示为剔除异常数据流程图。
图 1.1.13 判断异常数据流程图
图 1.1.13 判断异常数据流程图中所涉及到的变量计算公式如下:
速度平均值: n /)][(v 1∑==n
i i v p
速度差: vp i v -=][vi
速度标准差: ∑--=n i vi n S 121
1
n S
=σ
图 1.1.14 异常数据标注实例图
如图 1.1.14所示第6个弹丸数据的check box中打了√,说明此数据在本次测试中是在±3S范围以外的。
具体判断如下:第1发弹:v1/S=-0.301511;第2发弹:v2/S=-0.301511;第3发弹:v3/S=-0.301511;第4发弹:v4/S=-0.301511;第5发弹:v5/S=-0.301511;第6发弹:v6/S=3.015118;第7发弹:v7/S=-0.301511;第8发弹:v8/S=-0.301511;第9发弹:v9/S=-0.301511;第10发弹:v10/S=-0.301511;第11发弹:v11/S=-0.301511;本次速度标准误差S=0.235480,则3S=0.706441。
依次判断vi/S 是否在±3S范围内,如果不在此范围内,check box中打√作为标记,因此出现图中的第6个弹丸数据的check box中打了√,提醒用户该数据需要剔除,但剔除操作由用户自己完成,系统不进行自动剔除。
3、ctrl保存
ctrl保存是指保存经过3σ标准处理剔除可疑数据后保存的文件,见图1.1.15 数据处理后的保存文件。
关键语句:FILE *fp;
fp=fopen(strFilePath,"w+");
for (int i=0;i <=count;i++){
string[i]=m_velocitylist2.GetItemText(i,0);
string2[i]=m_velocitylist2.GetItemText(i,1);
string3[i]=m_velocitylist2.GetItemText(i,2);
string4[i]=m_velocitylist2.GetItemText(i,3);
fprintf(fp3,"%s\t%s\t\t%s\t\t%s\t\t\n",string[i],string2[i],string3[i],str
ing4[i]);}
如图 1.1.15所示,对速度、动能、比动能的最大值、最小值、平均值、极差值、标准偏差值进行计算,置信概率为95%,提供给用户一个比较完整的测试报告,为后续整个的弹丸速度情况分析提供了比较全面的文本资料。
图 1.1.15 数据处理后的保存文件
1.1.4本节小结
1、在软件设计过程中要注意全局变量和局部变量的使用,本系统中将速度、动能、比动能都设置为全局变量目的是使父、子对话框都能够调用这些变量,简化整个软件编写。
2、在编写USB数据传输部分时需对USB端点上传、下传的线程全面了解,注意编写流程是先打开USB设备然后启动上传或下传线程。
3、在进行数据误差分析功能调试时,出现的问题是不论速度值是差异多大,都
不会选中,后来读取平均速度(vp),发现读出来的是0,并没有速度值,是因为刚开始设计时vp设为全局变量,但这只有是在主对话框“保存原始文件”调用save函数才进行计算的,而测试习惯一般都是先进行数据处理,因此在子对话框中添加变量vp2使问题得到解决。
1.2本章小结
本章针对系统软件部分进行详细介绍,分下位机MCU功能模块程序、固件程序,上位机应用软件设计三方面。
下位机MCU完成测时、计算,外设显示、打印等功能,并实现了USB上下位机通信和通过USB端点进行数据传输;上位机完成速度值的上传、数据处理、误差分析、数据保存等一系列工作;同时在上位机主操作界面可进行靶距设置、靶种选择等一系列操作。
本测速系统上下位软件的正确性在后来进行的模拟及实弹射击中得到了验证。