关于SPCOMM编程(50分)

  • 主题发起人 主题发起人 whfxp
  • 开始时间 开始时间
W

whfxp

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是永远接受数据,边接受边解释,人为发送数据,我以前用MSCOMM32,
但有许可证问题,现想用SPCOMM,但对SPCOMM不了解。
不知SPCOMM有没有接受缓冲和发送,有,在那设置?
接受事件怎么出触发,因为永远有数据发来,我做了一个实验,每次接到的数据不一样,
是不是有数据后,到一定时间触发?
比如,我要求接到一个字符触发一次。
有没有象MSCOMM32一样的CH=MSCOMM。INPUT的东西


请高手指点一下。
 
你自己包装一个上层协议,每次收到数据时,自己做按字符分割的工作,然后,
每分割出一个字符,触发一个自定义的事件,程序运行时用代码给该事件分配
一个响应函数,在该函数中处理即可。可以写一个类来完成。
 
SPCOMM是根据时间来触发的,有一个参数可设置,叫作ReadIntervalTimeout,
此值设置太大时会出现缓冲区溢出的问题,而设置太小时又会对程序的效率有一点影响,
你可根据测试情况来决定此值的大小
 
给你一个例子单元
unit main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SPComm, ComCtrls, StdCtrls,IniFiles,Registry;

type
TFrmMain = class(TForm)
Comm1: TComm;
Button1: TButton;
MemoMSG: TMemo;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);

procedure SendData;
procedure Control(ykcode:byte);
procedure InitComm;

procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ReceiveBuffer:array [0..64] of byte;
SendBuffer:array [0..64] of byte;
SendBufferLength:integer;
end;

var
FrmMain: TFrmMain;

implementation

{$R *.DFM}

procedure TFrmMain.InitComm ;
begin
comm1.StopComm;
Comm1.startcomm;
end;

procedure TFrmMain.Control(ykcode:byte);
begin
SendBuffer[0]:=$aa; SendBuffer[1]:=$07;
SendBuffer[2]:=strtoint(edit1.text)-1;
SendBuffer[3]:=strtoint(edit1.text)-1;
SendBuffer[4]:=ykcode;
SendBuffer[5]:=not(SendBuffer[0]+SendBuffer[1]+
SendBuffer[2]+SendBuffer[3]+
SendBuffer[3]);
SendBufferLength:=6;
SendData;
end;
procedure TFrmMain.SendData;
var
viewstring:string;
i:integer;
begin
comm1.WritecommData(pchar(@SendBuffer),SendBufferLength);
for i:=0 to SendBufferLength-1 do
viewstring:=viewstring+inttohex(SendBuffer,2)+' ';
viewstring:='发送:'+viewstring;
MemoMSG.Lines.Add(viewstring);
MemoMSG.Lines.Add(' ');
end;

procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
viewstring:string;
i:integer;
begin
Move(Buffer^,pchar(@ReceiveBuffer)^, bufferlength);

for i:=0 to bufferlength-1 do
begin
viewstring:=viewstring+inttohex(ReceiveBuffer,2)+' ';
end;
viewstring:='接收:'+viewstring;
MemoMSG.Lines.Add(viewstring);
MemoMSG.Lines.Add('');
if memoMSG.Lines.Count >500 then
memoMSG.Clear ;
viewstring:='';
MemoMSG.Invalidate;
End;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
InitComm ;
end;

procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;//关闭窗体时,将comm1控件关闭。
end;

procedure TFrmMain.Button1Click(Sender: TObject);
begin
control($ff);
end;

procedure TFrmMain.Button3Click(Sender: TObject);
begin
control($00);
end;

procedure TFrmMain.Button2Click(Sender: TObject);
begin
control($ab);
end;

end.
 
SPCOMM的接受缓冲是设置死的,在源代码里,如果要更改的话,
改过代码再装一次。
接受事件是自动触发的,当有数据发送来,到该数据发送结束
就会触发一次。不可能是一个字符触发一次,dos下才可以用中断实现。
 
后退
顶部