蚂
蚂蚁根
Unregistered / Unconfirmed
GUEST, unregistred user!
用spcomm做一个电源监控程序,用一个timer定时发送上位机命令(‘Q1’+#13),用Comm1ReceiveData接受并分割数据,分别显示在edit里,现要求不仅要实时显示数据,还要得出显示这一段时间的最大最小值,分别存入在其他edit里,(最大最小值这里不太会写,请各位高手给出思路,最好是代码,谢谢)
部分代码如下:
全局变量:
var
Ts,Ts1: Tstringlist;
k : integer;
procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; //接受下位机数据
BufferLength: Word);
var
pStrChar;
s: string;
sp1: integer;
Ts,Ts1: Tstringlist;
step : integer;
begin
step := 0;
pStr:= Buffer;
s:= pstr;
if cbrevhex.Checked then
begin
memo1.text:=memo1.Text+StrToHexStr(pStr);
end else
begin
memo1.text := memo1.Text + pstr;
end;
if (k mod 2 = 0) then
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts[0]+'V';
edit4.text := ts[2]+'V';
edit7.text := ts[4]+'Hz';
edit13.text := COPY(ts[3],2,1)+'.'+copy(ts[3],3,1)+'%';
edit16.text := ts[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts[6])+32)+'F';
end;
end
else
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts1 := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts1[0]+'V';
edit4.text := ts1[2]+'V';
edit7.text := ts1[4]+'Hz';
edit13.text := COPY(ts1[3],2,1)+'.'+copy(ts1[3],3,1)+'%';
edit16.text := ts1[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts1[6])+32)+'F';
end;
Timer2.Enabled := True;
end;
end;
procedure TFrmMain.compare1(st1, st2: Tstringlist);
begin
edit5.text := floattostr(max(strtofloat(st1[0]),strtofloat(st2[0])));
edit6.text := floattostr(min(strtofloat(st1[0]),strtofloat(st2[0])));
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
sendstring('Q1'+#13);
inc(k);
end;
procedure TFrmMain.Timer2Timer(Sender: TObject);
begin
compare1(ts,ts1);
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
end;
问题1
这里想实现将接受数据按timer1的发送命令的奇偶次,分别存在两个TS,TS1:TSTRINGLIST里,然后进行比较,但后来发现行不通,只是每次2个进行比较,不能算是最大值
请各位高手指点一下如何作能得到历史最大值,(不用数据库)
问题2
按我上面的方法去做,编译通过,但运行时会出现错误:raised exception class estringlisterror with message 'list index out of bounds(0)'
我的Tstringlist为空,我不是设为全局变量ts,ts1了吗?为什么还是空呀?请高手教教我这个变量参数调用的问题,谢谢
部分代码如下:
全局变量:
var
Ts,Ts1: Tstringlist;
k : integer;
procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; //接受下位机数据
BufferLength: Word);
var
pStrChar;
s: string;
sp1: integer;
Ts,Ts1: Tstringlist;
step : integer;
begin
step := 0;
pStr:= Buffer;
s:= pstr;
if cbrevhex.Checked then
begin
memo1.text:=memo1.Text+StrToHexStr(pStr);
end else
begin
memo1.text := memo1.Text + pstr;
end;
if (k mod 2 = 0) then
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts[0]+'V';
edit4.text := ts[2]+'V';
edit7.text := ts[4]+'Hz';
edit13.text := COPY(ts[3],2,1)+'.'+copy(ts[3],3,1)+'%';
edit16.text := ts[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts[6])+32)+'F';
end;
end
else
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts1 := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts1[0]+'V';
edit4.text := ts1[2]+'V';
edit7.text := ts1[4]+'Hz';
edit13.text := COPY(ts1[3],2,1)+'.'+copy(ts1[3],3,1)+'%';
edit16.text := ts1[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts1[6])+32)+'F';
end;
Timer2.Enabled := True;
end;
end;
procedure TFrmMain.compare1(st1, st2: Tstringlist);
begin
edit5.text := floattostr(max(strtofloat(st1[0]),strtofloat(st2[0])));
edit6.text := floattostr(min(strtofloat(st1[0]),strtofloat(st2[0])));
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
sendstring('Q1'+#13);
inc(k);
end;
procedure TFrmMain.Timer2Timer(Sender: TObject);
begin
compare1(ts,ts1);
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
end;
问题1
这里想实现将接受数据按timer1的发送命令的奇偶次,分别存在两个TS,TS1:TSTRINGLIST里,然后进行比较,但后来发现行不通,只是每次2个进行比较,不能算是最大值
请各位高手指点一下如何作能得到历史最大值,(不用数据库)
问题2
按我上面的方法去做,编译通过,但运行时会出现错误:raised exception class estringlisterror with message 'list index out of bounds(0)'
我的Tstringlist为空,我不是设为全局变量ts,ts1了吗?为什么还是空呀?请高手教教我这个变量参数调用的问题,谢谢