用VC实现与USB驱动程序的通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
丢包和误码概率分析: 假设网络内的丢包(包括硬件原因和软件原因)和误码的
总概率为p,一共传输了n个数据包,接收方正确接收所有 数据包的概率为P,则:
冗余度为o(即每个数据包只被发送一遍):P=(1一p)n 冗余度为q<1(即有qn个数据包被发送两遍):P=(1一p2) qn(1一p)n—qn
冗余度为q≥1(即每个数据包被发送q遍):P=(1一 pq+1)n
(7)如果不再需要,应用程序调用DelStream方法删除一 个流。
五、性能分析
对于传输控件我们最关心的还是它的可靠性,在带宽比较 宽的局域网内数据传输的误码率非常低(10—10左右),实 际中最主要的问题是丢包现象。丢包现象主要有两类:一是网 络底层硬件在传输过程中造成的丢包;二是软件原因造成的丢 包。
mjtrRead=J(’7’)://清空显示数据编辑框 mjtrWrite=J(~)://清空写入数据编辑框 m-strRepo rt=J(’’’)://清空显示设备信息报告编辑框 为了在清空后能够再次写入和读取数据,在0nRefresh() 函数中还应该调用0nOpenDevice()以重新确认设备是否打开 和准备好接收或发送数据。
(5)当某个流的任务完成时向应用程序发出对应的完成事 件,并通知应用程序是哪个流发出该事件,应用程序响应该事件;
(6)用stopstre帅方法来停止一个流正在进行的任务或通 过closeStream方法直接关闭流,处于停止状态的流可直接再 次调用发送或接收的方法进行新的任务,而如果是调用 closestream方法将流关闭则必须先用0penstream方法将流打 开后再执行新的操作;
参考文献
1.S.Deering. Host Extensions for IP Multicasting. RFC 1 112 [M】,Network Working Group,1989
2. K.SoUins. THE TFTP PROTOCOL (REVISl0N 2). RFCl350【M],Network Working Group,1992
万方数据
柄无效则查找设备失败


m-strLog+=J(“查找设备失败\n请确认设备是否正确连
接到计算机\r\n”):
SetDIgItemText{IDC_EDIT_REPORT,m—strLog):

else
(mjtrLog+=J(”查找设备成功.\r\n”):
SetD JgItemText(IDC_EDITj{EPORT,m—StrLog):


其中,0penByInte血ce()是作者定义的对话框类的成员函
数,其函数体如下:
( HANDLE hDev: CDevjceInterfaceCIass DevClass{pCIassGuid,pError):
if(8 pE rror!=ERROR.sUCCESS) retum INVAUD—HANDLE』ALUE:
三、应用程序的主要函数设计
1.打开一个USB设备 要和设备通信,首先要根据设备的GuID找到符合要求的 设备并把设备打开,返回设备句柄以备后面使用。OnopenDe— vice()函数可以实现这个功能,它间接调用了0penByInte以ce ()中的createFile()函数。其关键代码如下所示: { DWORD Error: hDevice=0penByInterface(&ClassGuid,O, &Error): //返回设备句柄 if(hDevice==INVAUD』ANDLE』ALUE)//如果设备句
t il,毋∥飚手≯l?鞠幽旁■芎f詹露j奢摩兹幼墅序赣争逼宿黟
。÷j
1。
摘要本文简要介绍了usB设备驱动程序的概念,然后以一个基于对话框的Vc++应用程序为例,详细讲解了如何实

现与usB设备驱动程序之间的通信,包括打开一个设备、写入数据、读取数据、清空数据等最基本的通信方
式。
关键词 usB,全局唯一标识符GuID,设备驱动程序

州buf)
deIete【】buf: buf=NULL:

4.清空显示数据和信息
在应用程序中我们用pnRefresh()函数来清空已经显示的
数据,包括写数据编辑框、读数据编辑框和usB设备信息报 告框的清空,以便用户重新读写新数据,了解设备的最新信息
(下转第70页)
万方数据
·。。碰鲴-每%
到缓冲区,生成头、尾数据报,将要发送的数据组成一个个数 据报并加入校验信息,统计数据块数。如应用程序要发送的是 数据流,则使用SendData方法,基本过程与SendFile相同只 是不需要打开文件;
冗余度为50%:P=(1一p2)n/2(1一p)n/2 冗余度为100%:P=(1一p2)n 由上可见,冗余度越大数据的可靠性越好,但不能太大, 否则传输效率大大降低,一般不超过200%,通过合理设置冗 余度可使丢包误码概率达到我们的要求。
六、结束语
该控件在VC6.0环境下编译通过,在局域网里成功实现 了文件、数据、字符串的多播传输。
3.W.Richard Stevens,范建华胥光辉张涛等译.TCP/IP 详解,卷1:协议[M】.机械工业出版社,2000
4.A.Jones J.Ohlund,京京工作室译.windows网络编程 技术.机械工业出版社,2000
(收稿日期:2002年11月15日)
(上接第57页) 报告。在实现时,只要把相应的编辑框重新赋值为空即可。
READ GENER}C—WRlTE,FILE-sHARE—READ FlLE-sHARE— WRITE,NULL,OPEN-E×|STfNG,FlLE』丌RIBUTE—NORMAL,
NULL);
//这个函数用来打开USB设备
if{hDev==INVAUD』ANDLE』ALUE)

术DError=GetLastError():
一、引言
驱动程序是一个软件,是连接应用程序、硬件以及操作系 统的桥梁,装入后成为操作系统内核的一部分。usB设备驱动 程序必须是wDM模型,wDM引入了功能设备对象FD0和物 理设备对象PDO两个新类来描述对象,一个真实硬件只能有 一个PD0,但可以有多个FDO,在驱动程序中直接操作的是 硬件的PDO和FDO。wDM是通过设备的全局唯一标识符 GuID来识另|J硬件设备。选取合适的开发工具后就可以根据实 际情况编写usB设备驱动程序,然后还要编写和驱动程序通 信的应用程序。开发应用程序可以根据自己的爱好使用任何一 种高级语言,本文中作者就根据自己的实践经验来谈谈如何用 Vc++开发与usB设备驱动程序通信的应用程序。

retum hDev:

2.写数据
应用程序和设备的读写数据通信是通过调用win32的函
数ReadFile()writeFile()实现的。向设备写数据时,首先分配
一片相应大小的内存,然后在写数据编辑框里输入要写入设备
的数据,并把它写到分配的内存缓冲区中,通过writeFile()函
数把数据写入到设备中去。在应用程序中我们通过0nwrite()
mjtrLog+=J{”准备读取数据时分配内存失败.\r\n“): SetDIgltemTe×t(IDC_EDIT_j{EPORT,m—strLog):
) if(hDevice==INVALlD_j—ANDLE—yALUE)
retUm: eIse
{ Read刚e{hDevice,b uf,n,&nRead,NULL)://读取数据函数
二、总体设计
1.用户界面 为了简单适用,在创建工程时采用对话框类型。一个好的 应用程序首先要有友好的用户界面,看起来赏心悦目,使用起 来简单、方便。该程序的用户界面如下图所示。主要用到三个 编辑框,分别是输人数据编辑框、显示数据编辑框和显示设备 信息报告编辑框;还有三个按钮分别表示写入数据、清除数据 和读取设备数据。
函数来调用writeFile(),以下是0nwrite()的主要代码,假设
一次写64Bytes数据。

char半buf=NULL:
int n=65:
buf=new char【n+1 I://分配内存缓冲区,大小为n+1字节
memset(buf.O,sizeof(char)¥n)://设置buf为0
updateData{FALSE)://用新输入的数据更新m-strwrjte s”cpy(b uf,mjtrWrite)://把m爿rWme的值写入buf if(buf==NULL)
mjtrRead=buf://把读到缓冲区中的数据写到mjtrRead UpdateData(FALSE): m_strLog+=J(”从设备读取的数据是:\n”+
mjtrRead+”\r\n”): SetDIgltemText(IDC-EDITjiEPORT,m—strLog)://把数
据显示到编辑框中 )
应用程序界面
2.定义变量和函数 首先定义两个全局变量hDevice(设备句柄)和classGuid (表示设备唯一标识符GuID),我们根据classGuid来查找设 备,然后根据hDevice的返回值来确定设备是否找到和打开。 HANDLE hDevice=INVAUD』ANDLE』ALUE://初始化设备 句柄为无效 GUID CIassGuid=UsbDeviceName上LASS_GUID: //Usb- DeviceName是USB设备名称 此外,还用到以下几个变量和函数: cstring mjtrbg:用来暂时存放字符串; cstring m』trwdte:写入数据编辑框对应的变量; cstring uutrRead:读取设备数据编辑框对应的变量; IDc.EDIT上EPORT:存放usB设备信息报告的编辑框对 应的ID; HANDLE 0penByInterf如e():用于打开一个usB设备驱动 程序; 々oid OnOpenDevice():根据返回的设备句柄确定是否找到 设备; void Onwrite():实现向设备写入数据; void 0nRead():实现从设备读取数据; void 0nRefresh():用来清除数据,以便重新写入。
CString p:
//p暂时存放buf中的数据以便输出
p=buf:
mjtrLog+=J(”写入设备的数据是:\n”+p+”\r\n”):
SetDIgItemText(IDC_EDIT—REPORT,m—strLog):

if(buf)
//释放缓冲区
deIete【]buf:
buf=NULL:
ห้องสมุดไป่ตู้

3.读数据 从设备读数据时,也要分配一片相应大小的内存空间,暂

m_strLog+=J(”准备向设备写数据时分配内存失败\r\n”):
SetDIgItemTe×t(IDC-EDlT—REPORT,m—strLog):

if(hDevice==lNVAUD HANDLE VALUE)
retum:
//如果没有找到设备则返回
elS甘

WriteFile{hDevice,buf,n,&nwritten.NuLL)://该函麦女向 设备写入数据
(4)应用程序调用RecvFile方法将一个文件接收任务加入 一个流,或用RecvData方法将一个数据接收任务加入一个 流,控件接收到数据报后作差错校验、重复接收检验,将接收 到的正确的数据报重组后,RecvFile方法将数据保存为指定目 录下的文件,RecvData方法则将数据流返回给应用程序;
时存放从设备读取的数据,然后把数据显示在读数据编辑框 里,读取数据是通过ReadFile()函数实现的。在应用程序中通
过0nRead()函数来调用ReadFile(),假设一次读取64Bytes数 据。
( char丰buf=NULL: int n=65:
CString p: buf=new char【n+1]: memset《buf,0.sizeof(char)}n): if(buf==NULL) (
CDeviceInterface DevInterface{& DevCIass, instance,
pError):
if(+pE rror!=ERROR-sUCCESS) retum INVAUD』ANDLE—yALUE:
hDev=CreateFiIe(DevInterface.DevicePath{),GENERIC—
相关文档
最新文档