写了一个串口操作的DLL来操作设备,导出函数,OpenDev,CloseDev,SendData,ReadData
假设设置发送数据5秒后无数据,就超时,不再读,直接返回主程序读取超时。
假设在5秒之内,有数据返回,如何主动通知,不想用死循环加标志位的方法,还有其他方法吗?
是不是可以用回调,这个地方应该如何用回调?麻烦给个简单的示例发之前是不是应该把上次接收缓冲区里的数据先清空了,以免数据不准确呢?

解决方案 »

  1.   

    timer,发出后启动,间隔5秒,到时无数据表示超时,如果有数据,停止timer,下一次发送时启动timer
      

  2.   

    通过timer控件来确定,是否有数据量,如果无就提示超时
      

  3.   

    而且这个DLL并不是操作一个设备,而是同一类的许多设备,主程序会在线程中调用,而且TIMER好像也不是线程安全的,这个方法应该比较糟糕吧,个人感觉我还没试过
      

  4.   

    而且这个DLL并不是操作一个设备,而是同一类的许多设备,主程序会在线程中调用,而且TIMER好像也不是线程安全的,这个方法应该比较糟糕吧,个人感觉我还没试过
      

  5.   

    可用 SetCommTimeouts(..., ...)设置超时,不过很麻烦,牵涉到同步异步等问题,不见得适合你的应用
      

  6.   

    发一个读命令,最多等5秒时间  tStartTime:=GetTickCount; 
      tEndTime:=GetTickCount;
      repeat
        tCount:=FComPort.InputCount; //检查串口缓冲区接收的数据长度
        if tCount >= LEN_WANT_READ then //接收到需要的长度就退出
          Break;
        //Sleep(CheckBufferInterve);
        if DelayCanInterrupt(20,APInterrupt) then //这个是可中断延时,如果不需要中断,就用SLEEP()
          Exit;
        tEndTime:=GetTickCount;
      until (tEndTime- tStartTime) > 5000;
      

  7.   

    在DLL是不是不能触发相关的事件?
      

  8.   

    const
      StartMSG = WM_User + 1000;
      ReadMSG = WM_User + 1001
      WriteMSG = WM_User + 1002;
      EndMSG = WM_User + 1003;
    使用消息来传送,当一个状态执行完毕就执行下个状态。
    你的是时间到了5秒就返回,可以做两个变量。相减后得到时间;后判断状态在发送消息。
      

  9.   

    不用timer,写一个死循环
    t1,t2: Cardinal;
    t1:=GetTickCount;
    while true do begin
      t2:=GetTickCount;
      if t2-t1 div 1000 > TimeOut then begin
        Break;
        //这样来提示,可以用一个标志位
      end;
    end;
    另外串口操作的控件一般都可以设置超时的