用VC实现与USB驱动程序的通信
基于VC的USB接口通信程序设计

通信原理课程设计课题:基于VC的USB接口通信程序设计学号:XXX姓名:XXX目录1. 课程设计背景 (3)2. 课程设计目的及意义 (3)3. 课程设计知识概要......................................错误!未定义书签。
3.1 USB接口技术简介...............................错误!未定义书签。
3.2 USB通信参考模型 (4)3.3 USB接口的通讯原理 (5)3.3.1 USB设备的接入 (5)3.3.2 USB设备的识别 (6)4.课程设计步骤及内容 (6)4.1 USB接口芯片 (6)4.2 USB的固件和驱动程序设计 (7)4.2.1固件 .........................................错误!未定义书签。
4.2.2 USB设备驱动程序........................错误!未定义书签。
4.2.2.1 USB应用程序接口 (9)4.2.2.2 USB中断服务程序 (9)4.2.2.3 USB标准事件处理程序 (10)4.3 客户应用软件 (10)4.3.1 查找、打开USB设备 (11)4.3.2 线程(Thread) (11)4.4 实例............................................ 1错误!未定义书签。
5. 课程设计总结 (13)一、课题设计背景随着信息技术的迅速发展,数据采集和处理技术广泛应用于雷达、通信、遥测、遥感等领域。
而在早期的计算机系统上通常使用串口或并口来发送数据,每个接口都需要占用计算机内部很多的资源,传统的接口一般采用PCI总线或R S-232串行总线。
PCI总线有较高的传输速率,可达132 Mbit/s,也可以即插即用,但是它们的扩充槽有限且插拔不方便;RS-232串行总线连接比较方便,但是传输速率太慢,不易用于高速传送数据和传送大量数据。
用VC++编写USB接口通讯程序

用VC++编写USB接口通讯程序摘要:详细介绍Visual C++ 6.0环境下利用Windows API(Application Program Interface)函数来实现与符合HID设备类的USB接口通讯,并给出了通信程序的部分代码。
关键词:通用串行总线人际接口设备API VisualC++1 引言在USB出现之前,计算机的典型接口有并行口(打印口)、串行口、鼠标口、键盘口、显示器口、游戏口及各种卡式接口(如声卡、网卡)等,与这些接口对应的有各种不同的电缆。
在传输速度方面,这些接口都存在速度偏低的问题;在技术方面,这种设计容易产生I/O冲突。
中断(IRQ)不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。
当今的计算机外部设备,都在追求高速度和高通用型。
USB接口适应了这种要求,并以其速度快,使用方便,成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过渡称为必然的趋势。
但如果主机PC不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)类是Windows完全支持的第一批USB设备类型中的一种。
在运行Windows98或更高版本的PC机上,应用程序可以使用操作系统内置的驱动与HID通信,但与HID通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单。
在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息,为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。
应用程序可以使用任何能访问API函数的编程语言,C++是一种能访问API函数的功能强大的语言,本文将在VisualC++6.0环境下编写与USB设备通信的Windows程序。
2 USB简介USB是由Intel,Compaq,Digital,IBM,Microsoft,NEC,Northern Telecom等七家世界著名的计算机和通信公司共同推出的新一代接口标准,全称为Universal Serial Bus(通用串行总线)。
我在做usb上位机驱动过程中做的笔记VC6+DDK xp+DS3.2

我在做usb上位机驱动过程中做的笔记驱动程序安装成功后,应用程序的设计VC6+DDK xp+DS3.2驱动程序安装好后,应用程序要通过安装的驱动程序与设备的通信,但是应用程序怎么才能找到对应用的驱动程序呢?通过设备的GUID找到设备路径。
在windows操作系统环境下,设备通常被当作特殊文件处理。
要打开设备,就要知道该设备的路径,要找到设备的路径,要使用GUID来查找。
设备在安装时,windows安装器和相应设备的驱动程序负责将相应的设备与对应的GUID联系起来,并将GUID写入注册表,这样通过GUID(接口类GUID)就可以找到对应设备。
对于HID设备,因为它的驱动已经集成在操作系统中,在同一系统中GUID是一样的,但通常这个值在不同的系统下也许会不一样所以一般不直接使用这个GUID,而是使用一个API函数来获取(函数是void _stdcall HidD_GetHidGuid(Out LPGUID HidGuid)). 而我们自己做的嵌入式设备,因为驱动是自己写的,所以GUID肯定不一样,而且这个GUID不会因为设备用在不同的操作系统上而改变,因为这个GUID在生成设备驱动的时候已经生成,就对应这个设备了,这个设备类GUID可以在每个驱动的interface.h文件中看到。
我们就是要用这个文件中的GUID宏定义来查找已连接上设备,把系统中查到的设备列举出来,然后检查它的VID,PID以及设备版本号,看是不是要访问的设备,如果是,就可以对设备进行各种操作了,不是的话就循环下一个设备,直到找到或遍历完为止。
1.下面这个函数用来获取所有与ClassGuid指定的GUID相同的设备,当然对于HID设备在同一个pc机上可能会检测到多个,但是我们自己做的嵌入式设备,一般都是一个,要找到我们要的设备通过VID,PID以及设备版本号。
该函数返回HDEVINFO句柄,这个句柄指向ClassGuid指定的所有设备的一个信息集合。
基于VISUAL C#的USB接口通信程序设计

摘要:详细介绍了usb接口的特点以及接口通信流程,研究在microsoft visual studio 2008环境下,运用visual c #调用windows api 函数方法进行usb接口通信程序设计的一般方法。
关键字:c#usb通信接口中图分类号:tp311.1 文献标识码:a 文章编号:1007-9416(2010)08-0090-021 hid、usb介绍hid(human interface device)类设备即人机接口设备,是usb设备类型中的一种,是直接与人交互的设备,如键盘、鼠标等。
hid类设备并不一定是标准的外设类型,只要交换的数据格式存储在报文的结构中,并且设备固件支持报文的格式,则任何工作在该限制之内的设备均可称为hid设备,如电压计、温度计、读卡器等。
hid设备与主机交换数据使用“报表”结构,报表格式富有弹性,可以处理任何类型的数据;一个报表可以使用多个事务,每笔事务可以携带小量和中量的数据,高速设备每笔事务最大是1024 b;主机定时轮询设备,设备可以为预期的时间传送信息给主机,hid设备除了传送数据给主机外,也会从主机接收数据。
usb协议定义和支持音频设备类、通信设备类、显示设备类、人机接口设备类(hid)和海量存储设备类等设备类型。
hid是windows完全支持的第一批usb设备类型,在运行win 98以上版本的pc机上,应用程序可以与使用操作系统内置驱动的hid类设备通信。
因此,基于hid类设计的usb设备易于设置和运行。
2 usb人机通信开发方法hid运行在windows98以上版本操作系统的pc机中,系统除了提供通用的usb设备的底层驱动以外,还单独提供了一些hid设备的完整驱动,应用程序可以很容易的与操作系统内部的hid通讯。
这样使得符合hid类的usb设备很容易开发与运行。
也就是说,我们如果想实现一个usb的hid类设备,不需要在windows下开发自己的驱动程序。
计算机C++USB上位机开发

第10章 上位机程序开发在USB设备开发中,上位机程序是用于与用户进行接口的。
上位机程序通过USB设备驱动程序和外部的USB硬件进行通信,USB固件程序执行所用的硬件操作。
一般来说,根据选择开发平台的不同,可以使用Visual C++、Visual C#和LabVIEW等开发上位机程序。
本章首先介绍了Visual C++中控制USB设备的相关函数,接着介绍了Visual C#中读写USB设备的主意函数,最后介绍了在LabVIEW中如何读写USB设备。
本章内容包括:Visual C++读写USB设备;Visual C#读写USB设备;LabVIEW读写USB设备。
10.1 Visual C++读写USB设备在USB设备开发过程中,上位机程序可以采用广泛应用的Visual C++来实现。
对于Cypress公司的EZ-USB系列芯片,其提供了全面的CY3684开发包。
在该开发包中,可以使用CYIOCTL控制函数类和CyAPI控制函数类来实现Visual C++环境下对USB设备的读写。
10.1.1 CYIOCTL控制函数类CYIOCTL控制函数类为Cypress公司的EZ-USB FX2LP系列USB接口芯片,提供了简单的控制接口。
在使用Cypress公司提供的驱动程序基础上,只需在主机Visual C++程序中加入头文件cyioctl.h,然后便可以调用相应的控制函数。
为了能够使用这些函数,主机程序必须首先获得USB设备的控制句柄。
可以通过以下的代码在程序中获得连接到主机的USB设备句柄。
CCyUSBDevice *USBDevice = new CCyUSBDevice(); //USB设备HANDLE hDevice = USBDevice->DeviceHandle(); //打开设备句柄其中,hDevice即为获得的USB设备句柄。
在退出程序的时候,需要释放该USB设备句柄,使用如下的语句即可:delete USBDevice;在主程序获得USB设备的控制句柄后,便可以调用CYIOCTL控制函数类提供的接口控制函数,下面分别进行介绍。
基于VC的USB接口通信程序设计

基于VC的USB接口通信程序设计随着信息技术的快速进展,数据采集和处理技术广泛应用于雷达、通信、遥测、遥感等领域。
而在早期的计算机系统上通常用法串口或并口来发送数据,每个接口都需要占用计算机内部无数的资源,传统的接口普通采纳PCI或RS-232串行总线。
PCI总线有较高的传输速率,可达132 Mbit /s,也可以即插即用,但是它们的扩充槽有限且插拔不便利;RS-232串行总线衔接比较便利,但是传输速率太慢,不易用于高速传送数据和传送大量数据。
(通用串行总线)集中了PCI和RS-232串行总线的优点,具有便利的即插即用和热插拔特性以及较高的传输速率,因此,将USB 技术应用于数据采集是十分合适的,可以达到数据采集系统的高速度处理。
目前,USB已经推出了其协议的2.0版本,速率高达480 Mbit/s。
本文研发了一套基于USB接口的数据采集系统,囫囵系统的设计涉及到硬件、设备固件(Firmware)、USB设备驱动程序及客户应用软件。
下面分离加以解释。
2 USB接口芯片本文介绍的USB数据采集系统采纳了公司EZ-USBFX2系列的CY7C68013-128AC芯片,它同时集成了8051微控制器和USB2.0,在提高集成度的同时也加快了数据传输的速度。
在系统中,CY7C68013-128AC既是数据采集控制器又是USB控制器,EZ-USBFX2系列有3种型号:CY7C68013-56PVC、CY7C68013-100AC、CY7C68013-128AC。
该系列的芯片都是针对USB2.0的,并且与USB1.1兼容。
其中,CY7C68013-128AC是128脚,TPQF封装,功能十分完美,与另外两种相比,主要是增强了16位地址总线和8位数据总线以及更多的IO口,因此,CY7C68013-128AC的可扩展性最好。
图1是该芯片的内部结构图。
3 USB的固件和驱动程序设计3.1 固件固件是储存在程序内存中的代码,它使得USB接口芯片与主机和外设第1页共6页。
c++编写libusb

c++编写libusblibusb 是一个跨平台的 USB 库,用于在 C++ 中进行 USB 设备的通信和控制。
使用libusb 库,你可以编写 C++ 应用程序来与各种 USB 设备进行交互,包括从设备读取数据、向设备写入数据、获取设备信息等。
要在 C++ 中使用 libusb,你需要完成以下步骤:1. 安装 libusb 库:首先,你需要安装 libusb 库。
你可以从 libusb 的官方网站下载源代码,并按照说明进行编译和安装。
或者,你可以使用你的操作系统的包管理器来安装libusb,例如在 Linux 上使用 `apt` 或 `yum`。
2. 包含头文件:在你的 C++ 代码中,你需要包含 libusb 的头文件。
通常,你可以使用以下语句来包含头文件:```cpp#include <libusb-1.0/libusb.h>```3. 初始化 libusb:在使用 libusb 之前,你需要初始化 libusb 库。
这可以通过调用`libusb_init()` 函数来完成。
```cpplibusb_init(NULL);```4. 查找设备:使用 `libusb_find_devices()` 函数来查找连接到计算机上的 USB 设备。
你可以提供特定的 USB 设备描述符或使用通配符来匹配多个设备。
```cpplibusb_device** devices;int device_count = libusb_find_devices(NULL, NULL);```5. 打开设备:找到要与之交互的设备后,使用 `libusb_open()` 函数打开设备。
```cpplibusb_device* device = libusb_open(devices[0], 0);```6. 配置设备:在与设备进行通信之前,你可能需要配置设备的某些设置,例如设置设备的接口、端点等。
这可以通过调用 `libusb_config_descriptor()` 函数获取设备的配置描述符,并使用相应的函数进行设置。
用VC6。0实现串行通讯的三种方法

摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。
在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
依据不同的条件实现对串口的灵活编程控制是我们所需要的。
在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。
串行通信程序开发环境为 VC++ 6.0。
Windows下串行通信与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。
串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。
与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。
以下将结合实例,给出实现串行通信的三种方法。
实现串行通信的三种方法方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.W.Richard Stevens,范建华胥光辉张涛等译.TCP/IP 详解,卷1:协议[M】.机械工业出版社,2000
4.A.Jones J.Ohlund,京京工作室译.windows网络编程 技术.机械工业出版社,2000
(收稿日期:2002年11月15日)
(上接第57页) 报告。在实现时,只要把相应的编辑框重新赋值为空即可。
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)://读取数据函数
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.读数据 从设备读数据时,也要分配一片相应大小的内存空间,暂
(7)如果不再需要,应用程序调用DelStream方法删除一 个流。
五、性能分析
对于传输控件我们最关心的还是它的可靠性,在带宽比较 宽的局域网内数据传输的误码率非常低(10—10左右),实 际中最主要的问题是丢包现象。丢包现象主要有两类:一是网 络底层硬件在传输过程中造成的丢包;二是软件原因造成的丢 包。
READ GENER}C—WRlTE,FILE-sHARE—READ FlLE-sHARE— WRITE,NULL,OPEN-E×|STfNG,FlLE』丌RIBUTE—NO用来打开USB设备
if{hDev==INVAUD』ANDLE』ALUE)
(
术DError=GetLastError():
t il,毋∥飚手≯l?鞠幽旁■芎f詹露j奢摩兹幼墅序赣争逼宿黟
。÷j
1。
摘要本文简要介绍了usB设备驱动程序的概念,然后以一个基于对话框的Vc++应用程序为例,详细讲解了如何实
。
现与usB设备驱动程序之间的通信,包括打开一个设备、写入数据、读取数据、清空数据等最基本的通信方
式。
关键词 usB,全局唯一标识符GuID,设备驱动程序
冗余度为50%:P=(1一p2)n/2(1一p)n/2 冗余度为100%:P=(1一p2)n 由上可见,冗余度越大数据的可靠性越好,但不能太大, 否则传输效率大大降低,一般不超过200%,通过合理设置冗 余度可使丢包误码概率达到我们的要求。
六、结束语
该控件在VC6.0环境下编译通过,在局域网里成功实现 了文件、数据、字符串的多播传输。
时存放从设备读取的数据,然后把数据显示在读数据编辑框 里,读取数据是通过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) (
)
)
其中,0penByInte血ce()是作者定义的对话框类的成员函
数,其函数体如下:
( HANDLE hDev: CDevjceInterfaceCIass DevClass{pCIassGuid,pError):
if(8 pE rror!=ERROR.sUCCESS) retum INVAUD—HANDLE』ALUE:
参考文献
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
丢包和误码概率分析: 假设网络内的丢包(包括硬件原因和软件原因)和误码的
总概率为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
二、总体设计
1.用户界面 为了简单适用,在创建工程时采用对话框类型。一个好的 应用程序首先要有友好的用户界面,看起来赏心悦目,使用起 来简单、方便。该程序的用户界面如下图所示。主要用到三个 编辑框,分别是输人数据编辑框、显示数据编辑框和显示设备 信息报告编辑框;还有三个按钮分别表示写入数据、清除数据 和读取设备数据。
)
retum hDev:
)
2.写数据
应用程序和设备的读写数据通信是通过调用win32的函
数ReadFile()writeFile()实现的。向设备写数据时,首先分配
一片相应大小的内存,然后在写数据编辑框里输入要写入设备
的数据,并把它写到分配的内存缓冲区中,通过writeFile()函
数把数据写入到设备中去。在应用程序中我们通过0nwrite()
l
州buf)
deIete【】buf: buf=NULL:
j
4.清空显示数据和信息
在应用程序中我们用pnRefresh()函数来清空已经显示的
数据,包括写数据编辑框、读数据编辑框和usB设备信息报 告框的清空,以便用户重新读写新数据,了解设备的最新信息
(下转第70页)
万方数据
·。。碰鲴-每%
到缓冲区,生成头、尾数据报,将要发送的数据组成一个个数 据报并加入校验信息,统计数据块数。如应用程序要发送的是 数据流,则使用SendData方法,基本过程与SendFile相同只 是不需要打开文件;
CDeviceInterface DevInterface{& DevCIass, instance,
pError):
if(+pE rror!=ERROR-sUCCESS) retum INVAUD』ANDLE—yALUE:
hDev=CreateFiIe(DevInterface.DevicePath{),GENERIC—
万方数据
柄无效则查找设备失败
{
.
m-strLog+=J(“查找设备失败\n请确认设备是否正确连
接到计算机\r\n”):
SetDIgItemText{IDC_EDIT_REPORT,m—strLog):
}
else
(mjtrLog+=J(”查找设备成功.\r\n”):
SetD JgItemText(IDC_EDITj{EPORT,m—StrLog):
(
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)://该函麦女向 设备写入数据
函数来调用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)
应用程序界面
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():用来清除数据,以便重新写入。
mjtrRead=J(’7’)://清空显示数据编辑框 mjtrWrite=J(~)://清空写入数据编辑框 m-strRepo rt=J(’’’)://清空显示设备信息报告编辑框 为了在清空后能够再次写入和读取数据,在0nRefresh() 函数中还应该调用0nOpenDevice()以重新确认设备是否打开 和准备好接收或发送数据。