首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

串口操作超时怎么通知

2012-06-12 
串口操作超时如何通知?写了一个串口操作的DLL来操作设备,导出函数,OpenDev,CloseDev,SendData,ReadData假

串口操作超时如何通知?
写了一个串口操作的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; 

热点排行