首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi用spcomm兑现串口通信,数据能发送到串口调试工具,但是不能接受它们发过来的数据

2013-04-07 
delphi用spcomm实现串口通信,数据能发送到串口调试工具,但是不能接受它们发过来的数据。学习Delphi中,用的

delphi用spcomm实现串口通信,数据能发送到串口调试工具,但是不能接受它们发过来的数据。
学习Delphi中,用的是网上的SPCOMM的例子,因为只有一台笔记本,所以用串口调试工具调试收发。发送数据没问题,但是无法接收数据。
我从网上下了一个SPCOMM实现的小程序,那个就可以和串口调试工具收发,我自己按照他的代码写就不行。求大神帮忙,小弟初学,这问题折腾了一晚上了。

unit Mainfrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SPComm, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Comm1: TComm;
    mmocomm: TMemo;
    btnOpen: TButton;
    btnSend: TButton;
    btnClose: TButton;
    edtSendText: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edtCommName: TEdit;
    edtBaudRate: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    cmbByteSize: TComboBox;
    cmbStopBits: TComboBox;
    mmo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
    procedure comm1ReciveData(Sender:TObject;Buffer:Pointer;BufferLength:Word);
    procedure edtBaudRateExit(sender:TObject);
    procedure cmbByteSizeChange(sender:tobject);
    procedure cmbStopBitsChange(sender:TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  edtCommName.Text := 'COM2';
  edtBaudRate.Text := '9600';
  //cmbByteSize.ItemIndex := 1;
  //cmbStopBits.ItemIndex :=0;
  btnSend.Enabled := False;
  btnClose.Enabled := False;
  end;


procedure TForm1.btnOpenClick(Sender: TObject); //打开串口
begin
  Comm1.BaudRate := StrToInt(edtBaudRate.Text);
  Comm1.CommName := edtCommName.Text;
  Comm1.ByteSize := TByteSize(cmbByteSize.ItemIndex);
  Comm1.StopBits := TStopBits(cmbStopBits.ItemIndex);
  try
    Comm1.StartComm;
    except
      raise  Exception.Create('打开串口错误');
      end;
  StatusBar1.Panels[0].Text := Comm1.CommName + '以打开';
  StatusBar1.Refresh ;
  //btnOpen.Enabled := False ;
  btnOpen.Enabled := False;
  btnSend.Enabled := True ;
  btnClose.Enabled := True ;

end;


procedure TForm1.btnCloseClick(Sender: TObject);//关闭串口
begin
  Comm1.StopComm;
  btnOpen.Enabled := True;



  StatusBar1.Panels[0].Text :=Comm1.CommName + 'close';
  StatusBar1.Refresh ;
end;

procedure TForm1.btnSendClick(Sender: TObject); //发送数据
var
    str: PChar;
    count : Integer;
begin
  str := PChar(edtSendText.Text);
  count := Length(str);
  if Comm1.WriteCommData(str,count)then
    mmocomm.Lines.Add('已发送'+inttostr(count)+'个字符')
    else
    raise Exception.Create('发送错误');

end;

//接收数据,貌似不会触发onrecivedata事件
procedure TForm1.comm1ReciveData(Sender:TObject;Buffer:Pointer;BufferLength:Word); 
var
  pstr:PChar;
begin
  pstr :=Buffer;
  mmo2.Lines.Add(pstr);
end;


procedure TForm1.edtBaudRateExit(sender:TObject);
var
  i : Integer;
begin
  try
    i := strToInt(edtBaudRate.Text);
  except
    edtBaudRate.SetFocus;// 焦点,光标定位于波特率输入框
    raise Exception.Create('波特率设置错误');
  end;
  //改变波特率
  Comm1.BaudRate := StrToInt(edtBaudRate.Text);
end;
//改变数据位
procedure TForm1.cmbByteSizeChange(sender:tobject);
begin
  Comm1.ByteSize := tbytesize(cmbByteSize.ItemIndex);
end;
//改变停止位
procedure TForm1.cmbStopBitsChange(sender:tobject);
begin
  Comm1.StopBits := TStopBits(cmbStopBits.ItemIndex);
end;




end.


delphi spcomm 串口
[解决办法]
还是我上边发的图,你转到Events页面,鼠标双击OnreceiveData事件,看看指向对不对?

不对的话重新指向一下这个事件就行了

热点排行