阅读:1701回复:5
串口设置中SetCommState对应WDM层的那个函数?
我想自己写一个串口函数,应该怎么得到波特率等属性的设置信息呢?
|
|
|
沙发#
发布于:2002-07-09 17:16
SetCommState估计也是对应devicoiocontrol之类的动东,
只不过封装了一层。 |
|
|
板凳#
发布于:2002-07-10 16:58
SetCommState call devicoiocontrol(不是DDK,是SDK)
deviceIocontrol 产生一个device_io_control irp 给驱动程序 win2000是这样,win98 中使用的vxd 所以有一点点不同. |
|
地板#
发布于:2002-07-10 17:22
SetCommState call devicoiocontrol(不是DDK,是SDK) 严重赞同!!! |
|
|
地下室#
发布于:2002-07-16 18:14
可以发送IRP给LowerDevice即串口设备系统io结构支持分层,如一个核心态驱动能发送IRP给其他驱动,而且能发送给更多的驱动,这样,请求能通过多层驱动进行处理。
为阐明这种机制,请看下面关于内核态驱动如何将一个请求发送给一个串口设备,该请求要获得波特率。 首先,产生一个KlowerDevice的实例,请求将传给它。本例中为\\Device\\Serial1 (COM2). ULONG Unit = 1; KUnitizedName uname(L\"\\\\Device\\\\Serial\", Unit); pSerialPort = new (NonPagedPool) KLowerDevice((PWSTR)uname, FILE_ALL_ACCESS); if (pSerialPort && NT_SUCCESS(pSerialPort->ConstructorStatus())) 下一步,分配一个IRP并对其初始化,KIrp::Allocate的参数为IRP中栈定位的数字,该值是IRP要发送的设备的功能 注意IRP栈位置的建立应为next位置,不是当前的 SERIAL_BAUD_RATE GetBaud; // global static //------------------------------------------ KIrp I = KIrp::Allocate(pSerialPort->StackRequirement()); I.MajorFunction(NEXT) = IRP_MJ_DEVICE_CONTROL; I.MinorFunction(NEXT) = 0; I.IoctlCode(NEXT) = IOCTL_SERIAL_GET_BAUD_RATE; I.IoctlInputBufferSize(NEXT) = 0; I.IoctlOutputBufferSize(NEXT) = sizeof(SERIAL_BAUD_RATE); I.IoctlBuffer() = &GetBaud; 现在,当低级设备完成IRP时,调用例程来结束,这是必须的,以便驱动能释放IRP I.SetCompletionRoutine( DeviceIoCompleteRoutine, NULL ); 很容易将完成线程作为一个类成员,见宏MEMBER_COMPLETEIRP. 驱动然后调用低层设备,将IRP传给他(见KLowerDevice::Call). status = pSerial->Call(I); 如果线程运行在PASSIVE_LEVEL,而且你希望调用在IRP完成后再返回,那么用CallWaitComplete. 当串口设备完成了调用,系统调用完成线程,完成线程去除IRP栈,返回STATUS_MORE_PROCESSING_REQUIRED 防止系统试图处理该IRP。 NTSTATUS DeviceIoCompleteRoutine ( PDEVICE_OBJECT DeviceObject, PIRP pIrp, PVOID Context) { // the baud rate is in global GetBaud. KIrp::Deallocate(pIrp); return STATUS_MORE_PROCESSING_REQUIRED; |
|
|
5楼#
发布于:2007-03-08 14:20
上楼的,不错,要是能用DDK写出来就更好了
|
|
|