原代码如下:
unit uComm;interfaceuses SPComm;var
gComm: TComm;
bufRece, bufSend: array[0..255] of Byte;// 就是想给gComm.OnReceiveData事件赋值的函数定义
procedure DoReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);function ComOpen(AComName: string; ABaudRate: LongInt): LongInt; stdcall;implementation// 就是想给gComm.OnReceiveData事件赋值的函数内容
procedure DoReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
Move(Buffer^, bufRece, BufferLength);
end;function ComOpen(AComName: string; ABaudRate: LongInt): LongInt;
begin
if gComm <> nil then
begin
gComm.StopComm;
gComm.Free;
end;
gComm := TComm.Create(nil);
gComm.CommName := 'COM3';
gComm.BaudRate := 115200;
gComm.OnReceiveData := DoReceiveData;
gComm.StartComm; Result := 1;
end;在调用“gComm.OnReceiveData := DoReceiveData;”时程序出错了,
我根据以往的记忆,应该是这个DoReceiveData函数定义不对的。请高手告诉问题如何解决?
谢谢!
unit uComm;interfaceuses SPComm;var
gComm: TComm;
bufRece, bufSend: array[0..255] of Byte;// 就是想给gComm.OnReceiveData事件赋值的函数定义
procedure DoReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);function ComOpen(AComName: string; ABaudRate: LongInt): LongInt; stdcall;implementation// 就是想给gComm.OnReceiveData事件赋值的函数内容
procedure DoReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
Move(Buffer^, bufRece, BufferLength);
end;function ComOpen(AComName: string; ABaudRate: LongInt): LongInt;
begin
if gComm <> nil then
begin
gComm.StopComm;
gComm.Free;
end;
gComm := TComm.Create(nil);
gComm.CommName := 'COM3';
gComm.BaudRate := 115200;
gComm.OnReceiveData := DoReceiveData;
gComm.StartComm; Result := 1;
end;在调用“gComm.OnReceiveData := DoReceiveData;”时程序出错了,
我根据以往的记忆,应该是这个DoReceiveData函数定义不对的。请高手告诉问题如何解决?
谢谢!
解决方案 »
- 求delphi的格式验证函数
- 大哥哥,大姐姐,Winform程序里输入的10进制数字转化成16进制后再变成中文如何显示到LED上面去?
- stringgrid
- 如何在D2007中安装ReportBuilder啊?~
- class function 或class procedure 是什么意思?
- Bitter_fish(苦鱼) 领分
- 如果把DBEdit2中的字符留住????
- 求救 delphi+SQL server问题
- 自定义的消息ID不能太大???
- 在Delphi中,怎么让Label 中的字体显示的比较圆润,不出现锯齿状!
- 请教delphi中的type自定义类型在什么地方定义,我怎么找不到
- Delphi 像亡国的南宋,试问这语言还有前途吗?
这个要定义在对象里吧,或者这样:
Type
TMyRece = procedure DoReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word) of Tobject
Type
TMyRece = procedure(Sender: TObject; Buffer: Pointer; BufferLength: Word) of Object;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMyEventClass = class
class procedure BtnClickEvent(Sender:TObject);
end;type
TForm1 = class(TForm)
btn1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure MyBtnClick(Sender:TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.MyBtnClick(Sender: TObject);
begin
ShowMessage('Hello');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
btn1.OnClick:=MyBtnClick;
btn1.OnClick:=TMyEventClass.BtnClickEvent;
end;{ TMyEventClass }class procedure TMyEventClass.BtnClickEvent(Sender: TObject);
begin
ShowMessage('Click the Button!');
end;end.
继续跟踪,谢谢!
1:
刚开始我使用动态调用动态库的函数,后来查看网络文档介绍说:动态调用DLL例程在用到时才被调入,用完后就被卸载,大大减少了系统资源的占用,我怀疑因为DLL例程在用完后就被卸载,所以没有等到SPComm的还回数据,于是我改为使用静态调用动态库的方式,SPComm的OnReceiveData事件,还是没有触发。
2:
上面的过程我都有使用串口的监视程序来查看串口发送和接受的情况,发送的时候数据完全正确,没有接受到数据,还有我发送数据3次后,虽然程序还继续发送数据,但是串口的监视程序也没有查到发送数据了,更不要说收到数据。很是奇怪,在线等候。
上面的程序都是在串口连接设备的情况下测试的,如果我直接使用串口测试工具将正确的数据发送出去,马上能收到设备还回的信息,而且我也直接写了一个SPComm程序(没有使用动态库的)简单测试,结果也完全正确的收到设备还回的数据。补充说明,还是动态库的程序有问题的。
另外,换CPORT这个串口控件试试
TCOM_Base = class(TObject)
private
FCOM: string; //串口名
FBaudRate: Cardinal; //波特率
FCOMM:TComm;
。
protected
public
constructor Create;
destructor Destroy; override;
。
function OpenCOMM:Boolean; //打开串口
function CloseCOMM:Boolean; //关闭串口
。
published
。
property OnReceiveData:TReceiveData read FReceiveData write FReceiveData;
end;
另外,调用Dll时,也碰到一些问题,同样的程序,使用静态调用可以的程序,改用动态调用就不可以了,手头没有这方面的资料,所以也不想再深究了。谢谢大家的参与。