串口操作超时如何通知?
写了一个串口操作的DLL来操作设备,导出函数,OpenDev,CloseDev,SendData,ReadData
假设设置发送数据5秒后无数据,就超时,不再读,直接返回主程序读取超时。
假设在5秒之内,有数据返回,如何主动通知,不想用死循环加标志位的方法,还有其他方法吗?
是不是可以用回调,这个地方应该如何用回调?麻烦给个简单的示例
发之前是不是应该把上次接收缓冲区里的数据先清空了,以免数据不准确呢?
[解决办法]
timer,发出后启动,间隔5秒,到时无数据表示超时,如果有数据,停止timer,下一次发送时启动timer
[解决办法]
通过timer控件来确定,是否有数据量,如果无就提示超时
[解决办法]
可用 SetCommTimeouts(..., ...)设置超时,不过很麻烦,牵涉到同步异步等问题,不见得适合你的应用
[解决办法]
发一个读命令,最多等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;
[解决办法]
const
StartMSG = WM_User + 1000;
ReadMSG = WM_User + 1001
WriteMSG = WM_User + 1002;
EndMSG = WM_User + 1003;
使用消息来传送,当一个状态执行完毕就执行下个状态。
你的是时间到了5秒就返回,可以做两个变量。相减后得到时间;后判断状态在发送消息。
[解决办法]
timer 即可
[解决办法]
不用timer,写一个死循环
- Delphi(Pascal) code
t1,t2: Cardinal;t1:=GetTickCount;while true do begin t2:=GetTickCount; if t2-t1 div 1000 > TimeOut then begin Break; //这样来提示,可以用一个标志位 end;end;