虚拟串口--杂记 分类: windows驱动程序WDM 2014-10-21 15:56 672人阅读 评论(1) 收藏

虚拟串口被占用,软件可用串口有限COM1-COM4,如何释放和删除被占用的串口  


A:可以通过删除注册表中的一个数值项来清除这些配置:在“运行”对话框中输入“regedit”进入注册表;然后进入 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCOM Name Arbiter这时我们可以找到该数值项:ComDB,它的值代表目前使用中的串口端号。比如1d,它的二进制:0001 1101,则从右往左数代表第1,3,4,5端口被占用。这样我们只需要把ComDB这个数据项删除,关闭注册表(不用重启电脑)即可。


如何符号连接?

修改注册表:HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM,新建项目,名称 myWDMDevice ,类型 REG_SZ,内容 COM7。打开串口监控既可看到。

/************************************************************************
* 函数名称:HelloWDMAddDevice
* 功能描述:添加新设备
* 参数列表:
      DriverObject:从I/O管理器中传进来的驱动对象
      PhysicalDeviceObject:从I/O管理器中传进来的物理设备对象
* 返回 值:返回添加新设备状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)

PAGED_CODE();
KdPrint(("Enter HelloWDMAddDevice "));


NTSTATUS status;
PDEVICE_OBJECT fdo;
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\Device\MyWDMDevice");
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&fdo);
if( !NT_SUCCESS(status))
return status;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
pdx->fdo = fdo;
pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\DosDevices\COM7");


pdx->ustrDeviceName = devName;
pdx->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName);


if( !NT_SUCCESS(status))
{
IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
status = IoCreateSymbolicLink(&symLinkName,&devName);
if( !NT_SUCCESS(status))
{
return status;
}
}


fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;


KdPrint(("Leave HelloWDMAddDevice "));
return STATUS_SUCCESS;
}

串口的IO控制码

#include <ntddser.h>

#define IOCTL_SERIAL_SET_BAUD_RATE      CTL_CODE(FILE_DEVICE_SERIAL_PORT, 1,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_SET_QUEUE_SIZE     CTL_CODE(FILE_DEVICE_SERIAL_PORT, 2,METHOD_BUFFERED,FILE_ANY_ACCESS)

请教如何做虚拟串口驱动?

我用driverstudio自动生成了一个驱动,什么也没有改动
我把inf文件里面的
class和classguid改成

Class=Ports
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318}

然后在设备管理器里面看有我的驱动了,后面括号里面有com4。

只要在adddevice 里面用 pDevice->createlink("com4")就可以了


windows自带的超级终端和串口调试助手采用两种不同的机制
超级终端采用查询的方式,串口调试助手和其他使用MSComm类的串口应用程序用的是事件通知的方式。

超级终端的方式:
不停的尝试读1个字节,读到为止

事件的方式:不主动读
先调用IOCTL_SERIAL_SET_WAIT_MASK设置一些标志
这个就相当于是设置硬件的哪些中断使能,哪些中断屏蔽掉

然后调用IOCTL_SERIAL_WAIT_ON_MASK发送一个IRP请求,这个IRP请求交给你处理。真正的串口就是当设定的MASK的事件发生的时候,中断处理程序就会完成这个IRP.

当IO管理器发现这个IRP返回了,它先IOCTL_GET_WAIT_MASK确认一下自己刚才设置了哪些标志,如果完成的IRP中SERIAL_EV_RXCHAR标志
被置位了,IO管理器就会IOCTL_GET_COMMSTATUS

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/mao0504/p/4706494.html