监控软件和下位机之间是串口通讯,现在程序要对数个下位机单元不断轮询,召唤数据。问题如下:
   程序给定最大轮询时间t,如果监控软件在某个下位机上停留的时间超过t,则中断对此下位机的操作而操作下一个下位机单元,请问这一功能应该如何实现呢???
   我想应该用定时器实现,但是具体怎么实现呢?

解决方案 »

  1.   

    GetTickCount();
    在线程中使用看在串口没有事件的时候有多少时间浪费了然后退出线程
      

  2.   

    能说详细一点吗?
    用GetTickCount()比较时间的话,只能在操作开始或者结束时比较把,如果t时间到了,但对串口A的操作还没完成,程序如何得知并结束对A的操作开始操作B呢?
      

  3.   

    这样:
    建立线程:
    while(true)
    {
      switch(WorkFlag)
    {
       case CallData:
        下发数据函数:在下发函数中确定下发的RTU站址和命令
       case WaitData:
        检验接收数据,如果正确就WorkFlag=ProcessData;
        否则等待,如果等待tci次还是不正确,就WorkFlag=CallData;
      case ProcessData:
       处理数据;然后WorkFlag=CallData}
      Sleep(1000);
    }
    }
      

  4.   

    SetTimer执行一段采集数据的函数,在此函数中KillTime,然后再SetTimer;如此反复就可以了
      

  5.   

    应该是比较好实现的:
    while(Loop)
    {
     FUN1();//处理函数
    Sleep(1);
    }
    void  CXX::FUN1()
    {
     for (i=0;i<下位机单元的个数;i++)
      {
      FUN2();//判断是否传输正确,超时等
       }
    }
    void  cxx::fun2()
    {
       swithc(状态)//这里面加入详细的处理,包含接收的验证,超时的验证等;
       {
         case :
         
         case :     case:
        }
    }
      

  6.   

    BOOL QueryTask(HANDLE hComDev, DWORD dwMaxTime)
    {
       DWORD stTime, curTime;
       stTime = GetTickCount();
       while(TRUE)
       {
          //从串口查询数据
          ....
          curTime = GetTickCount();
          if(curTime - stTime  > dwMaxTime)
               return FALSE; //超时
          //查询完成
          break;
        }
        return TRUE;}注:hComDev 是打开串口的ID, dwMaxTime是最大超时时间(毫秒)