请教一下SPCOMM的问题(100分)

  • 主题发起人 主题发起人 cyfflying
  • 开始时间 开始时间
C

cyfflying

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SPCOMM写了一个接收软件,但经常莫名的异常终止,反复检查代码,未发现什么问题,想问一下,在接收大量信息时,SPCOMM是不是会出现问题,比如在很短的时间内接收了数条信息,会造成这种情况吗,希望各位有经验的大侠指点一下
 
function TForm1.WriteCard(sText: String): Boolean;
var
sBuffer: String;
I: Integer;
begin
sBuffer := sText;
Result := Comm1.WriteCommData(PChar(sBuffer), Length(sBuffer));
if Result then
begin
Result := False;
Rubf[1] := Byte($1b);
Rubf[2] := Byte($74);
Rubf[3] := Byte($1d);
Rubf[4] := Byte($1b);
Rubf[5] := Byte($5c);
//开始写指令
for I := 1 to 2 do
begin
if not comm1.WriteCommData(@Rubf,1) then
begin
Result := False;
break;
end;
//发送时字节间的延时
sleep(2);
end;
Comm1.WriteCommData(PChar(sBuffer), Length(sBuffer));
for I := 3 to 5 do
begin
if not comm1.WriteCommData(@Rubf,1) then
begin
Result := False;
break;
end;
sleep(2);
end;
end
else
begin
MessageBox(Handle,'写数据错误!!! ','',16);
end;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
Buf: PChar;
Vstring: String;
I,Index: Integer;
begin
GetMem(Buf,BufferLength);
try
Move(Buffer^,Buf^,BufferLength);
for I := 1 to BufferLength do
Vstring := Vstring + Buf;
if Vstring = ('rq'+#0) then
begin
MessageBox(Handle,'读数据错误!!! ','',16);
Exit;
end;
if Copy(Vstring,Length(Vstring)-1,1) = 'p' then
begin
MessageBox(Handle,'写数据错误!!! ','',16);
Exit;
end;
Index := POS('s',Vstring);
Vstring := Copy(Vstring,Index+1,Length(Vstring)-1);
Index := POS('?',Vstring);
vstring := Copy(Vstring,1,Index-1);
Edit5.Text := Vstring;

Rubf[1] := Byte($1b);
Rubf[2] := Byte($5d);
for I:= 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
break;
end;
//发送时字节间的延时
sleep(2);
end;
finally
FreeMem(Buf);
end;
end;

function TForm1.ReadData: Boolean;
var
I: Integer;
begin
for I := 0 to 32 do
begin
Rubf := 0;
end;
Rubf[1] := Byte($1b);
Rubf[2] := Byte($5d);
Result := True;
for I := 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
Result := False;
Break;
end;
//发送时字节间的延时
Sleep(2);
end;
end;

function TForm1.ResetComm: Boolean;
var
I: Integer;
begin
for I := 0 to 32 do
begin
Rubf := 0;
end;
Rubf[1] := Byte($1b);
Rubf[2] := Byte($61);
Result := True;
for I := 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
Result := False;
Break;
end;
//发送时字节间的延时
Sleep(2);
end;
end;
 
SPCOMM的实时性很差的
我做过比较的 八十六个字节一组数据 一百毫秒发一次 很快就乱了
用CPORT吧
比SPCOMM好使
 
lgxyy:这段代码
if Vstring = ('rq'+#0) then
begin
MessageBox(Handle,'读数据错误!!! ','',16);
Exit;
end;
if Copy(Vstring,Length(Vstring)-1,1) = 'p' then
begin
MessageBox(Handle,'写数据错误!!! ','',16);
Exit;
end;
如果不加这段过滤代码,程序是否就会异常终止

seagod007:你说的乱了,是不是指各条信息连在一起了,可是我现在遇到的情况是收着收着程序就异常终止了,SPCOMM在使用过程中,是不是有什么需要注意的地方,或者对这个控件在某些地方需要改进
 
缓冲区是不是太小了?
我说的乱是丢数据
你能不能把你的接收程序贴出来?
 
confirm to set correctly some poerties of spcomm,such as
TxContinueOnXoff,Inx_XonXoffFlow ,ReadIntervalTimeout,etc.
those poerties play an important roles in process.what more,
the default in-buffer of spcomm is 2048,if the data of reciving
is larger than 2048 ,OnReciveData would occur immediately.
 
后退
顶部