如题: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倍,高手指教

解决方案 »

  1.   

    我以前做过,但因为没有源程序,所以没办法回忆。
    记得取数据没那么简单,要用到异步和多线程。
    好像因为MSCOMM的数据过来会有快有慢,不能定时取,你不及时取它就会被后面的数据覆盖了。只记得这么多,网上有这说明。
      

  2.   

    偶一般都直接用api直接处理!不过mscomm应该不会有问题,估计是你数据处理的问题!
      

  3.   

    不能定时取
    应该放到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;