资源简介
主要功能
===========
基本上跟商业软件Virtual Serial Ports Driver XP3类似。
1.在操作系统中,虚拟出若干串口。可以使用串口工具(比如操作系统自带的超级终端软件)对串口进行打开、发送、接收、关闭等操作。
2. 由于是虚拟串口,所以可以设置任意波特率、数据位、奇偶校验、停止位等端口操作。
3. 通过协议传送、接收数据。
使用说明
===========
1. 安装toaster( win2k ddk sample)总线驱动程序:BusEnum.sys。安装步骤详见DDK的toaster\bus例子
2. 控制台上运行enum -p 1,对新的硬件设备指定 SimSerial\inf目录,安装我们的虚拟串口驱动程序。
安装完毕以后在“设备管理器”中应该多出一类设备“VirtualSerial”。enum程序由DDK的toaster\exe\enum例子编译。只是改动了toaster\inc\public.h中的#define BUS_HARDWARE_IDS L"Toaster\\MsToaster\0"
3. 控制台上运行enum -p 2,添加第二个虚拟串口设备
4. 控制台上运行test.exe,枚举并且互连刚刚生成的两个串口。
5. 打开“超级终端”,在“连接到”对话框上“连接时使用”中选择“COM20”
6. 打开“超级终端”,在“连接到”对话框上“连接时使用”中选择“COM21”
7. 卸载设备可以在控制台上运行 enum -u 1, enum -u 2
8. 更新驱动程序时,只需要将所有的虚拟串口卸载,然后再编译驱动程序,build -ceZ,运行cc.bat即可。
代码片段和文件信息
// Test.cpp : Defines the entry point for the console application.
//
#include “stdafx.h“
#include
#include
//#include
#include
#include
#include “objbase.h“
#include
#include “..\inc\wdmioctl.h“
DEFINE_GUID(GUID_CLASS_COMPORT 0x86e0d1e0L 0x8089 0x11d0 0x9c 0xe4 0x08 0x00 0x3e 0x30 0x1f 0x73);
void HandleDevice( PSP_INTERFACE_DEVICE_DETAIL_DATA detail );
int main(int argc char* argv[])
{
HDEVINFO info;
DWORD n;
BOOL bRet;
DWORD needed;
SP_INTERFACE_DEVICE_DATA ifdata;
PSP_INTERFACE_DEVICE_DETAIL_DATA detail = NULL;
// 首先得到该ClassGUID值下的设备信息句柄 info. 本程序中ClassGUID代表串口设备类
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}
info = SetupDiGetClassDevs( (LPGUID) &GUID_CLASS_COMPORT//(LPGUID)&GUID_WDMSAMPLE_DEVICE_INTERFACE_CLASS
NULL NULL DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if( info == INVALID_HANDLE_VALUE ){
printf(“Error %d trying to open enumeration handle for \n“ GetLastError() );
return 0;
}
ifdata.cbSize = sizeof(ifdata);
n = 0;
// 使用该 info 依次枚举当前该ClassGUID下的所有设备接口,将该接口信息放在ifdata
while( SetupDiEnumDeviceInterfaces(info NULL (LPGUID)&GUID_CLASS_COMPORT//(LPGUID) &GUID_WDMSAMPLE_DEVICE_INTERFACE_CLASS
n &ifdata))
{
// 第一次调用 SetupDiGetDeviceInterfaceDetail,得到ifdata所需空间大小
SetupDiGetDeviceInterfaceDetail(info &ifdata NULL 0 &needed NULL);
detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
if (!detail)
{
printf(“Error %d trying to get memory for interface detail\n“ GetLastError());
goto FAILED;
}
// 第二次调用 SetupDiGetDeviceInterfaceDetail,得到ifdata指代的设备的详细信息
detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(info &ifdata detail needed NULL NULL))
{
printf(“Error %d getting interface detail\n“ GetLastError());
goto FAILED;
}
// 对ifdata/detail所指代的设备进行打开,IoControl,关闭等操作
HandleDevice( detail );
free( detail );
detail = NULL;
n++;
}
FAILED:
if( detail != NULL ){
free( detail );
}
bRet = SetupDiDestroyDeviceInfoList( info );
return 0;
}
void HandleDevice( PSP_INTERFACE_DEVICE_DETAIL_DATA detail )
{
char name[ MAX_PATH ];
HANDLE hfile;
DWORD junk;
INT ComX;
// 打开设备,此处的设备名称为Kernel mode下IoRegisterDeviceInterface后OS自动生成名称。如下形式
// ##?#Toaster#MsToaster#1&1aafb3d5&2&01#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
strncpy(name detail->DevicePath sizeof(name));
hfile = CreateFile( name GENERIC_READ | GENERIC_WRITE 0 NULL OPEN_EXISTING 0 NULL);
if (hfile == INVALID_HANDLE_VALUE)
{
printf(“Error %d trying to open %s\n“ GetLastError() name);
return;
}
scanf( “%d“ &ComX );
#if 1
if(!DeviceIoControl(hfileIOCTL_INIT_SETTING &ComX sizeof( INT ) NULL 0 &junk NULL))
{
printf(“Direct IOCTL failed with code %d
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2004-01-16 09:10 SimSerial
目录 0 2004-01-16 09:10 SimSerial\DebugLog
目录 0 2004-01-16 09:10 SimSerial\DebugLog\24
文件 30970 2003-12-24 23:32 SimSerial\DebugLog\24\COM9口发送文件打印信息.log
文件 28792 2003-12-24 23:43 SimSerial\DebugLog\24\com9接收文件打印信息.log
文件 12368 2003-12-17 23:44 SimSerial\DebugLog\filter打印信息_8.27.log
文件 2190 2003-12-11 22:30 SimSerial\DebugLog\GetResource.log
文件 7892 2003-12-11 23:00 SimSerial\DebugLog\toaster_bus分析2003_12_11.log
文件 4928 2003-12-17 23:27 SimSerial\DebugLog\使用超级终端打开虚拟串口.log
文件 36374 2003-12-18 22:55 SimSerial\DebugLog\接收文件.log
文件 350 2004-01-07 23:56 SimSerial\DebugLog\设备名的处理说明.txt
文件 16322 2003-12-18 21:18 SimSerial\DebugLog\超级终端中接收文件.log
文件 9692 2003-12-24 21:36 SimSerial\DebugLog\过滤驱动拦截XP3虚拟串口信息.log
目录 0 2004-01-16 09:10 SimSerial\exe
文件 3389 2003-12-26 23:48 SimSerial\exe\1.c
文件 1196 2003-07-16 21:44 SimSerial\exe\ReadMe.txt
文件 291 2003-07-16 21:44 SimSerial\exe\StdAfx.cpp
文件 769 2003-07-16 21:44 SimSerial\exe\StdAfx.h
文件 9795 2004-01-14 23:45 SimSerial\exe\Test.cpp
文件 4551 2004-01-08 22:31 SimSerial\exe\Test.dsp
文件 531 2003-07-16 21:44 SimSerial\exe\Test.dsw
文件 58368 2004-01-14 23:46 SimSerial\exe\Test.ncb
文件 55808 2004-01-14 23:46 SimSerial\exe\Test.opt
文件 1451 2004-01-14 23:46 SimSerial\exe\Test.plg
文件 657 2004-01-15 23:53 SimSerial\exe\说明.txt
目录 0 2004-01-16 09:10 SimSerial\filter
目录 0 2003-12-17 23:30 SimSerial\filter\buslower
文件 271 2000-07-27 01:35 SimSerial\filter\buslower\MAKEFILE
文件 91 2000-07-27 01:35 SimSerial\filter\buslower\sources
目录 0 2003-12-17 23:30 SimSerial\filter\busupper
............此处省略178个文件信息
- 上一篇:cgi实现文件
- 下一篇:单片机温度控制系统設計
评论
共有 条评论