写了一个串口操作的DLL来操作设备,导出函数,OpenDev,CloseDev,SendData,ReadData
假设设置发送数据5秒后无数据,就超时,不再读,直接返回主程序读取超时。
假设在5秒之内,有数据返回,如何主动通知,不想用死循环加标志位的方法,还有其他方法吗?
是不是可以用回调,这个地方应该如何用回调?麻烦给个简单的示例发之前是不是应该把上次接收缓冲区里的数据先清空了,以免数据不准确呢?
假设设置发送数据5秒后无数据,就超时,不再读,直接返回主程序读取超时。
假设在5秒之内,有数据返回,如何主动通知,不想用死循环加标志位的方法,还有其他方法吗?
是不是可以用回调,这个地方应该如何用回调?麻烦给个简单的示例发之前是不是应该把上次接收缓冲区里的数据先清空了,以免数据不准确呢?
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;
StartMSG = WM_User + 1000;
ReadMSG = WM_User + 1001
WriteMSG = WM_User + 1002;
EndMSG = WM_User + 1003;
使用消息来传送,当一个状态执行完毕就执行下个状态。
你的是时间到了5秒就返回,可以做两个变量。相减后得到时间;后判断状态在发送消息。
t1,t2: Cardinal;
t1:=GetTickCount;
while true do begin
t2:=GetTickCount;
if t2-t1 div 1000 > TimeOut then begin
Break;
//这样来提示,可以用一个标志位
end;
end;
另外串口操作的控件一般都可以设置超时的