代码如下:
//转换并存储数据
procedure TForm5.Button3Click(Sender: TObject);
var
k,x,i:integer;
jj:integer;
begin
max1:=-9999.0; max2:=-9999.0; max3:=-9999.0;
s1:=0.0; s2:=0.0;s3:=0.0;s4:=0.0;s5:=0.0;s6:=0.0;
s7:=0.0; s8:=0.0;s9:=0.0;s10:=0.0;s11:=0.0;s12:=0.0;
memo1.Clear;memo2.Clear;memo3.clear;memo4.Clear;
memo5.Clear;memo6.Clear;memo7.clear;memo8.Clear;
memo9.Clear;memo10.Clear;memo11.clear;memo12.Clear;
memo13.Clear;
jj:=0;
{for k:=0 to count-1 do
begin
b[k]:=a[k];
end;}
for k:=0 to (count div 2)-1 do
begin
b[k]:=(a[jj]+256*a[jj+1]);
jj:=jj+2;
if b[k]<$8000 then
begin
b[k]:=b[k]/32768;
end
else
begin
b[k]:=(b[k]-65536)/32678;
end;
end;
//显示输入电压曲线
if xuanze=1 then
begin
Fastlineseries1.Clear;Fastlineseries1.Clear;Fastlineseries1.Clear;
i:=0; x:=0;
while(i<3072) do
begin
//Series1.Addxy(x*0.2,b[i],'',clred);
Fastlineseries1.AddXY(x*0.2,b[i],'',clred);
//Series2.Addxy(x*0.2,b[i+1],'',clgreen);
Fastlineseries2.Addxy(x*0.2,b[i+1],'',clgreen);
//Series3.Addxy(x*0.2,b[i+2],'',clblue);
Fastlineseries3.Addxy(x*0.2,b[i+2],'',clblue);
i:=i+3;
x:=x+1;
end;
i:=0;
while(i<3072) do
begin
s1:=s1+b[i];
if max1<b[i] then
begin
max1:=b[i];
end;
memo1.Lines.Add(floattostr(b[i]));
memo1.lines.savetofile('A相输入电压.txt');
i:=i+3;
end;
m1:=max1;
v1:=max1/1.414;
a1:=s1/1024;
ComboBox2Change(Sender);
i:=1;
while(i<6144) do
begin
s2:=s2+b[i];
if max2<b[i] then
begin
max2:=b[i];
end;
memo2.Lines.Add(floattostr(b[i]));
memo2.lines.savetofile('B相输入电压.txt');
i:=i+3;
end;
m2:=max2;
v2:=max2/1.414;
a2:=s2/1024;
ComboBox3Change(Sender);
i:=2;
while(i<3072) do
begin
s3:=s3+b[i];
if max3<b[i] then
begin
max3:=b[i];
end;
memo3.Lines.Add(floattostr(b[i]));
memo3.lines.savetofile('C相输入电压.txt');
i:=i+3;
end;
m3:=max3;
v3:=max3/1.414;
a3:=s3/1024;
ComboBox4Change(Sender);
end;
//显示转速曲线
if xuanze=3 then
begin
Series13.Clear;
for i:=0 to 1023 do
begin
memo13.Lines.Add(floattostr(b[i]));
memo13.lines.savetofile('转速.txt');
end;
drawClick(Sender);
end;
end;
//处理控件中的该事件,获取底层交换数据和连线状态
procedure TForm5.MSComm1Comm(Sender: TObject);
var
i,inputlen,tmpint:integer;
tmpvar:variant;
begin
if mscomm1.CommEvent=comevreceive then
begin
delay(100);
inputlen:=mscomm1.InBufferCount;
tmpvar:=mscomm1.Input;
count:=count+inputlen;
for i:=0 to inputlen-1 do
begin
tmpint:=tmpvar[i];
index:=i+j;
a[index]:=tmpint;
end;
j:=index+1;
end;
end;
//显示转速
procedure TForm5.Button4Click(Sender: TObject);
begin
command:=3;
Button2Click(Sender);
delay(100);
Button3Click(Sender);
end;
//启动数据刷新
procedure TForm5.BitBtn15Click(Sender: TObject);
begin
if timer20.Enabled=true then
begin
timer20.Enabled:=false;
BitBtn15.Caption:='启动刷新';
end
else begin
command:=2;
timer20.Enabled:=true;
BitBtn15.Caption:='停止刷新';
end;
end;
//定时器定时刷新数据
procedure TForm5.Timer20Timer(Sender: TObject);
begin
if command=1 then
begin
BitBtn2Click(Sender);
end
else
if command=2 then
begin
BitBtn5Click(Sender);
end
else
if command=3 then
begin
Button4Click(Sender);
end
else
if command=4 then
begin
BitBtn8Click(Sender);
end
else
if command=5 then
begin
BitBtn11Click(Sender);
end
else
begin
exit;
end;
end;
8 个解决方案
#1
建一个线程专门显示图像~~
#2
是不是刷的太快,比如有数据回来慢的时候
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试
//定时器定时刷新数据
procedure TForm5.Timer20Timer(Sender: TObject);
begin
timer20.Enabled := False ;// 先设置timer不可用
try // 加个try异常捕获,防止下面的过程出错
if command=1 then
begin
BitBtn2Click(Sender);
end
else
if command=2 then
begin
BitBtn5Click(Sender);
end
else
if command=3 then
begin
Button4Click(Sender);
end
else
if command=4 then
begin
BitBtn8Click(Sender);
end
else
if command=5 then
begin
BitBtn11Click(Sender);
end
else
begin
exit;
end;
finally // finally
timer20.enabled := true; //定时器重新设置为可用
end; // try的end
end;
#3
你把定时器只使用一次 数据是否能刷出来 如过可以刷出来要多久?
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?
另外检查下你下面几个函数:
ComboBox2Change(Sender);
ComboBox4Change(Sender);
drawClick(Sender);
建议你加一个线程专门显示图像
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?
另外检查下你下面几个函数:
ComboBox2Change(Sender);
ComboBox4Change(Sender);
drawClick(Sender);
建议你加一个线程专门显示图像
#4
定时器这个东东最好是不用,起码是少用。多用多线程。
#5
定时器启动线程 处理
#6
最好启用线程处理!
#7
线程处理,不见得一定好.
#8
我是想在已有的基础上改,越简单越好
#1
建一个线程专门显示图像~~
#2
是不是刷的太快,比如有数据回来慢的时候
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试
//定时器定时刷新数据
procedure TForm5.Timer20Timer(Sender: TObject);
begin
timer20.Enabled := False ;// 先设置timer不可用
try // 加个try异常捕获,防止下面的过程出错
if command=1 then
begin
BitBtn2Click(Sender);
end
else
if command=2 then
begin
BitBtn5Click(Sender);
end
else
if command=3 then
begin
Button4Click(Sender);
end
else
if command=4 then
begin
BitBtn8Click(Sender);
end
else
if command=5 then
begin
BitBtn11Click(Sender);
end
else
begin
exit;
end;
finally // finally
timer20.enabled := true; //定时器重新设置为可用
end; // try的end
end;
#3
你把定时器只使用一次 数据是否能刷出来 如过可以刷出来要多久?
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?
另外检查下你下面几个函数:
ComboBox2Change(Sender);
ComboBox4Change(Sender);
drawClick(Sender);
建议你加一个线程专门显示图像
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?
另外检查下你下面几个函数:
ComboBox2Change(Sender);
ComboBox4Change(Sender);
drawClick(Sender);
建议你加一个线程专门显示图像
#4
定时器这个东东最好是不用,起码是少用。多用多线程。
#5
定时器启动线程 处理
#6
最好启用线程处理!
#7
线程处理,不见得一定好.
#8
我是想在已有的基础上改,越简单越好