经
文章编号: 1 671·1 041(2005)01·0052-02
USB上位机程序开发与设计
童洪洁 ,李宝华
(吉林大 学 电子科学 与工程 学院 ,长春 130061)
摘要:本文介绍了在 VC++环境下 USB上位机程序的开发和设计,IEI ̄j用·
Windows API(Ap plication Pr0gram Inte rface)实现 USB接 口通信 的方
法。给出了多线程客户应用程序软件的实例。
关键 词: USB.AP VC++:线 程
中图 分类号 : TP31 1 文献标识 码 : B
Develop and design of the host
computer procedure on usb
TONG flong-jie,LI Bao-hua
(Electronic Science and Engineering Department of
Jilin University,Changchun 130061)
Abstmct:This paper introduces the development and design of the
host computer procedure on USB under the enviro ment of VC ++,
making use of Windows API(Application Pr0gram Interface)to realize
USB inte rface communication method.Pro vide the instance of many
thread customer's application pro gram software.
Key words:USB:API:VC++:THREAD
USB(通用串行总线)现在逐渐成为各种新型设备的的通用标
准总线 ,并且大有 取代 传统 的 RS一232趋势 。 USB在速度有 RS
一
232无法匹敌的优势,同时随着 USB 的发展,从 1995年提出 USB
标准.经历 了 USB1.0,USB1.1,USB2.0,到现在 USBOTG规范 ,
USB的传输速度也得 到迅猛 的提升 。从 USB1.1设 备的传 输速度
12Mbits/s到 2.0设备的480Mbits/s的发展 .同时 USB设备即插即
用的特点,使其应用更加广泛并且超过了目前很多工业接 口总线标
准,因而它的应用越发重要。
然而 USB在应用上给我们带来极大方便时,在软件处理上也
给我们造成了不小麻烦。由于 USB 设备是基于通信协议的接 口设
备,使得我们不能在电脑上像处理 RS一232那样来 处理 USB。USB
设备需要驱动 程序的支持,而 RS一232则不需要,而且 USB设备是
从设备,任何的USB传输都必须从电脑里的 USB主机开始发送指
令,虽然绝大部分的 USB设备厂商都给出了驱动程序但是应用接
口还需要客户 自行设计 ,从而使得上位机的编程变得尤为重要。在 VC
++环境下,传统的 RS·232可以直接使用相应的控件直接与外设进
行通信 ,而 USB不具备相应 的控件 ,不过我们可以利用 VC的环
境下的 Windows API函数把 USB接 口当作文件来操作,从而轻
而易举的实现 USB接 口通信。
1 USB接口通信
目前大多数驱动程序都采用了W DM(Window Driver Mode1).
从而我 们可以采用两 种方式来 打开 设备: (1)GUID接 口方式 :
(2)符号连接名 方式。在采用 GUID 接 口方』I=之前.一’定要获取
此设备 的GUID,在实际开发中可以从驱动 程序或 者利用 Windows
API函数获取。以下为主要步骤 :
1.1获取设备信息集
SetupDiGetClassDevs(
收稿 日期: 2004·1 1·12
52 EIC V0I.1 2 2005 N0.1
墨 麦旦
pGuid, ,,指 向一 个 安装类 或接 口类 的 GUID
NULL, ,,指 向 字符 串,过 滤返 回的设 备
NULL, ,,返 回 顶层 窗 口旬 柄
DIGCF— .
INTERFACEDEVICEI DIGCF
— —
PRESENT
,,给出构造设备信息集的控制操作
)
SetupDiGetClassDevs函数是一个设备信息集的处理程序,它
包含 了指定参数匹配的所有已安装的设备。
1.2识别接 口信息
SetupDiEnumDevicelnterfaces(
hardwareDevicelnfo,,,指 向接 口设备信 息集
0, ,,指向 一个 SP—DEVINFO—DATA 结构
pGuid, ,,指 向一 个 GUID,它标 识 了请求接 口的设备接 口类
i, ,,设 备接 口表 中基于 零 的索 引
&devicelnfoData) ,,分配 给调 用程 序 的缓冲 区
SetupDiEnumDeviceInterfaces函数返回设备信息集的一个设
备接 口元素的环境结构 ,每次调用该函数返回一个设备接 口的信
息。
1.3得设备路径名
SetupDiGetDevicelnterfaceDetail(
HardwareDevicelnfo, ,,指 向设备信 息集
DevicelnfoData, ,,指 向标识 设备 的接 口
functionClassDeviceData, ,,指向接受接口信息
predictedLength, ,,接受缓冲区大小
NULL) ,,指向缓冲区接受请求接口的设备信息
1.4设备设置
在应用程序和驱动程序中,最常用的API函数为 Cre ̄eFfle,
ReadFile,WriteFi1e,DeviceloContro1.CloseFile等 等 , 其 中
CreateFlie,CloseFile函数是必须用到 的,其他 的根据具体需要而
定。
hFile=CreateFile(
functionClassDeviceData·>DevicePath, ||瓠 开设 备名
GENERIC
—
READ I GENERIC
— WRITE, ,,允许读写 访问文件
FILE
—
SHARE
—
READIF ̄ E
—
SHARE
— W RITE、 ,,读写共享 模式
NULL,
OPEN
_ EXISTING, ,,打 开而 不是创 建
FILE
_
ATTRIBUTE
—
NORM ALIFLIE
—
FLAG
_ OVERLAPPED,,,以异步
方式打开文件
NULL);
如果上述函数返回成功,这时我们就可以进行读写操作。一
般情况 下我们采用 ReadFfle,WriteFile就足够了,如果我们需要在
驱动中加入控制部分的时候,就需要使用 DeviceloControl函数。
通常我们都采用同步方式打开文件,但是当我们的程序需要处理多
个事务时,以同步方式打开接 口就会造成接 口函数的阻塞,只有等
到驱动程序完成相应的数据传输操作时才能往下执行。由于 目前市
面上比较流行的USB设备芯片都是多端点通信,但是他们本身只
能准双工通信,在数据传输的谐调方面至关重要。因此当我们采用
异步通信就可以很好的协调程序事务。
2 客户软件设计
欢迎光临本刊网站 http:Hwww.eic.com.cn
维普资讯 http://www.cqvip.com