刚刚开始学Delphi,想做串口通信,上位机采用Delphi做了一个简单的测试程序,下位机是单片机。通信过程中发现如果pc端先发送,然后接收没问题,如果PC只收不发就会发生内存错误,而且为什么点击Button时才会显示收到的数据呢,程序中是直接将缓冲区的数据放到listbox中的啊?代码如下,请指教!!急!!unit pc_receive;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
Button1: TButton;
Label1: TLabel;
Comm1: TComm;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
procedure senddata;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;
implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
begin
//Comm1.Inx_XonXoffFlow := False;
//Comm1.Outx_XonXoffFlow := False;
comm1.StartComm;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
//自定义发送数据过程
procedure TForm1.senddata;
var
//i:integer;
commflg:boolean;
begin
//viewstring:='';
commflg:=true;
//for i:=1 to 6 do
//begin
if not form1.comm1.writecommdata(@sbuf[1],1) then
begin
commflg:=false;
//break;
end;
sleep(2);
//end;
form1.Edit1.text:='信号已发送';
if not commflg then messagedlg('发送失败 !',mterror,[mbyes],0);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($f0);
senddata;//调用发送函数
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:integer;
begin
setLength(viewstring,BufferLength);
viewstring:='';
sleep(100);//等待100ms,保证接收到所有数据
move(buffer^,rbuf,bufferlength);
for i:=1 to 6 do
viewstring:=viewstring+inttohex(rbuf[i],2)+'';
ListBox1.items.add(viewstring);
end;
end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
Button1: TButton;
Label1: TLabel;
Comm1: TComm;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
procedure senddata;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;
implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
begin
//Comm1.Inx_XonXoffFlow := False;
//Comm1.Outx_XonXoffFlow := False;
comm1.StartComm;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
//自定义发送数据过程
procedure TForm1.senddata;
var
//i:integer;
commflg:boolean;
begin
//viewstring:='';
commflg:=true;
//for i:=1 to 6 do
//begin
if not form1.comm1.writecommdata(@sbuf[1],1) then
begin
commflg:=false;
//break;
end;
sleep(2);
//end;
form1.Edit1.text:='信号已发送';
if not commflg then messagedlg('发送失败 !',mterror,[mbyes],0);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($f0);
senddata;//调用发送函数
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:integer;
begin
setLength(viewstring,BufferLength);
viewstring:='';
sleep(100);//等待100ms,保证接收到所有数据
move(buffer^,rbuf,bufferlength);
for i:=1 to 6 do
viewstring:=viewstring+inttohex(rbuf[i],2)+'';
ListBox1.items.add(viewstring);
end;
end.
解决方案 »
- 如何在Form中增加事件?
- 关于listview多选的问题
- 如何在SpinEdit中嵌入时间,改变的值是时间?在线等待!
- delphi初学者的简单问题,对高人而言极其简单吧应该
- PrintDBGridEh 打印加分
- 关于如何从多条记录中取数据
- 散分明天早上揭帖
- 帮帮我好吗?我需要你们的帮助!关于Excel的问题!
- http://www.csdn.net/expert/topic/504/504416.shtm 这个地址我一进,浏览器就没有回应了,这是我提的一人问题啊,大家帮忙看看,这是什么回事,不是我的问题,进其它问题一切正常。
- delphi 6 能完好的编译delphi 1.0 写的代码吗?
- 关于DELPHI中TStringList的问题。
- delphi编译软件找不到ppWWRichEd.dcu是怎么回事啊?
sleep(100);//等待100ms,保证接收到所有数据