如题:Delphi调用Mscomm的问题,我在delphi中调用了Mscomm,接收到数据后转化为curent输出,但是他在有时就将数据扩大了10倍,如何解决,在线等,我的代码如下:procedure TForm1.Timer1Timer(Sender: TObject);
var buf:string;
le:integer;
summ:currency ;
begin
If MSComm1.InBufferCount>0 Then
begin
buf := buf+MSComm1.Input ;
If pos( '+',buf )>0 Then
begin
le:= pos('=',buf)-9 ;
buf:=copy(buf,le,9);
buf:=copy(buf,3,1)+copy(buf,4,1)+ copy(buf,5,1)+copy(buf,6,1)+copy(buf,7,1)+copy(buf,8,1);
try
summ:=strtocurr(buf);
Edit1.Text:=currtostr(summ);
except
Edit1.Text:=buf;
exit;
end;
exit ;
End ;
End ;
end ;
end;
edit1。text输出值经常会比实际值大10倍,高手指教
var buf:string;
le:integer;
summ:currency ;
begin
If MSComm1.InBufferCount>0 Then
begin
buf := buf+MSComm1.Input ;
If pos( '+',buf )>0 Then
begin
le:= pos('=',buf)-9 ;
buf:=copy(buf,le,9);
buf:=copy(buf,3,1)+copy(buf,4,1)+ copy(buf,5,1)+copy(buf,6,1)+copy(buf,7,1)+copy(buf,8,1);
try
summ:=strtocurr(buf);
Edit1.Text:=currtostr(summ);
except
Edit1.Text:=buf;
exit;
end;
exit ;
End ;
End ;
end ;
end;
edit1。text输出值经常会比实际值大10倍,高手指教
记得取数据没那么简单,要用到异步和多线程。
好像因为MSCOMM的数据过来会有快有慢,不能定时取,你不及时取它就会被后面的数据覆盖了。只记得这么多,网上有这说明。
应该放到mscomm的读入缓存事件中,建议看看这方面的书,很多的。
老早以前写的与单片机通讯的程序代码,你参考一下吧
//处理控件的该事件,获取底层交换的数据和连线的状态procedure TMainForm.MSCommComm(Sender: TObject);
var
i, InputLen: Integer;
tmpInt: Integer;
tmpvar: Variant;
InputString: string;
begin goonsendadd := false;
ShapeReceive.Brush.Color := clred;
try
if MSComm.CommEvent = ComEvReceive then
begin
InputLen := MSComm.InBufferCount;
/////////////////
//接收二进制数据,转换为十六进制显示
if HexShow then
begin
tmpvar := MSComm.Input;
InputString := '';
for i := 0 to InputLen - 1 do
begin
tmpInt := tmpvar[i];
InputString := InputString + ' ' + LowerCase(IntToHex(tmpInt, 2));
end;
end
else
begin //直接接收字符
InputString := MSComm.Input;
if pos('N', InputString) > 0 then
begin
InputString := copy(InputString, 1, pos('N', InputString)) + '^^' + nowstr + '^^' + floattostr(timeDalayr) + '^^Z' + #13 + copy(InputString, pos('N', InputString), length(InputString) - pos('N', InputString));
end;
end;
mmReceive.Text := mmReceive.Text + InputString; goonsendadd := true; end
//显示CD线的状态
else if MSComm.CommEvent = ComEvCD then
begin
if MSComm.CDHolding then
shpCD.Brush.Color := clRed
else
shpCD.Brush.Color := clWhite;
end
//显示CTS线的状态
else if MSComm.CommEvent = ComEvCTS then
begin
if MSComm.CTSHolding then
shpCTS.Brush.Color := clRed
else
shpCTS.Brush.Color := clWhite;
end
//显示DSR线的状态
else if MSComm.CommEvent = ComEvDSR then
begin
if MSComm.DSRHolding then
shpDSR.Brush.Color := clRed
else
shpDSR.Brush.Color := clWhite;
end;
ShapeReceive.Brush.Style := bsClear;
except
self.logs_re.Lines.add(InputString);
end;
end;