6610|11

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WaitForSingleObject在驱动中定时的问题? [复制链接]

写了一个驱动,要在收到协议的第一个字节后,开始启动超时定时器,如果超时就复位接受缓存。
不懂在驱动中该如何使用定时器,就学着用WaitForSingleObject()实现,但是在使用中如何能实现“收到第一个字节启动,收到最后一个停止”???

实现过程如下:

  1. //创建接收超时触发事件
  2. g_OverTimeEvtSignal = CreateEvent(NULL, FALSE, FALSE, OverTimeEvent);

  3. g_hOverTimeThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)xxx_MonitorThread, 0, 0,&g_dwOverTimeThreadID);
  4. if (g_hOverTimeThread == NULL)
  5. {
  6.     RETAILMSG(1, (TEXT("xxxxxxxxx : failed to create xxx_MonitorThread\r\n")));
  7. }
复制代码


线程实现部分

  1. DWORD xxx_MonitorThread(PVOID pParms)
  2. {
  3.     DWORD         dwResult;

  4.     while (1)
  5.     {
  6.         dwResult = WaitForSingleObject(g_OverTimeEvtSignal, 500);
  7.         if(WAIT_OBJECT_0 == dwResult)
  8.         {
  9.             RETAILMSG(1, (TEXT("xxx receive ok!!!\n\n")));
  10.         }
  11.         else if(WAIT_TIMEOUT == dwResult)
  12.         {   
  13.             REV_ENABLE      = true;    // 协议开始接收控制标志
  14.              START_REV_DATA  = false;   // 协议开始接收控制标志

  15.             RETAILMSG(1, (TEXT("xxx receive OVERTIME!!!\n\n")));

  16.         }
  17.     }
  18. }
复制代码


协议解析控制部分


  1. CardRecIntCount = 100;  //假设协议总长度为100字节

  2. if ((uData == 0xAA) && (START_REV_DATA == false)) //协议头为0xAA,开始
  3. {
  4.     *pRxBuffer++ = uData;  //获取字节
  5.     START_REV_DATA = true;
  6.                                                                                                
  7.     dwRoomLeft--;
  8.     dwBytesStored++;
  9.     [color=#FF0000]
  10. ResetEvent(g_OverTimeEvtSignal);  //复位超时等待线程  ?????是在这里复位吗?
  11. [/color]
  12. }
  13. else
  14. {
  15.     if (START_REV_DATA && REV_ENABLE)
  16.     {
  17.         *pRxBuffer++ = uData;
  18.         
  19.         // 协议上一个判断处理
  20.                                                                
  21.         dwRoomLeft--;
  22.         dwBytesStored++;

  23.         REV_ENABLE = false;

  24.     }
  25.     else
  26.     {
  27.         if (CardRecIntCount > 0)
  28.         {
  29.             *pRxBuffer++ = uData;
  30.                                                
  31.             dwRoomLeft--;
  32.             dwBytesStored++;

  33.             CardRecIntCount--;
  34.         }
  35.         if (CardRecIntCount == 0)   //接受完毕
  36.         {
  37.             REV_ENABLE      = true;   //复位
  38.             START_REV_DATA  = false;
  39.             CardRecIntCount = -1;

  40.             dwRoomLeft    = 0;
  41.             dwNumRxInFifo = 0;

  42.            CardRecIntCount = 100;

  43.             [color=#FF0000]
  44. //在这里如何停止超时定时器呢??????????????
  45. [/color]

  46.             break;
  47.         }
  48.     }
  49. }
复制代码


问题:
线程一创建,就开始启动超时功能,如何能在协议启动后再启动超时功能,而接收完协议就暂停超时功能?????

最新回复

自己参考背光驱动解决 结贴  详情 回复 发表于 2010-3-11 11:52
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不用关闭,你可以把这个thread当作一个定时计数器来用。比如100ms就加一次。nCount++
这样你在接收到第一个数据就将nCount=0清零。 当每次接收的时候就判断nCount是否>5。
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果这个超时要求不严格的话可以直接用线程的WaitForSingleObject指定等待多少时间或者Sleep来做,如果时间要求严格的话就要用硬件定时器来做了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
在解析完协议后,我想停止WaitForSingleObject(),等再次开始接收时启动,这怎么控制呀?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
WaitForSingleObject()里面用定时器
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 veabol 的回复:
如果这个超时要求不严格的话可以直接用线程的WaitForSingleObject指定等待多少时间或者Sleep来做,如果时间要求严格的话就要用硬件定时器来做了
学习,学习…
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
再加一个waitforsingleobject等待第一个字节时的事件
引用 3 楼 y2dg4lf 的回复:
在解析完协议后,我想停止WaitForSingleObject(),等再次开始接收时启动,这怎么控制呀?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
收到第一个字节启动,收到最后一个停止
我有几个疑问了。
LZ的字节数是否是一个定值?100个?
如果不确定如何判断最后一个字节?
如果用定时器来做的话一但定时器到但是数据没传送完成如何处理?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
我在那里看到过说,不要用WaitForSingleObject来定时。要用gettickcount
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

10
 
在驱动层使用定时器还是用硬件定时器比较好。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
MARK 、 、 、 、 、
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
自己参考背光驱动解决
结贴
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表