刚刚开始学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.

解决方案 »

  1.   

    那估计你这是有应答的,点击button是不是向上位机发送数据了,上位机得到信息后,再向你发数据
      

  2.   

    检查你的Bufferlength大小是否与你的单片机发送数据长度一致
      

  3.   

    点击button后的确发数据了,我想做一个不发送,只接收的,把发送部分去掉后就出现了内存错误,这是什么原因呢,spcomm的收和发有关联吗?
      

  4.   

    rbuf,sbuf:array[1..6] of byte;  //可能设置的缓冲太小,导致内存溢出//去掉sleep,不需要等待,是中断方式工作的
    sleep(100);//等待100ms,保证接收到所有数据
      

  5.   

    是2楼所说的问题,我把Bufferlength改为实际发送数据后能收到数据了,但开机后首先收到FF,导致顺序错误,这是什么原因呢?