阅读:1237回复:2
串口驱动问题
小弟刚学习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 请高手指点,谢谢 |
|
沙发#
发布于:2005-03-19 00:36
有很多串口调式助手本身都有问题,建议用下面的再试试看 !!
http://www.hhdsoftware.com/sermon.html 它是filter type驱动程序加到串口上,相当不错 或这个也可 http://www.sysinternals.com/ntw2k/freeware/portmon.shtml |
|
板凳#
发布于:2005-03-19 11:57
谢谢您回答,不过我觉得你理解的不对,我的意思是我想在驱动方式下直接操作串行通讯芯片8250,但发现不行,而且您应该也看到我写的那段代码中有两个嵌套循环,我发现我往8250发送寄存器写入发送字节后,马上读取中断标识寄存器判断是否发生数据发送完中断产生,但是程序就在读取与判断中死循环了,不知为什么.
|
|