zoukankan      html  css  js  c++  java
  • 虚拟串口--杂记 分类: 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

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

  • 相关阅读:
    Centos7 ftp服务器搭建
    搭建单机版spark
    JAVA JDBC大数据量导入Mysql
    springboot使用自带连接池连接postgre
    linux centos6安装postgresql
    SpringBoot中配置不序列化返回值为null的属性
    sublime 3 安装格式化JSON插件
    HIve分组查询返回每组的一条记录
    FastJson乱序问题
    深入理解迪杰斯特拉算法
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706494.html
Copyright © 2011-2022 走看看