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

合集下载

基于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接口通讯程序

用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

我在做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接口通信程序设计

基于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上位机开发

计算机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接口通信程序设计

基于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++编写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实现串行通讯的三种方法

用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 函数的接口。

VC编程实现与USB设备通信

VC编程实现与USB设备通信

VC编程实现与USB设备通信
内容摘要:
本文旨在探讨基于VC的USB设备通信实现。

从基本的概念出发,介绍了USB设备通信的概念,原理以及大致过程;进而深入讨论了基于VC +WIN32API的USB设备通信实现,包括设备上线和识别,数据发送和接收,以及数据处理和编程封装;最后总结了提出了基于VC的USB设备通信实现的讨论方向。

关键词:VC;USB设备;通信;实现
1. 引言
2. USB设备通信概述
Universal Serial Bus,简称USB,是一种计算机通信技术,它可以将多台设备连接到一台电脑,它由系统总线(System Bus)、设备总线(Device Bus)和并行总线(Parallel Bus)三部分组成。

USB2.0传输速率

USB2.0传输速率

USB2.0传输带宽摘要:针对USB2.0高速数据传输在实际应用中存在的具体问题,深入分析了诸如协议开销、带宽分配、工作环境、主机硬件结构和操作系统配置、设备驱动程序等影响速度提高的种种因素。

同时重点阐述了USB2.0设备接口中端点FIFO通道和GPIF通用可编程接口的关键作用。

并利用USB2.0控制芯片EZ-USB FX2进行了不同模式下数据传输的实验.最后在此基础上指出解决高速数据传输问题的几条对策。

1 引言USB(Universal Serial Bus,通用串行总线)是计算机与其外设连接的一种新型接口技术。

尽管在2000年4月27日发布的USB2.0规范中最高传输速度已经达到了480 Mbps(即60 MB/s)。

但是很多USB2.0设备在实际工作时的数据传输速度却与此相差甚远。

本文作者曾为此利用测试软件BusHound对诸如闪存盘、mp3、移动硬盘等典型USB2.0设备进行速度测试,其结果由表1给出。

由于USB2.0的实际数据传输速度与PC主机和USB设备的诸多因素有关,且其中任一个因素都有可能成为影响数据传输速度的瓶颈。

因此对此进一步地深入探讨是很有必要的。

2 影响USB2.0数据传输速度的因素分析(1)USB通信协议的开销在USB数据通信的过程中,总线上传输的并不只是真正需要的数据信息,还要包括诸如同步信号、类型标识、校验码、握手信号等各种协议信息。

因此实际数据传输的速率根本没有可能达到总线传输的极限速度480 Mbps。

且对不同的传输类型,存在不同的协议开销。

如在USB1.1协议下规定的每毫秒1帧中,对一个设备的中断传输只能进行一次,考虑中断传输的数据包为64Byte,故可算出这种传输的最大速度只有64 kB/s。

对USB2.0的情况,由于采用了微帧结构,每帧分为8个微帧,且中断传输在每个微帧下可以传输3个数据包,而每包的数据也增加到1024个字节,故可以算出USB2.0的中断传输的最大速度提高到8×3×1024 B/ms=24 MB/s。

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件串口和USB通信软件是一种用于在计算机和外部设备之间进行数据传输的工具。

VB语言是一种适用于Windows平台的编程语言,可以使用VB 开发串口、USB通信软件。

串口通信是一种常见的数据传输方式,它通过计算机的串口(串行通信口)与外部设备进行连接。

在VB中,可以使用SerialPort类来实现串口通信。

下面是一个使用VB编写的串口通信软件的示例代码:```vbImports System.IO.PortsPrivate WithEvents SerialPort As New SerialPortPublic Sub New'设置串口参数SerialPort.PortName = "COM1"SerialPort.BaudRate = 9600SerialPort.Parity = Parity.NoneSerialPort.DataBits = 8SerialPort.StopBits = StopBits.OneEnd SubPublic Sub Open'打开串口SerialPort.OpenEnd SubPublic Sub Close'关闭串口SerialPort.CloseEnd SubPublic Sub WriteData(ByVal data As String)'向串口写入数据SerialPort.WriteLine(data)End SubPrivate Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) HandlesSerialPort.DataReceived'串口接收到数据时触发的事件Dim data As String = SerialPort.ReadLine'处理接收到的数据Console.WriteLine("Received data: " & data)End SubEnd Class```USB通信是另一种常用的数据传输方式,它通过计算机的USB接口与外部设备进行连接。

vc下usb接口的实现

vc下usb接口的实现

vc下usb接口的实现#include <setupApi.h>#pragma comment(lib, "setupApi.lib")//加载lib文件//-----------------Initilize USB port---------unsigned int VendorID,ProductID;char temp_buffer[100];unsigned char DataBuffer[1],BufferLength; //接收unsigned char SendDataBuffer[1],SendBufferLength; //发送int HIDCounter=0;GUID hidGuid;HDEVINFO AllHIDDeviceInfo=NULL;HANDLE HIDDevice=NULL,ReadHIDDevice= NULL;HIDD_ATTRIBUTES Attributes;PSP_DEVICE_INTERFACE_DETAIL_DATA ClassDeviceData ;SP_INTERFACE_DEVICE_DATA deviceInfoData;ULONG neededLength,requiredLength;DWORD bytesRead;bool InitUSB(){VendorID = 0x0000;ProductID = 0x0000;// 查找设备// 本例程使用HID设备的API,它查找HID设备列表,找出与Vendor ID 和 Product ID匹配的设备ClassDeviceData =NULL;HIDDevice =NULL;deviceInfoData.cbSize =sizeof(deviceInfoData);// 从操作系统获取HIDs 的GUIDHidD_GetHidGuid(&hidGuid);// 获取所有HIDs的设备信息AllHIDDeviceInfo=SetupDiGetClassDevs(&hidGuid,NULL,NU LL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);HIDCounter=0;while (TRUE){// 这个API将发现的设备信息写入 deviceInfoData// HIDCounter 允许这个API重复调用所有HID设备// 如果API调用返回0,没有更多的HID设备发现if (!SetupDiEnumDeviceInterfaces(AllHIDDeviceInfo,0,&hid Guid,HIDCounter,&deviceInfoData)){// 没有发现与Vendor ID 和 Product ID匹配的HID设备SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);return FALSE;}else{// 发现一个HID设备,获取设备的详细信息// 第一次调用SetupDiGetDeviceInterfaceDetail得到ClassDeviceData// 的大小,但返回错误SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&deviceI nfoData,NULL,0,&requiredLength,NULL);neededLength =requiredLength;ClassDeviceData =(PSP_DEVICE_INTERFACE_ DETAIL_DATA)malloc(neededLength);ClassDeviceData->cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);//第二次调用SetupDiGetDeviceInterfaceDetail// 使用合适的neededLength.if (!SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&de viceInfoData,ClassDeviceData,neededLength,&requiredLength,NULL)){free(ClassDeviceData);SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);return FALSE;}// 建立HID设备的句柄HIDDevice=CreateFile(ClassDeviceData-> DevicePath, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);// 获取 attributes 以便得到Vendor ID 和 Product IDHidD_GetAttributes(HIDDevice,&Attributes);if ((Attributes.VendorID == VendorID) && (Attributes.ProductID == ProductID)){// 找到了匹配的Vendor ID 和 Product ID的HID设备// 建立ReadHIDDevice设备的句柄以便读取信息ReadHIDDevice=CreateFile(ClassDeviceData-> DevicePath, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);free(ClassDeviceData); SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);//初始化成功return TRUE;}else{CloseHandle(HIDDevice);}free(ClassDeviceData);HIDCounter = HIDCounter+1;}}}//Read from usb prot,that is listen to usb port ,if it has character,system would display it on user interf acebool ReadUSB(){BufferLength=1;memset(DataBuffer,0,1);if(!ReadFile(ReadHIDDevice,DataBuffer,BufferLength,&bytes Read,NULL)) //失败return false; //读数失败立即返回elsereturn true;}//Wirte a character or a string to usb portbool WriteUSB(){CString str;SendBufferLength=1;SendDataBuffer[0]=65;str=SendDataBuffer;if (!WriteFile(ReadHIDDevice,SendDataBuffer,SendBufferLe ngth,&bytesRead,NULL)){return false;//失败}else{AfxMessageBox( "Success! ");return true;//成功}}//Thread callback functionvoid CUsblistenDlg::OnSend(){// TODO: Add your control notification handler cod e hereSendDataBuffer[0]= 'C ';WriteUSB();}void CUsblistenDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here an d/or call default//CString str;//ReadUSB();//str=DataBuffer;//if(DataBuffer[0]!=0)//{// CListBox *listbox=(CListBox*)GetDlgItem(IDC_ LIST1);// listbox-> AddString(str);//}//else//{// CListBox *listbox=(CListBox*)GetDlgItem(IDC_LIST1 );// listbox-> AddString( "No Charcters is sent to usb port ");//}WriteUSB();CDialog::OnTimer(nIDEvent);}。

mfc usb通信

mfc usb通信

我的USB设备自己有驱动程序,用超级终端可以进行通信。

只是因为某些原因还需要我自己写一个通信程序。

想知道应该怎么查看设备的开发接口,怎么用 VC 引入?用超级终端的时候,它是以设备的名字“xxmodem”做端口号的,不知道是端口几或者还是它名字本身就是一的端口号。

我安装了windows的ddk,用了windows的API函数,程序如下,不知道有什么问题:#include "stdio.h"#include "windows.h"#include "setupapi.h"#include "hidsdi.h"HANDLE hComm; //我定义的端口句柄void OnSearch() //按我的理解它应该是搜索usb设备的存在{GUID guidHID;HIDD_ATTRIBUTES strAttrib;HDEVINFO hDevInfo;BOOL bSuccess;SP_DEVICE_INTERFACE_DATA strInterfaceData;HidD_GetHidGuid(&guidHID);HidD_GetAttributes(hComm, &strAttrib);hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,0,DIGCF_PRESENT ¦DIGCF_DEVICEINTERFACE);bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,0,&strInterfaceData);}BOOL OpenComm(const char *pPort, int nByteSize) //打开端口,用的windows 的API函数{DCB dcb;COMMTIMEOUTS timeouts ={100,1,500,1,100};hComm = CreateFile(pPort,GENERIC_READ ¦ GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if (hComm == INVALID_HANDLE_VALUE)return FALSE;GetCommState(hComm, &dcb);dcb.BaudRate = CBR_115200;dcb.ByteSize = nByteSize;dcb.Parity = NOPARITY;dcb.StopBits = ONESTOPBIT;SetCommState(hComm, &dcb);SetupComm(hComm, 4096, 1024);SetCommTimeouts(hComm, &timeouts);return TRUE;}BOOL CloseComm() //关闭端口{return CloseHandle(hComm);}void WriteComm(char *pData, int nLength) //写端口{int i=0;DWORD dwNumWrite;//我把向该设备写入的命令写了40次,保证它可以收到。

用WDK在Visual C++下开发USB HID通信程序

用WDK在Visual C++下开发USB HID通信程序

用WDK在Visual C++下开发USB HID通信程序
于喆;黄文斌;朱晨晨;王刚
【期刊名称】《洛阳理工学院学报(自然科学版)》
【年(卷),期】2009(019)004
【摘要】主要讨论了在Visual C++下开发USB HID设备通信程序的一般方法.详细叙述了利用WDK编写HID设备通信程序的流程,指出了若干需要注意的开发要点,并给出了关键步骤的代码.利用WDK编写HID设备通信程序的方法经实践检验有效,具有普遍意义.
【总页数】6页(P70-75)
【作者】于喆;黄文斌;朱晨晨;王刚
【作者单位】西安建筑科技大学信息与控制工程学院,陕西,西安,710055;西安建筑科技大学信息与控制工程学院,陕西,西安,710055;西安建筑科技大学信息与控制工程学院,陕西,西安,710055;西安建筑科技大学信息与控制工程学院,陕西,西
安,710055
【正文语种】中文
【中图分类】TP311
【相关文献】
1.用Visual C++ 6.0进行对等网实时通信程序设计 [J], 吴正平;熊晓东;姜吉发;魏斌
2.用Visual C++开发Windows环境下多串口通信程序 [J], 艾彧;赵宇;张曙
B-GPIB控制器VISA函数库的开发及在Visual C++中的应用 [J], 王学伟;张未未
4.如何用Visual C++编写32位串行通信程序 [J], 姜丽
5.基于Visual C++的Windows网络通信程序设计 [J], 蒋年德;方志国
因版权原因,仅展示原文概要,查看原文内容请购买。

vc实现光驱、软驱、usb的禁用...

vc实现光驱、软驱、usb的禁用...

vc++实现光驱、软驱、usb的禁用和启用(Vc++ CD-ROM driver, floppy drive, USB disable and enable)VC++ serial programming technology VC++ for disabled and enabled CD-ROM, floppy drive, USB2007-06-28 17:58:21VC++ serial programming technology VC++ for disabled and enabled CD-ROM, floppy drive, USBRefer to the code that you provide for the network card to disable, the CD-ROM drive, floppy drive, USB enable and disable. The main implementation code is as follows:/ / the necessary header files and links to the LIB file#include <setupapi.h>#include <shlwapi.h>#pragma comment (LIB, "setupapi.lib")#pragma comment (LIB, "shlwapi.lib")Information set / / device (I translated it for the device information set)HDEVINFO hDevInfo = NULL;/ / error messagesVoid FormatMSG (DWORD dwError, LPTSTR * lpszMsg){BOOL bOk = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,MAKELANGID (LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), (LPTSTR) lpszMsg, 0, NULL);If (... BOk){HMODULE hDll = LoadLibraryEx (_T ("netmsg.dll")),NULL,DONT_RESOLVE_DLL_REFERENCES);If (NULL = = hDll){FormatMessage (FORMAT_MESSAGE_FROM_HMODULE |FORMAT_MESSAGE_FROM_SYSTEM,HDll,DwError,MAKELANGID (LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),(LPTSTR) lpszMsg, 0, NULL);FreeLibrary (hDll);}}}BOOL ChangeStatus (DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo){LPTSTR lpszMsg = NULL;HCURSOR hCursor = NULL;Try{SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};SP_DEVINFO_DATA DeviceInfoData = {sizeof (SP_DEVINFO_DATA)};HCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));Get a handle to the Selected / / Item.If (? SetupDiEnumDeviceInfo (hDevInfo, SelectedItem, &DeviceInfoData)){FormatMSG (GetLastError (), &lpszMsg);Throw lpszMsg;}The PropChangeParams structure. / / SetPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;PropChangeParams.Scope = DICS_FLAG_GLOBAL;PropChangeParams.StateChange = NewStatus;If (... SetupDiSetClassInstallParams (hDevInfo,&DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams),Sizeof (PropChangeParams))FormatMSG (GetLastError (), &lpszMsg);Throw lpszMsg;}Call the ClassInstaller and perform the / / change.If (? SetupDiCallClassInstaller (DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData)){FormatMSG (GetLastError (), &lpszMsg);Throw lpszMsg;}SetCursor (hCursor);Return TRUE;}Catch (TCHAR * pszError){setcursor (hcursor);:: messagebox (zero, pszerror, _ t ("提示"), mb _ ok); if (null! = lpszmsg){localfree (hlocal) lpszmsg);}return false;}}/ / 这些设备的启用和禁用主要有此函数实现/ / 参数说明, nstatus 可取3个值, 1: 啥也不做/ / 0 禁用设备, 1启用设备./ / nindex用于控制是对光驱, 软驱还是对usb启用或禁用/ / 也是可取3个值代表软驱, 0, 1 代表光驱/ / 2 代表usb/ / 譬如要对光驱实现禁用, 可以这样调用此函数/ / controldisk (0, 1);controldisk bool (int nstatus, int nindex) {if (- 1 = = nstatus){return false;}lptstr lpszmsg = null;try{tchar * guidstring = null;guid guid.zeromemory (& guid, sizeof (guid));switch (nindex){case 0: / / 0 代表软驱guidstring = _ t ("4d36e980 - e325 - 11ce - bfc1 -08002be10318");uuidfromstring ((unsigned char *) guidstring, & guid).break;case 1: / / 1 代表光驱guidstring = _ t ("4d36e965 - e325 - 11ce - bfc1 -08002be10318");uuidfromstring ((unsigned char *) guidstring, & guid).break;case 2: / / 2 代表usbguidstring = _ t ("36fc9e60 - c465 - 11cf - 8056 - 444553540000");uuidfromstring ((unsigned char *) guidstring, & guid).break;}hdevinfo = setupdigetclassdevs (& guid, zero, zero, digcf _ present);if (invalid _ handle _ value = = hdevinfo){formatmsg (getlasterror (), & lpszmsg);throw lpszmsg;}dword.sp _ devinfo _ data deviceinfodata;zeromemory (& deviceinfodata, sizeof (sp _ devinfo _ data));deviceinfodata.cbsize = sizeof (sp _ devinfo _ data);for (i = 0; setupdienumdeviceinfo (hdevinfo, i, & deviceinfodata); + + i){if (a = = nstatus){statechange (dlc _ enable, i, hdevinfo);}else if (0 = = nstatus){statechange (dlc _ disable, i, hdevinfo);}}/ / 释放 device information setreturn setupdidestroydeviceinfolist (hdevinfo);}catch (tchar * pszerror){:: messagebox (zero, pszerror, _ t ("提示"), mb _ ok); if (null! = lpszmsg){localfree (hlocal) lpszmsg);}return false;}return false;}经测试这样对光驱, 软驱和usb实现禁用没有问题, 但是当禁用过之后如果要对usb实现启用必须两次调用controldisk (1, 2); 这个函数才可, 其余的两个启用没什么问题.还有要说的就是我不是用的枚举所有的设备, 然后再过滤 (网上的那个禁用网卡的就是这种方法).据我观察, 在注册表的此项下下:the local _ hkey _ machine \ system \ currentcontrolset \, \ class.有很多guid, 每个guid代表一个设备, 譬如这个是usb的(36fc9e60 - c465 - 11cf - we - 444553540000}这个是cdrom的(4d36e965 - - 11 - bfc1 - 08002be10318 e325.等等了.这些值你即使把它改为别的guid, 我使用原来的guid仍然可以实现我的功能.。

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

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

用VC++实现与USB驱动程序的通信
莫林利;赵秀绍
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2003(000)001
【摘要】本文简要介绍了USB设备驱动程序的概念,然后以一个基于对话框的VC++应用程序为例,详细讲解了如何实现与USB设备驱动程序之间的通信,包括打开一个设备、写入数据、读取数据、清空数据等最基本的通信方式.
【总页数】3页(P56-57,70)
【作者】莫林利;赵秀绍
【作者单位】
【正文语种】中文
【中图分类】TP31
【相关文献】
1.用VC++编写USB人机接口类通信程序 [J], 邱罡;王伟
2.电力故障仿真装置硬件设计及其USB通信驱动程序的工作机制 [J], 陈新军;冯玉东;靳建峰;冯政协;张庆伟;翁利民
3.用VC++编写USB接口通信程序 [J], 陈俊;李治
4.基于VC++实现在线签名认证系统与USB的通信 [J], 张巍;郑建彬
5.基于USB双机通信系统中驱动程序的实现 [J], 朱翠涛;陈少平
因版权原因,仅展示原文概要,查看原文内容请购买。

C+++Builder+访问+USB+口的方法

C+++Builder+访问+USB+口的方法

编译环境: Borland C++ Builder 6.0, Windows Server 2003 DDK 运行环境: Win98/2000/XP/2003下面是访问USB 口必备的函数:有了上面的函数就可以访问USB 口了:USB 设备、USB 驱动、USB 应用程序B 设备硬件部分a.这个硬件的标识是用的Vender ID 和Product ID, 即“厂家标识”和“产品标识”b.这个硬件规定了各个End Point (端点) 的性质, 读/写及类型(Control/Interrupt/Bulk/Isochronous)c.这个硬件的固件里面有DeviceIoControl 的实现部分, 规定了这个函数的具体参数和动作B 设备驱动①硬件接口a.需要识别Vender ID 和Product IDb.对每个EndPoint 的每个I/O 分配一个Pipe, 并且起一个名字作为软件接口c.做DeviceIoControl 的接口②软件接口a.GUID, 驱动程序的标识, 每个驱动程序使用不同的GUID, GUID 是识别驱动的, 与硬件无关(驱动程序升级版本GUID 不能修改)b.硬件接口里面的b: Pipe 名字是软件接口, 这个Pipe 名字纯粹由驱动定义的, 和硬件无关, 升级驱动不能改Pipe 的名字c.硬件接口里面的c 的各个参数也是软件的接口, 这些参数是由硬件带来的, 不是驱动规定的, 当然也可以在驱动里面转义, 隐藏设备的真实情况③这个驱动程序是用WinDDK 编译的, 可以用文本编辑器或其他开发工具的编辑器编程序代码, 然后调用WinDDK 编译3.读写USB 口的程序①与驱动的接口a.利用驱动程序里面的GUID 找出设备的文件名, 用CreateFile 函数打开设备。

我前面的程序里面的OpenUsbDevice 就是这个作用b.通过a.得到的设备文件名和驱动程序里面的Pipe 名打开Pipe, 访问这个Pipe 对应的USB 端点(读写数据)c.使用a.的CreateFile 得到的句柄, 通过DeviceIoControl 实现设备规定的动作②有关需要的资料a.Vender ID, Product ID 和GUID 一般在驱动程序的 .inf 文件里面能看到, 如果找不到就需要和厂家联系b.Pipe 的名字是驱动程序规定的, 需要有驱动程序的资料才能知道c.DeviceIoControl 的参数需要有驱动程序的资料或者硬件资料才能知道③这个程序一般用C/C++ 直接编写, 如果使用其他语言(VB/PB等)需要调用C/C++ 编的DLL其他相关内容:USB 驱动程序可以到注册表里面找到:"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vid_厂家标识&Pid_产品标识\\驱动程序"里面的ClassGUID 就是驱动程序的GUID 标识, 例如{36FC9E60-C465-11CF-8056-444553540000}相当于程序的: DEFINE_GUID(USB_DRIVER_GUID, 0x36FC9E60,0xC465,0x11CF,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00);另外在这个注册表键里面还可找到有关设备的其他描述, 例如DeviceDesc = "USB Mass Storage Device" 等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)应用程序调用RecvFile方法将一个文件接收任务加入 一个流,或用RecvData方法将一个数据接收任务加入一个 流,控件接收到数据报后作差错校验、重复接收检验,将接收 到的正确的数据报重组后,RecvFile方法将数据保存为指定目 录下的文件,RecvData方法则将数据流返回给应用程序;
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()

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

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()以重新确认设备是否打开 和准备好接收或发送数据。
相关文档
最新文档