阅读:1955回复:19
怎样可以实现应用程序可以随时读取驱动中的数据?
驱动不停的写数,随时从应用程序读数。好像用变量不行。一到读数程序就重启。可是用互斥在windows程序下好像也不行。可是在DOS下就行。用共享事件也不行,不能随时读数,是驱动通知应用,而不是应用随时读取。请大哥们帮帮忙小妹,领导逼得急!!!!!
|
|
沙发#
发布于:2005-03-30 10:43
请大哥们帮帮忙小妹 真的假的??? |
|
|
驱动老牛
![]() |
板凳#
发布于:2005-03-30 12:21
驱动不停的写数,随时从应用程序读数。好像用变量不行。一到读数程序就重启。可是用互斥在windows程序下好像也不行。可是在DOS下就行。用共享事件也不行,不能随时读数,是驱动通知应用,而不是应用随时读取。请大哥们帮帮忙小妹,领导逼得急!!!!! 那是读处理的有问题呀】 |
|
地板#
发布于:2005-03-30 15:53
用共享内存.
|
|
|
地下室#
发布于:2005-03-30 16:15
用共享内存. 但要处理好同步问题 |
|
|
5楼#
发布于:2005-03-31 12:33
恩。共享内存应该可以,注意同步了。。应该就是加个自旋锁吧!
|
|
6楼#
发布于:2005-04-01 14:47
用的就是共享内存亚,用的是事件。
我的应用程序在dos下作的能正常取数。 可我现在做成windows的dll函数就不行了,和在DOs 下的流程一模一样,区别就是一个是dos下的,一个是dll,都是用的线程加同步事件,可是不知道为什么,等同步事件到来时去调用deviceiocontrol时发现打开设备的句柄便成了0xfffffff,不知道为什么做了几次都是这样的?可是在dos下却没有这个问题呀? 当然是小妹了亚!!! |
|
7楼#
发布于:2005-04-01 14:51
做了这么久的驱动,发现自己怎么真的不是做驱动的料,真不知道该做什么,不想做技术了,大家都有什么意见?
|
|
8楼#
发布于:2005-04-01 14:54
发现做驱动真的需要很深的功底,大家介绍介绍要想做一位驱动高手,该看些什么,怎么做提高的比较快?
|
|
9楼#
发布于:2005-04-01 15:49
发现做驱动真的需要很深的功底,大家介绍介绍要想做一位驱动高手,该看些什么,怎么做提高的比较快? |
|
|
10楼#
发布于:2005-04-01 16:53
用的就是共享内存亚,用的是事件。 这种情况,就得上调试器了,用softice跟踪,看那一步打开设备的句柄便成了0xfffffff.小妹做驱动,我感觉太少了,看看驱网聚会照片,和我们大学时一样,仅有一个女生,我们称为\"万金\",大家都出把力 |
|
|
11楼#
发布于:2005-04-06 14:18
各位大哥
我能在dll下创建一个线程么,可是不知道为什么在线程运行过程中,我的硬件的句柄就变成ffffff.好像被关闭了似的,可是我在程序和dll没有关闭硬件呀????好像就莫名其妙的关闭了似的。 |
|
12楼#
发布于:2005-04-06 16:15
各位大哥 当然可以了,而且创建的线程与你的进程共享句柄,把你的代码铁上来 |
|
|
13楼#
发布于:2005-04-07 14:06
我在线程创建时把硬件句柄传了过来,硬件句柄是传了过来,可是数据还是无法传到应用程序,不知道你们说的共享内存和同步,是不是和我理解的一样,我在驱动中分配的内存,然后和通过事件将地址传给dll,在dll中将程序传给应用程序。
我的应用程序和dll的代码如下,请大家帮我看看是不是我流程有问题: dll.cpp MY9054DLL_API void Set_Start(unsigned int iRate,unsigned int iCount) { m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); if(m_hEvent==NULL) { printf(\"Event not creating\"); } if (!DeviceIoControl(hDevice, P9054_IOCTL_803, &m_hEvent, sizeof(m_hEvent), NULL, 0, &nret, NULL) ) //共享事件 if (!DeviceIoControl(hDevice, P9054_IOCTL_800, &uInRate, sizeof(uInRate), NULL, 0, &nret, NULL) ) ::MessageBox(NULL,\"ok\",\"800\",MB_OK); //开始采集数据 return false; BufferSize=iCount*sizeof(LONG); if((CreateThread(NULL,0,GetPoint,(LPVOID)hDevice,0,&dwordId))==NULL) { printf(\"ERROR: CreateThread returns %0x.\", GetLastError()); } // return true; } DWORD WINAPI GetPoint(LPVOID param) { while(1) { if(::WaitForSingleObject(m_hEvent,0)==WAIT_OBJECT_0) res=DeviceIoControl(DeviceHandle, P9054_IOCTL_804, NULL, 0, &BufferData, BufferSize, &nret, NULL); Error=GetLastError(); if(res==FALSE) ::MessageBox(NULL,\"ok\",\"Res1\",MB_OK); Save_Buffer.WriteData((void *)bufferData,BufferSize); }//这是我自己定义的一个环形数据结构,将数据从dll中拷到环形数据结构 } return 0; 应用程序代码: void CMy9054DlgDlg::OnButton1() { Set_Start(uRate,uCount); SetTimer(1,50,NULL); // TODO: Add your control notification handler code here } void CMy9054DlgDlg::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case 1: Get_Data(databuffer,uCount); break; } // TODO: Add your message handler code here and/or call default CDialog::OnTimer(nIDEvent); } void CMy9054DlgDlg::OnStop() { KillTimer(1); Set_Stop(); } |
|
14楼#
发布于:2005-04-07 14:50
我在线程创建时把硬件句柄传了过来,硬件句柄是传了过来,可是数据还是无法传到应用程序,不知道你们说的共享内存和同步,是不是和我理解的一样,我在驱动中分配的内存,然后和通过事件将地址传给dll,在dll中将程序传给应用程序。 不能通过事件传地址,那个地址是核心地址空间的,用户程序不能适用,是需要映射到用户空间才能用 |
|
|
15楼#
发布于:2005-04-08 13:05
我没有用事件传地址亚,我只是在驱动和dll间共享了事件,在事件到来时,在映射地址亚,能把你认为错的地方标出来么??
谢谢!!! |
|
16楼#
发布于:2005-04-08 15:00
res=DeviceIoControl(DeviceHandle,
P9054_IOCTL_804, NULL, 0, &BufferData, BufferSize, &nret, NULL);\' 中这个DeviceHandle是哪里定义的,前面都是用的hDevice,然后如果这个是笔误的话,请检查一下驱动中对P9054_IOCTL_804的处理 |
|
|
17楼#
发布于:2005-04-11 08:51
是这样的因为硬件句柄找不到,我就让他在线程创建的时候传了过来,现在能就能得到句柄了。
|
|
18楼#
发布于:2005-04-11 09:15
是这样的因为硬件句柄找不到,我就让他在线程创建的时候传了过来,现在能就能得到句柄了。 这么说,现在问题解决了,嘿嘿 |
|
|
19楼#
发布于:2005-04-12 08:46
是呀,目前看来是,谢谢呀!!!
|
|