我定义一个类:
type
  ttt:=record
  s1:integer;
  s2:byte;
  s3:string[10];
  s4:string[20];
  a1:double;
  a2:double;
定义一个子类  
   SSS:ttt;
   sss.s1:=12;
   sss.s2:=7;
   sss.s3:='123456';
   sss.s4:='987654321';   sss.a1:=100;
   sss.a2:=200;
comm1.WriteCommData(pchar(@sss),n);请问 我的发送的字符串的长度 n 该定义为多少啊 ,,,?

解决方案 »

  1.   

    序列化为XML,到达后反序列化......
      

  2.   

    StrMove(@test, @HeadArray, 6); 注意这个函数,以下代码是Socket读取 自定义结构 转换的。串口是也是一样的楼主自己改改吧。type
      UserInfo = record
        IP: array[0..9] of char;
        AGE: array[0..149] of char;
        Port: integer;
        cast1: array[0..49] of char;
        cast2: array[0..49] of char;
        cast3: array[0..49] of char;
        cast4: array[0..49] of char;
      end;
      tstas = record
        resulttype: byte;
        result: byte;
        resultlength: array[0..3] of byte;
      end;var
      Test: tstas;
      bbb: UserInfo;
      DataLength, TmpLength, cc: integer;
      vyte: byte;
      tmparray1: array[0..370] of byte;
      GGG: TAnalysisPackThread;
    begin
      try
        DataLength := Socket.ReceiveBuf(Pointer(nil)^, -1);
        if DataLength > 0 then Memo1.Clear;
        while DataLength > 0 do
        begin
          FillChar(tmparray1, 370, #0);
          FillChar(HeadArray, 6, #0);
          if Socket.ReceiveBuf(HeadArray, 6) <= 0 then // <= 0 then
            Break;
          StrMove(@test, @HeadArray, 6);
          Move(HeadArray, tmparray1, 6);
          Memo1.Lines.Add(inttostr(Test.resulttype));
          Memo1.Lines.Add(inttostr(Test.result));
          TmpLength := integer(test.resultlength);
          Memo1.Lines.Add(inttostr(TmpLength));
          FillChar(TmpArray, 8192, #0);
          TmpLength := Socket.ReceiveBuf(TmpArray, TmpLength + 1);
          if TmpLength <= 0 then
            Break;
          StrMove(@bbb, @TmpArray, TmpLength);
          Move(TmpArray, tmparray1[6], TmpLength);
          vyte := Crc_8n(tmparray1, TmpLength + 5);
          if vyte = tmparray1[TmpLength + 5] then rightcount := rightcount + 1
          else errorcount := errorcount + 1;
          Memo1.Lines.Add(bbb.IP);
          Memo1.Lines.Add(bbb.AGE);
          Memo1.Lines.Add(IntToStr(bbb.Port));
          Memo1.Lines.Add(bbb.cast1);
          Memo1.Lines.Add(bbb.cast2);
          Memo1.Lines.Add(bbb.cast3);
          Memo1.Lines.Add(bbb.cast4);
          DataLength := DataLength - TmpLength - 6;
          Memo1.Lines.Add('==================================================');
          Memo1.Lines.Add('==================' + inttostr(i) + '==========================');
          Memo1.Lines.Add('==================================================');
          inc(i);
        end;
      except
      end;
    end;
      

  3.   


    这是谁在瞎说?网络通讯发送结构体本来就可以,串口发送结构体可不是那么简单!
    本人历尽辛苦终于实现,是将结构写入文件,再将文件写入char数组中分块传出,虽然实现,但方法觉得不好。
    而你提供的方法根本没法用嘛!我还以为遇到一位比我水平高的串口高手,唉!
      

  4.   


    说得对哈 ,,,我刚 学 delphi 以前是C  delphi 基础都没打好,,就要用它进行系统开发,,,我也难啊 ,,,没时间补基础得。
      

  5.   

      
    我能用串口一次发送一个记录类 型的数据,,接收到的数据转换为16进制也能够现实在memo控件里,,,,但不知道 应该怎么解析这数据啊。。
      

  6.   


    用COMM1.Writecommdate(str:pchar;n:word)  可以直接发送字符串    发送结构体也可以
      

  7.   

    TmpLength := Socket.ReceiveBuf(TmpArray, TmpLength + 1);
    StrMove(@bbb, @TmpArray, TmpLength);
    就解析回来了啊
      

  8.   


    他的程序是按照定义的结构体去解析 SOCKET  收到的数据用 COMM1.Writecommdate(str:pchar;n:word) 可以直接发送字符串 发送结构体也可以,,,,但我发送结构体的时候不知道该如何解析收到的数据,,,
      

  9.   

    StrMove(@bbb, @TmpArray, TmpLength);
    bbb就是你的结构体,TmpArray是你接收的数组TmpLength 是结构体长度
      

  10.   

    用COMM1.Writecommdate(str:pchar;n:word) 可以直接发送字符串 发送结构体也可以楼主请注意你说的这句话,我深表怀疑!你QQ多少?
      

  11.   

    可以的哈 
    我发送成功  解析也成功了  QQ:568236306
    你可以试试,,用SPCOMM控件