he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2433回复:11

在驱动程序中直接操作串口,如何设置串口的参数?

楼主#
更多 发布于:2004-06-20 14:18
我已经使用ZwCreateFile成功打开串口,使用哪个函数设置串口码速率、奇偶校验等参数?谢谢各位大虾
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-06-21 10:00
SetCommState 有一个DCB(设备控制块)参数,里面有速率、奇偶校验
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-22 09:26
SetCommState函数能在核心模式调用吗?好象不能!
he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-22 09:47
另外还有一个疑问:我在DPC里调用ZwWriteFile函数,老是返回失败。我看了一下DDK的帮助,说必须在PASSIVE_LEVEL级调用ZwWriteFile,我把它放到了DispatchWrite里试了一下,果然成功。但我就是想在收到一个中断后,把一些数据立即发到串口,因为实时性要求很高,所以才做在驱动里,在响应中断后,我如何才能合法的进入PASSIVE_LEVEL级呢?
yjhleaf
驱动小牛
驱动小牛
  • 注册日期2001-11-04
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-28 09:48
可以在内核创建一个线程,在用信号量或者事件同步,好象帮助里有这个说明。
忽如一夜春风来,千树万树梨花开。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-28 10:05
对使用系统线程来处理,这需要进行事件等的同步就好了。
你的什么系统要求这么高的实时性?好象你是将别的硬件的数据输入到串口的?你是否考虑使用硬件解决方案呢?这样可能能更好的提供实时性要求。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-29 21:37
谢谢各位,优先级的问题我已经解决了,和各位想的一样,使用线程解决的。
不过设置码速率的问题解决的还不理想,我先在上层应用程序中设置好码速率,然后关闭串口,然后再控制驱动程序打开串口,这时就会以刚才的参数打开串口。我希望能够直接在驱动程序中设置,不知哪位大侠有高招!???
he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-02 18:09
顶一下
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-07 15:35
构建irp然后传递下去就可以了。
he_cti2
驱动牛犊
驱动牛犊
  • 注册日期2003-08-03
  • 最后登录2013-10-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-13 20:43
构建irp然后传递下去就可以了。
 

好象比比较复杂,有例子吗?
funny
驱动小牛
驱动小牛
  • 注册日期2003-04-17
  • 最后登录2021-07-30
  • 粉丝0
  • 关注0
  • 积分1012分
  • 威望178点
  • 贡献值0点
  • 好评度123点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2007-02-26 11:05
我也遇到同样的问题,但是写串口应该直接创建发送irp即可, 读串口该如何解决?郁闷?
这样的资料太少了,请大虾指点。
驱动现在,成就未来
funny
驱动小牛
驱动小牛
  • 注册日期2003-04-17
  • 最后登录2021-07-30
  • 粉丝0
  • 关注0
  • 积分1012分
  • 威望178点
  • 贡献值0点
  • 好评度123点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-03-08 16:01
//串口通信设置
    RtlInitUnicodeString(&usTargetPortName, L"\\??\\COM1");
    
    InitializeObjectAttributes(&objectAttributes,
                                (PUNICODE_STRING)&usTargetPortName,
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL);

    ntStatus = ZwCreateFile(&DeviceExtension->hComm,//FileHandle
                      GENERIC_READ | GENERIC_WRITE,//DesiredAccess
                      &objectAttributes,//ObjectAttributes
                      &IoStatus,//IoStatusBlock
                      0, //AllocationSize
                      FILE_ATTRIBUTE_NORMAL,//FileAttributes
                      0,//ShareAccess
                      FILE_OPEN,//CreateDisposition
                      FILE_SYNCHRONOUS_IO_NONALERT,//CreateOptions
                      NULL,    
                      0 );
    ntStatus = ObReferenceObjectByHandle(DeviceExtension->hComm,
                                        GENERIC_READ | GENERIC_WRITE,
                                        NULL,
                                        KernelMode,
                                        &TgtFileObject,
                                        NULL);
    
    DeviceExtension->TgtDeviceObject =
                        IoGetRelatedDeviceObject(TgtFileObject);

    //SERIAL_BAUD_9600 ULONG in ntddser.h
    br.BaudRate= SERIAL_BAUD_9600;

    Irp = IoBuildDeviceIoControlRequest(IOCTL_SERIAL_SET_BAUD_RATE,
                                  DeviceExtension->TgtDeviceObject,
                                  &br,
                                  sizeof(SERIAL_BAUD_RATE),
                                  NULL,
                                  0,
                                  FALSE,
                                  &event,
                                  &IoStatus);
    if(Irp == NULL)
    {
        dprintf("[COMMHOOK]IOCTL_SERIAL_SET_BAUD_RATE Irp not allocted");
        goto __failed;
    }


    ntStatus = IoCallDriver( DeviceExtension->TgtDeviceObject, Irp);
    if (!NT_SUCCESS(ntStatus))
    {
        KeWaitForSingleObject(&event, Executive,
            KernelMode, FALSE, NULL);
    }

   当执行到IoCallDriver可是如下报错
    Bug Check 0x0A: IRQL_NOT_LESS_OR_EQUAL
     The IRQL_NOT_LESS_OR_EQUAL bug check has value 0x0000000A. This signals that the    driver accessed paged memory at DISPATCH_LEVEL or above.

请给个提示,到底是如何引起的.等待中..........
驱动现在,成就未来
游客

返回顶部