derlupy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1187回复:8

求用回调函数实现采集卡的实现方案

楼主#
更多 发布于:2003-05-15 17:08
我要给一片七号信令采集卡写驱动。最终想做成的接口为当收到一个完整的信令包后,调用用户的回调函数。但是我不明白回调函数的功能应该在哪里实现呢?在DLL里?还是在驱动里?
如果是在DLL里实现,那么DLL访问驱动只能用ReadFile,WriteFile,DeviceIoControl,那么在DLL里就要轮询(不停从设备缓冲中读取数据,再判断是否收完一个完整的包),有没有不用轮询的方法呢?(我认为轮询的效率太低)
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-15 17:45
你要在什么操作系统下作
 :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-15 17:59
在DLL中注册一个event,将它在应用态与内核态共享,
然后在DLL中等候这个event,可用WaitSingleObject,
在驱动中遇到中断或是你认为需要调用时,就将此event置起,
DLL中就等到此事件了,然后就可调用用户的回调函数了。
derlupy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-15 19:05
我是写WDM驱动。
在驱动中打开event是不是用IoCreateNotificationEvent?
另外我觉得是不是在驱动中用IoCreateNotificationEvent建立一个event,然后在DLL中打开会更好一些呢?因为总是驱动先起来然后dll才起来,这样能够保证在dll打开event时,event总是存在的;如果在dll中注册一个event,那么在驱动中似乎只能在IRP_MJ_CREATE中打开比较合适。不知道我的想法对不对?
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-15 19:55
还是用版主说的方法比较好,通常情况下采集卡都是这样做的
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-15 20:02
我是写WDM驱动。
在驱动中打开event是不是用IoCreateNotificationEvent?
另外我觉得是不是在驱动中用IoCreateNotificationEvent建立一个event,然后在DLL中打开会更好一些呢?因为总是驱动先起来然后dll才起来,这样能够保证在dll打开event时,event总是存在的;如果在dll中注册一个event,那么在驱动中似乎只能在IRP_MJ_CREATE中打开比较合适。不知道我的想法对不对?


不是很明白你的意思,通常都是在用户空间中创建event,用read、write或deviceiocontrol传给内核空间的驱动,驱动在获得数据后将event置为信号态,这样在用户空间中程序就得到通知去读取驱动返回的数据。

看你的意思是在内核驱动中建event,在用户空间的dll中置信号态?不知道这样行不行的通,不过你可以试试
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-05-15 20:20
也可以在driver创建有名字的event,dll用这个名字open之。
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-15 20:38
也可以在driver创建有名字的event,dll用这个名字open之。
 


是吗?偶明天回去试试
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
derlupy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-15 22:01
谢谢大家在百忙中抽出时间回答偶的问题!
等我先试一下,有了结果后就给大家分! hehe
 
游客

返回顶部