我用delphi写了一个程序,功能都完成了,编译好了刚开始运行也很正常,但一但向串口发送数据或者收到数据时,程序就会报内存错误,内存地址"0000"不能为"write",郁闷!哪位大侠有经验愿意指教,100分全送.不想以后用DELPHI还老是出现这种情况啊!

解决方案 »

  1.   

    procedure TForm8.Button1Click(Sender: TObject);
    var
    k1,a1,a2,a3:integer;
    Sg1,Sg2,Sg3:string;
    begin
     Sg1:=form8.Edit1.Text;
     k1:=length(Sg1);
      Sg3:='';
     for a1:=1 to k1 do
     begin
       Sg2:=copy(Sg1,a1,1);
       Sg3:=Sg3+inttohex(ord(Sg2[1]),2);
     end; S_FA:='415444'+Sg3+'0D0A';
      form4.sendData(S_FA);
       All_status:=5;end; S_FA:全局的string All_status:全局的integer   sendData一个公共窗口的发送函数
    procedure  TForm4.sendData(const DataBuf:string);
    var
    str:string;
    i,lend,chang:integer;
    begin
    chang:=1;
    str:='';
         if length(DataBuf)=0 then exit;
         lend:=length(DataBuf);
         lend:=lend div 2;
         for i:=0 to lend-1 do
          begin      try
          str:=char(strtoint('$'+copy(DataBuf,chang,2)));  //str:=str+char(strtoint('$'+copy(DataBuf,chang,2)))
            IF F_8=true then
            begin
              form8.Memo1.Text:=form8.Memo1.Text+copy(DataBuf,chang,2);
            end;      except
          end;
             form1.Comm1.WriteCommData(pchar(str),length(str));
           chang:=chang+2;
         end;    //DataBuf:=nil;
    end;
      

  2.   

    这是接收函数procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
     k,Len_S:integer;
    SSS_1:string;
    begin
    lenbuffer:=BufferLength;
    SetLength(S,lenbuffer);
    SetLength(S_Buf_R,lenbuffer);
    S:=Buffer; For k := 0 To lenbuffer-1 do
     begin
        S_Buf_R[k]:= inttohex(S[k],2);
        SSS:=SSS+chr(strtoint('$'+S_Buf_R[k]));
        S_Buf:=S_Buf+S_Buf_R[k];
     end;
        if S_Buf_R[lenbuffer-1]='0A' then
        begin
          Pan_B:=true;
        end;
      if Pan_B=true then
      begin  //部分数据处理代码
      end;
      Len_S:=Length(S_Buf); SSS_1:=show_s(S_Buf,Len_S);//form1.Timer1.Enabled:=true;
       SSS:='';
       S_Buf:='';
    end;
      

  3.   

    var
    str,temp:string;
    begin
       str:='';
       temp:=databuf;
         if length(DataBuf)=0 then exit;
         //-------------------得到发送的内容;
         while temp<>'' do
           begin
             str:=str+char(strtoint('$'+copy(DataBuf,chang,2));
             temp:=copy(temp,3,length(temp)-2);
           end;
         IF F_8 then
            begin
              form8.Memo1.Text:=str;
            end;
            //----发送数据;
           form1.Comm1.WriteCommData(pchar(str),length(str));
    end;
    //--------发送数据的函数可以改成这样;
      

  4.   

    接收数据可以这样:
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      s:string;
    begin
      setlength(s,length(buffer));
      move(pchar(buffer)^,s[1],bufferlength);
     .......
      //这里你自己再处理;
    end;
      

  5.   

    谢谢(红辣椒),发关好象可以,但收到数据时还是会报内存错误,不知道是不是我的show_s数据处理的函数有问题
      

  6.   

    setlength(s,length(buffer));另外,这一句通不过编译啊,length(buffer),报参数类型不符
      

  7.   

    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
      var
         s:string;
      begin
         setlength(s,bufferlength);//----
         move(buffer,s[1],bufferlength);//----接收数据
         //---或是move(pchar(buffer),pchar(s[1])^,bufferlength);
         if ord(s[bufferlength])=$0A then
             Pan_B:=true
         else
              Pan_B:=false;
         if pan_b then
          begin       //部分数据处理代码
          end;end;
      

  8.   

    怎么没人了,zsjzwj(北极熊),dinglinger(红辣椒),来关注一下吧!各位高手都来关注一下吧!
    我顶!