虚拟串口--杂记

简介: <p><span style="color:#009900;">虚拟串口被占用,软件可用串口有限COM1-COM4,如何释放和删除被占用的串口  </span></p><p><br></p><p>A:可以通过删除注册表中的一个数值项来清除这些配置:在“运行”对话框中输入“regedit”进入注册表;然后进入 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS

虚拟串口被占用,软件可用串口有限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

相关文章
|
9月前
|
网络协议
【乌拉喵.教程】串口服务器的配置与连接调试
【乌拉喵.教程】串口服务器的配置与连接调试
315 0
|
11月前
|
传感器 网络协议 网络架构
做网络那么多年,连以太网接口和串口都分不清?本文值得一看!
做网络那么多年,连以太网接口和串口都分不清?本文值得一看!
274 0
|
芯片 开发者
嵌入式开发学习之--串口通讯(上)
嵌入式开发学习之--串口通讯(上)
嵌入式开发学习之--串口通讯(上)
|
存储 Java 数据安全/隐私保护
嵌入式开发学习之--串口通讯(下)
嵌入式开发学习之--串口通讯(下)
嵌入式开发学习之--串口通讯(下)
|
Unix Linux Windows
ZYNQ - 嵌入式Linux开发 -03- 连接文件
ZYNQ - 嵌入式Linux开发 -03- 连接文件
100 0
ZYNQ - 嵌入式Linux开发 -03- 连接文件
|
IDE .NET 开发工具
艾伟_转载:VS 2010 和 .NET 4.0 系列之《多显示器支持》篇
本系列文章导航 VS 2010 和 .NET 4.0 系列之《ASP.NET 4 中的SEO改进 》篇 VS 2010 和 .NET 4.0 系列之《干净的Web.Config文件 》篇 VS 2010 和 .
1013 0
|
SQL XML 数据库
Eclipse开发Android应用程序入“.NET研究”门:重装上阵
  原文:http://www.smashingmagazine.com/2011/03/28/get-started-developing-for-android-with-eclipse-reloaded/   在我们教程系列的第一部分中,我们使用Android和Eclipse开发了一个简单的饮茶计时器的应用程序。
1235 0