小弟在使用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;

解决方案 »

  1.   

    缓冲要清除啊,每次发送前清一下发送和接收的缓冲区,不是Free是clear
      

  2.   

    请教下如何clear缓冲区
    以及如何释放动态数组占用的内存?
      

  3.   

    没用SPCOMM,一直用CPORT,组件包装的功能更完整。
    比如:CPORT缓冲区是静态的,组件有2个属性可以分别设置收发缓冲区大小,还有CelarBuffer方法可以调用,方便。
    感觉spcomm只是简单对API进行了包装,许多便捷功能还有待自己进行改造