一般用重发方法可靠点procedure TFluxThread.Execute; var i:Integer; begin FreeOnTerminate:=True; while not Terminated do begin WaitForSingleObject(AcqFluxEvent,INFINITE); for i := 0 to CommRW_Repeat-1 do begin try if FFluxControl.AcquiteFluxData then begin PostMessage(FHandle,WM_UPDATE_FLUX,FLAG_WM_FLUX,0); Break; end; except on E:ECommException do begin FFluxControl.StartWork; Sleep(DefaultCmdIntervalII); if i = CommRW_Repeat-1 then PostMessage(FHandle,WM_ERROR_COMM,FLAG_WM_FLUX,E.Code); end; end; end; Sleep(CommFluxReal_Delay);
procedure TForm1.Timer1Timer(Sender: TObject); begin n4click(self); if(caxun_event.WaitFor(1000)=wrtimeout) then begin if(listview1.Items.Item[sr].equipment_type='交流柜配电箱') then listview1.Items.Item[sr].ImageIndex:=2 else if(listview1.Items.Item[sr].equipment_type='56路交直流电源头柜') then listview1.Items.Item[sr].ImageIndex:=5 else if(listview1.Items.Item[sr].equipment_type='64路双路交流电源柜') then listview1.Items.Item[sr].ImageIndex:=11 else if(listview1.Items.Item[sr].equipment_type='100路电源头柜') then listview1.Items.Item[sr].ImageIndex:=8; statusbar1.Panels[0].Text:=listview1.Items.Item[sr].Caption+'查询失败'; sr:=sr+1; if(sr>listview1.Items.Count-1) then sr:=0; end else begin statusbar1.Panels[0].Text:=listview1.Items.Item[sr].Caption+'查询成功'; sr:=sr+1; if(sr>listview1.Items.Count-1) then sr:=0; caxun_event.ResetEvent;//收到正确数据后,caxun_event.setEvent end; //form1.ListView1.Items.Item[sr].Selected:=true; //form1.StatusBar1.Panels[3].Text:=inttostr(sr); end; 大家帮我看一下,这段代码有什么不对,明明设置sr:=0,但论询时第一个扫瞄的是第二个站点,第一个站点要轮询完,第二遍才扫瞄到
var
i:Integer;
begin
FreeOnTerminate:=True; while not Terminated do
begin
WaitForSingleObject(AcqFluxEvent,INFINITE); for i := 0 to CommRW_Repeat-1 do
begin
try
if FFluxControl.AcquiteFluxData then
begin
PostMessage(FHandle,WM_UPDATE_FLUX,FLAG_WM_FLUX,0);
Break;
end; except
on E:ECommException do
begin
FFluxControl.StartWork;
Sleep(DefaultCmdIntervalII);
if i = CommRW_Repeat-1 then
PostMessage(FHandle,WM_ERROR_COMM,FLAG_WM_FLUX,E.Code);
end;
end;
end;
Sleep(CommFluxReal_Delay);
end;
end;CommRW_Repeat //重发次数
FFluxControl.AcquiteFluxData //这个函数包含了送命令和读串口返回数据的处理
其伪代码:
发命令;
延时;
读串口;
begin
n4click(self);
if(caxun_event.WaitFor(1000)=wrtimeout) then
begin
if(listview1.Items.Item[sr].equipment_type='交流柜配电箱') then listview1.Items.Item[sr].ImageIndex:=2
else if(listview1.Items.Item[sr].equipment_type='56路交直流电源头柜') then listview1.Items.Item[sr].ImageIndex:=5
else if(listview1.Items.Item[sr].equipment_type='64路双路交流电源柜') then listview1.Items.Item[sr].ImageIndex:=11
else if(listview1.Items.Item[sr].equipment_type='100路电源头柜') then listview1.Items.Item[sr].ImageIndex:=8;
statusbar1.Panels[0].Text:=listview1.Items.Item[sr].Caption+'查询失败';
sr:=sr+1;
if(sr>listview1.Items.Count-1) then sr:=0;
end
else
begin
statusbar1.Panels[0].Text:=listview1.Items.Item[sr].Caption+'查询成功';
sr:=sr+1;
if(sr>listview1.Items.Count-1) then sr:=0;
caxun_event.ResetEvent;//收到正确数据后,caxun_event.setEvent
end;
//form1.ListView1.Items.Item[sr].Selected:=true;
//form1.StatusBar1.Panels[3].Text:=inttostr(sr);
end;
大家帮我看一下,这段代码有什么不对,明明设置sr:=0,但论询时第一个扫瞄的是第二个站点,第一个站点要轮询完,第二遍才扫瞄到
是发送过程代码