dearsohucom
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2006-05-11
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:1225回复:2

串口驱动问题

楼主#
更多 发布于:2005-03-18 17:56
小弟刚学习KmdKit开发工具,想写一串口发送数据的驱动程序
主程序调用DeviceIoControl函数,驱动程序中直接对8250进行操作
用串口调式助手监控,发现当发送端也打开串口调试助手后,而且用助手发一个数据后,上面的那个DeviceIoControl函数才有效果,否则接收端无数据
发送端不打开串口调试助手,接收端接不到数据
系统是win2k sp4

响应DeviceIoControl函数的代码如下:
    cli
    and dwBytesReturned, 0

    mov esi, pIrp
    assume esi:ptr _IRP

    IoGetCurrentIrpStackLocation esi
    mov edi, eax
    assume edi:ptr IO_STACK_LOCATION

    .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_PHYS_ADDRESS
        .if ( [edi].Parameters.DeviceIoControl.OutputBufferLength >= DATA_SIZE ) &&\\
( [edi].Parameters.DeviceIoControl.InputBufferLength >= DATA_SIZE )

            mov edi, [esi].AssociatedIrp.SystemBuffer
   mov eax,[edi].Parameters.DeviceIoControl.InputBufferLength
   mov incount,eax
            assume edi:ptr DWORD
   xor ecx,ecx
            xor ebx,ebx
   mov al,80h
   mov dx,3fbh
   out dx,al
   mov al,60h
   mov dx,3f8h
   out dx,al
   mov al,00h
   mov dx,3f9h
   out dx,al
   mov al,03h
   mov dx,3fbh
   out dx,al
;    mov al,03h
;    mov dx,3fch
;    out dx,al
;    mov al,00h
;    mov dx,3f9h
;    out dx,al
   .while ebx < incount
   mov al,0ah
   mov dx,3f8h
   out dx,al
   .while TRUE
mov dx,3fah
in  al,dx
and al,02h
.break .if(al==02h)
inc ecx
.break .if(ecx>=100)
   .endw
   .break .if(ebx>=30)
   xor ecx,ecx
   inc ebx
   .endw
            mov dwBytesReturned, DATA_SIZE
            mov status, STATUS_SUCCESS
        .else
            mov status, STATUS_BUFFER_TOO_SMALL
        .endif
    .else
        mov status, STATUS_INVALID_DEVICE_REQUEST
    .endif
    assume edi:nothing

    push status
    pop [esi].IoStatus.Status
    push dwBytesReturned
    pop [esi].IoStatus.Information

    assume esi:nothing
    fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    mov eax, status
    sti
    ret
请高手指点,谢谢
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
沙发#
发布于:2005-03-19 00:36
有很多串口调式助手本身都有问题,建议用下面的再试试看 !!

http://www.hhdsoftware.com/sermon.html

它是filter type驱动程序加到串口上,相当不错 或这个也可

http://www.sysinternals.com/ntw2k/freeware/portmon.shtml
dearsohucom
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2006-05-11
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-19 11:57
谢谢您回答,不过我觉得你理解的不对,我的意思是我想在驱动方式下直接操作串行通讯芯片8250,但发现不行,而且您应该也看到我写的那段代码中有两个嵌套循环,我发现我往8250发送寄存器写入发送字节后,马上读取中断标识寄存器判断是否发生数据发送完中断产生,但是程序就在读取与判断中死循环了,不知为什么.
游客

返回顶部