虚拟串口被占用,软件可用串口有限COM1-COM4,如何释放和删除被占用的串口
A:可以通过删除注册表中的一个数值项来清除这些配置:在“运行”对话框中输入“regedit”进入注册表;然后进入 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter这时我们可以找到该数值项:ComDB,它的值代表目前使用中的串口端号。比如1d,它的二进制:0001 1101,则从右往左数代表第1,3,4,5端口被占用。这样我们只需要把ComDB这个数据项删除,关闭注册表(不用重启电脑)即可。
如何符号连接?
修改注册表:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM,新建项目,名称 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\n"));
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\n"));
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