阅读:2433回复:11
在驱动程序中直接操作串口,如何设置串口的参数?
我已经使用ZwCreateFile成功打开串口,使用哪个函数设置串口码速率、奇偶校验等参数?谢谢各位大虾
|
|
沙发#
发布于:2004-06-21 10:00
SetCommState 有一个DCB(设备控制块)参数,里面有速率、奇偶校验
|
|
|
板凳#
发布于:2004-06-22 09:26
SetCommState函数能在核心模式调用吗?好象不能!
|
|
地板#
发布于:2004-06-22 09:47
另外还有一个疑问:我在DPC里调用ZwWriteFile函数,老是返回失败。我看了一下DDK的帮助,说必须在PASSIVE_LEVEL级调用ZwWriteFile,我把它放到了DispatchWrite里试了一下,果然成功。但我就是想在收到一个中断后,把一些数据立即发到串口,因为实时性要求很高,所以才做在驱动里,在响应中断后,我如何才能合法的进入PASSIVE_LEVEL级呢?
|
|
地下室#
发布于:2004-06-28 09:48
可以在内核创建一个线程,在用信号量或者事件同步,好象帮助里有这个说明。
|
|
|
5楼#
发布于:2004-06-28 10:05
对使用系统线程来处理,这需要进行事件等的同步就好了。
你的什么系统要求这么高的实时性?好象你是将别的硬件的数据输入到串口的?你是否考虑使用硬件解决方案呢?这样可能能更好的提供实时性要求。 |
|
|
6楼#
发布于:2004-06-29 21:37
谢谢各位,优先级的问题我已经解决了,和各位想的一样,使用线程解决的。
不过设置码速率的问题解决的还不理想,我先在上层应用程序中设置好码速率,然后关闭串口,然后再控制驱动程序打开串口,这时就会以刚才的参数打开串口。我希望能够直接在驱动程序中设置,不知哪位大侠有高招!??? |
|
7楼#
发布于:2004-07-02 18:09
顶一下
|
|
8楼#
发布于:2004-07-07 15:35
构建irp然后传递下去就可以了。
|
|
9楼#
发布于:2004-07-13 20:43
构建irp然后传递下去就可以了。 好象比比较复杂,有例子吗? |
|
10楼#
发布于:2007-02-26 11:05
我也遇到同样的问题,但是写串口应该直接创建发送irp即可, 读串口该如何解决?郁闷?
这样的资料太少了,请大虾指点。 |
|
|
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); } ![]() 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. 请给个提示,到底是如何引起的.等待中.......... |
|
|