小弟在使用spccom,一直出现程序过几个小时就无顾退出,而串口通讯部分的功能不执行,则没有此现象。如事件记录如下:错误应用程序 myplc.exe,版本 0.0.0.0,错误模块 kernel32.dll,版本 5.2.3790.3959,错误地址 0x0000bee7。怀疑是否有内在泄露问题,请教一下,串口的buffer区,是否要free。再进入下次发送和接收,或应当如何更好处理。我的代码如下:
function Tform1.senddata():Integer;
var
i: integer;
commflg: boolean;begin
viewstring := '';
commflg := true;
for i := 1 to 8 do begin
if not Comm1.WriteCommData(@sbuf[i], 1) then
begin
commflg := false;
break;
end;
sleep(2);
viewstring := viewstring + inttohex(sbuf[i], 2); end; result:=1;
if not commflg then
result:=0;
if N8.Checked then statusbar1.Panels[0].Text:='发送:'+viewstring;
//memo1.Lines.Add('send:'+viewstring);
Delay(2000);
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);var
i: integer;
begin
viewstring:='';
move(buffer^, pchar(@rbuf)^, bufferlength);
for i := 1 to bufferlength do
viewstring := viewstring+inttohex(rbuf[i],2);
gotdevid:=rbuf[1]; //接收到的设备编码,默认取第一个数据内容,即前二个字节
gotregid:=sbuf[4];//读到的寄存器地址 ,直接取第4位
statusbar1.Panels[2].Text:='收到数据:'+viewstring+',校验'+booltostr(mycrc.iscrcright(viewstring))+'设备地址:'+inttostr(gotdevid)+',寄存器:'+inttostr(gotregid)+',插入数据:'+inttostr(processdata(viewstring))+'条';
// memo1.Lines.Add('收到数据:'+viewstring+',校验'+booltostr(mycrc.iscrcright(viewstring))+'设备地址:'+inttostr(gotdevid)+',寄存器:'+inttostr(gotregid));
end;
procedure TForm1.Timer1Timer(Sender: TObject); //定时发送,往sbuf数组放数据
begin
sbuf[1] := byte($01);
sbuf[2] := byte($03);
sbuf[3] := byte($00);
sbuf[4] := byte($03);
sbuf[5] := byte($00);
sbuf[6] := byte($01);
sbuf[7] := byte($74);
sbuf[8] := byte($0A);
senddata; sbuf[1] := byte($01);
sbuf[2] := byte($03);
sbuf[3] := byte($00);
sbuf[4] := byte($04);
sbuf[5] := byte($00);
sbuf[6] := byte($01);
sbuf[7] := byte($C5);
sbuf[8] := byte($CB);
senddata;end;
function Tform1.senddata():Integer;
var
i: integer;
commflg: boolean;begin
viewstring := '';
commflg := true;
for i := 1 to 8 do begin
if not Comm1.WriteCommData(@sbuf[i], 1) then
begin
commflg := false;
break;
end;
sleep(2);
viewstring := viewstring + inttohex(sbuf[i], 2); end; result:=1;
if not commflg then
result:=0;
if N8.Checked then statusbar1.Panels[0].Text:='发送:'+viewstring;
//memo1.Lines.Add('send:'+viewstring);
Delay(2000);
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);var
i: integer;
begin
viewstring:='';
move(buffer^, pchar(@rbuf)^, bufferlength);
for i := 1 to bufferlength do
viewstring := viewstring+inttohex(rbuf[i],2);
gotdevid:=rbuf[1]; //接收到的设备编码,默认取第一个数据内容,即前二个字节
gotregid:=sbuf[4];//读到的寄存器地址 ,直接取第4位
statusbar1.Panels[2].Text:='收到数据:'+viewstring+',校验'+booltostr(mycrc.iscrcright(viewstring))+'设备地址:'+inttostr(gotdevid)+',寄存器:'+inttostr(gotregid)+',插入数据:'+inttostr(processdata(viewstring))+'条';
// memo1.Lines.Add('收到数据:'+viewstring+',校验'+booltostr(mycrc.iscrcright(viewstring))+'设备地址:'+inttostr(gotdevid)+',寄存器:'+inttostr(gotregid));
end;
procedure TForm1.Timer1Timer(Sender: TObject); //定时发送,往sbuf数组放数据
begin
sbuf[1] := byte($01);
sbuf[2] := byte($03);
sbuf[3] := byte($00);
sbuf[4] := byte($03);
sbuf[5] := byte($00);
sbuf[6] := byte($01);
sbuf[7] := byte($74);
sbuf[8] := byte($0A);
senddata; sbuf[1] := byte($01);
sbuf[2] := byte($03);
sbuf[3] := byte($00);
sbuf[4] := byte($04);
sbuf[5] := byte($00);
sbuf[6] := byte($01);
sbuf[7] := byte($C5);
sbuf[8] := byte($CB);
senddata;end;
以及如何释放动态数组占用的内存?
比如:CPORT缓冲区是静态的,组件有2个属性可以分别设置收发缓冲区大小,还有CelarBuffer方法可以调用,方便。
感觉spcomm只是简单对API进行了包装,许多便捷功能还有待自己进行改造