阅读:2187回复:7
内核态程序如何与串口通讯?急急急!万分感谢
我在做一个内核态组件,我接到数据后需要转发给串口(com或usb),但我不知道怎么做,还请各位多多帮忙!!!!
|
|
最新喜欢:![]()
|
沙发#
发布于:2003-01-06 17:15
用这些函数直接操作端口行不行?
READ_PORT_UCHAR WRITE_PORT_UCHAR //// READ_PORT_USHORT WRITE_PORT_USHORT 等等 |
|
|
板凳#
发布于:2003-01-06 17:16
用ZwXxxx的函数试试 ZwCreateFile,ZwReadFile :D
|
|
|
地板#
发布于:2003-01-07 09:31
1。检测系统的闲置端口。
2。把你将要使用的闲置端口报告给应用层。(因为,应用层要用它告诉用户把外部接收设备接到哪个口) 3。链接端口的driver(使用zwxxxxx函数)。 4。使用zwxxxxx函数把你接收到的数据发出去。 |
|
|
地下室#
发布于:2003-01-07 11:12
万分感谢各位的帮助,本周就会给大家结账。
大家的帮助使我解决了向串口发数据的问题,但如何接收数据呢? 在用户态下我使用waitcommevent()来等待串口设备event,当接到event后,从串口读取数据。可是在内核态,我没有找到waitcommevent()相当的函数,那怎么实现等待设备对象事件,然后读取数据这样的效果呢?这个问题我会另给分!!!! 再次万分谢谢!! |
|
|
5楼#
发布于:2003-01-07 14:59
在内核太,你要设置ISR(Interrrupte Service Routine),这样,当端口完成数据传输的时候,就会调用这个历程,然后就好办了吗!提醒你注意,终端是宝贵资源,不要执行ISR太长时间,可以用DPC(deferred procedure call),更详细信息,请看DDK.
|
|
6楼#
发布于:2003-01-08 11:04
无论收或者发都要实现你的driver和设备的协议问题。我举个例子:假设你用com口和设备通信,并且用pc端做主动。现在收数据:
1。当你的应用层准备好接收之后就通知driver你要收。 2。driver得到通知就从com口发一个数(比如说05)出去。 3。你的设备得到com来的包之后解析到数据域为05,就知道要发数据到pc(当然,这个05就是你们之间预定好的协议了)。 4。com口收到数据之后会来中断(这个中断由你的设备实现)。你的driver自然是收不到这个中断的。这个中断由com口的driver收到并处理,对你来说是透明的,所以你必须又通过应用层得到通知,但是应用层完全可以自己得到数据的,所以你这样做完全是多余的。 当然如果你要完全自主的内核态控制这一切也是可以,不过你要自己写com口的driver和你的组件绑定。如果外部设备是你自己实现的,那你自己写driver就非常自由了,232的9根引脚完全由你和设备定义使用,你也可以做成功标准协议。看你的应用需要了。 |
|
|
7楼#
发布于:2003-01-08 13:24
万分感谢大家的热心帮助,我已经试验成功了在内核态写Com口的功能,现在把代码贴在下面与大家分享:
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); PULONG pversion = (PULONG) MmGetSystemAddressForMdl(I.Mdl()); NTSTATUS status; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK iostatus; HANDLE hfile; // the output from this process UNICODE_STRING pathname; // you\'ve been given this RtlInitUnicodeString( &pathname, L\"\\\\Device\\\\Serial0\");//\\Device\\Serial0 InitializeObjectAttributes(&oa,&pathname, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwCreateFile(&hfile, GENERIC_WRITE, &oa, &iostatus, NULL, 0, FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if (NT_SUCCESS(status)) { status = ZwWriteFile(hfile, NULL, NULL, NULL, &iostatus, pversion, I.WriteSize(), NULL, NULL); } else { t << \"Failed to open com1 device \"<<EOL; } ZwClose(hfile); 这段代码就可以实现从一个驱动向Com口发数据的功能,希望对大家有用。 但现在接收数据问题还没有解决,今天上午一位网友提供了一个使用IOCTL的办法,但和上面调函数的办法相比显得就不那么适合了,请大家再帮帮我,看看有没有其他的办法? 再次谢谢大家!!!!! |
|
|