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.