一个简单的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.
代码如下。高手们可以帮我解释下这个问题吗?
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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货