一个简单的MSComm控件做的串行通信程序,在传输字符运行时,经常出现传输数据丢失(Tmemo上显示的和输入的不一致),但是在单步运行时,传输完毕之后,在Tmemo上显示的和输入的一致...很困惑,是不是属于Delphi的一个BUG了?
代码如下。高手们可以帮我解释下这个问题吗?
unit Unit3;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;type
  TForm1 = class(TForm)
    MSComm1: TMSComm;
    Memo1: TMemo;
    ComboBox1: TComboBox;
    Label2: TLabel;
    Button3: TButton;
    Memo2: TMemo;
    Label3: TLabel;
    Label4: TLabel;
    Button2: TButton;
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    Button4: TButton;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure MSComm1Comm(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  reData:OleVariant;
  restr:string;
  senddata:array[1..10] of char;
  sendstr:string;
  i:longint;
  bn:integer;
implementationprocedure TForm1.FormCreate(Sender: TObject);
begin
  mscomm1.CommPort :=1;                    //指定端口
  mscomm1.Settings := '9600,N,8,1';        //其它参数
  mscomm1.InBufferSize := 1024;             //接收缓冲区
  mscomm1.OutBufferSize := 1024;            //发送缓冲区
  mscomm1.InputMode := comInputModetext;  //接收模式
  mscomm1.InputLen := 0;                    //一次读取所有数据
  mscomm1.SThreshold := 0;                  //一次发送所有数据
  mscomm1.InBufferCount := 0;               //清空读取缓冲区
  mscomm1.OutBufferCount := 0;              //清空发送缓冲区
  mscomm1.PortOpen:=true;                     //打开端口
  MSComm1.RThreshold :=1;               //设置接收多少字节开产生oncomm事件
end;procedure TForm1.Button3Click(Sender: TObject);
begin
MSCOMM1.PortOpen:=False;
bn:=0;
end;procedure TForm1.MSComm1Comm(Sender: TObject);
begin
  if MSCOmm1.CommEvent=2 then
begin
case bn of
1:begin
end;
2:begin
  redata:=mscomm1.Input;       //接收数据
  mscomm1.PortOpen:=false;
  memo1.Text:=redata;
  mscomm1.PortOpen:=true;
  end;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
st:string;
begin if mscomm1.PortOpen=false then mscomm1.PortOpen:=true
else begin end;
st:=memo2.Text;
mscomm1.Output:=st;
bn:=2;
end;procedure TForm1.Button4Click(Sender: TObject);
begin
 if SaveDialog1.Execute then
    Memo1.Lines.SaveToFile(saveDialog1.FileName);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
    Memo2.Lines.LoadFromFile(OpenDialog1.FileName);
    end;
end;
end.