关于串口控件监控设备连续循环的发送的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 lsssxs
  • 开始时间 开始时间
L

lsssxs

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.CheckBox4Click(Sender: TObject);
var
sar:array[1..5] of string;//声明数组
i:integer;
begin
While CheckBox4.Checked=true do
begin
//判断是不是选择了,然后循环执行下面代码,
Application.ProcessMessages;//这样可以执行别的窗口,
//有选中的时候执行
if Button3.Caption='关闭串口' then
//判断串口是否打开
begin
sar[1]:=HexStrToStr('01 03 00 00 00 01 84 0A');
sar[2]:=HexStrToStr('01 03 00 00 00 02 84 0A');
sar[3]:=HexStrToStr('01 03 00 00 00 03 84 0A');
begin
ComPort1.ClearBuffer(true,true);
wait(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[1]);
//这个是发送一组
wait(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24) and (scr<>'') and (length(scr)>10) then
begin
edit4.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
Sleep(50)//防止cpu占用100%
end else
begin
edit4.Text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;
//==============到这里是发送1组数据================

wait(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[2]);
//这个是发送二组
wait(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24) and (scr<>'') and (length(scr)>10) then
begin
edit6.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
Sleep(50)//防止cpu占用100%
end else
begin
edit6.Text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;

//==============到这里是发送2组数据================
wait(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[3]);
//这个是发送三组
wait(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24) and (scr<>'') and (length(scr)>10) then
begin
edit5.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
Sleep(50)//防止cpu占用100%
end else
begin
edit5.Text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;

//==============到这里是发送3组数据================
end
else
ShowMessage('请先打开端口,同时确认硬件连接正常!');
end;
end;

要请教的是:现在我使用循环的方式来发送,读取是可以读取到串口发送和接收了
但是这样写的结果是cpu占用90~100%;那位兄弟指教一下,串口连续循环的发送指令出去,采用那种方法好
感谢先
 
延迟时间也许不对,你自己调整。
这样或许会好一些。
procedure delay(t:integer);
var b:integer;
begin
b:=GetTickCount;
repeat
Application.ProcessMessages;
until GetTickCount-b>=t;
end;

procedure TForm1.CheckBox4Click(Sender:TObject);
var
sar:array[1..5] of string;
i:integer;
begin
while (CheckBox4.Checked=true)and(write_read=true)do
begin
Application.ProcessMessages;
//这样可以执行别的窗口,
//有选中的时候执行
if Button3.Caption='关闭串口' then
//判断串口是否打开
begin
sar[1]:=HexStrToStr('01 03 00 00 00 01 84 0A');
sar[2]:=HexStrToStr('01 03 00 00 00 02 84 0A');
sar[3]:=HexStrToStr('01 03 00 00 00 03 84 0A');
begin
ComPort1.ClearBuffer(true,true);
delay(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[1]);
//这个是发送一组
delay(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24)and(scr<>'')and(length(scr)>10) then
begin
edit4.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
delay(50)//防止cpu占用100%
end
else
begin
edit4.text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;

delay(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[2]);
//这个是发送二组
delay(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24)and(scr<>'')and(length(scr)>10) then
begin
edit6.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
delay(50)//防止cpu占用100%
end
else
begin
edit6.text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;

delay(30);
//延期100ms 继续下面的代码,这里使用
SendString(sar[3]);
//这个是发送三组
delay(30);
//延期100ms 继续下面的代码,这里使用
if (length(scr)<24)and(scr<>'')and(length(scr)>10) then
begin
edit5.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
delay(50)//防止cpu占用100%
end
else
begin
edit5.text:='0';
memo3.lines.add('1号电源通讯不正常,或未设定----->'+formatdatetime('hh:mm:ss:ms',now));
end;
end
else
ShowMessage('请先打开端口,同时确认硬件连接正常!');
end;
end;
 
后退
顶部