procedure TForm1.MSComm1Comm(Sender: TObject);
var
  tmpVar : Variant;
begin
   if MSComm1.CommEvent = ComEvReceive then
   begin
      if mscomm1.InBufferCount = 200 then
      begin
        tmpVar := MSComm1.Input;
        mscomm1.output := tmpVar;
        sleep(10);
        CnUDP1.SendBuffer((@tmpVar), 200, false);        //如果按照这样发送,对方收到的全是00;
        CnUDP1.SendBuffer(???, Length(s), False);     //现在如何将tmpVar的数据在局域网内通过cnUDP(UDP控件)将其送到另一台计算机上
      end;
  end;
end;
附:cnUDP发送数据包的函数:   function SendBuffer(Buff: Pointer; Length: Integer; BroadCast:Boolean = False): Boolean;
         {* 发送一个数据块。如果 BroadCase 为真,执行 UDP 广播,否则发送数据到RomoteHost 的机器上的 RemotePort 端口}
       
     cnUDP接收数据包的事件:procedure TForm1.CnUDP1DataReceived(Sender: TComponent; Buffer: Pointer;Len: Integer; FromIP: String;    Port: Integer);
    

解决方案 »

  1.   

    注: 不要将串口数据变换成string再发送;
    更正:CnUDP1.SendBuffer(???,数据块长度, False); 
      

  2.   

       试试这样发送,如果这样能正确收到,那就检查你串口接受到的数据是否正确,把接收到的数据复制到一个缓冲中,然后查看缓冲中的内容。如果收不到,那就看你通讯部分。
    var
      pTmp: PChar;
      sTmp: String;
    begin
      GetMem(pTmp, 200);
      try
        // Zeromemroy
        FillChar(pTmp, 200, #0);    sTmp:= '测试';    // Copy data
        StrPCopy(pTmp, sTmp, Length(sTmp);    CnUDP1.SendBuffer(pTmp, 200, false);
      finally  
        FreeMem(pTmp);
      end;
    end;
      

  3.   

    試一下這個:var
        MyStream: TMemoryStream;
        strMessage: String; 
    Begin
        strMessage := 'TEST';
        MyStream := TMemoryStream.Create;
        
        try
           MyStream.Write(strMessage[1], Length(strMessage));
           CNUDP1.SendStream(MyStream);
        except
           on E:Exception do
           begin
             MyStream.Free;
             exit;
           end;
        end;     MyStream.Free;
    end;
      

  4.   

    可能我没说明白,我是要把tmpVar(该变量是variant类型)里的数据发送出去,通过cnUDP我可以发送string类型和stream类型数据,且都成功了。
      

  5.   

    试试,tmpvar用字符串,然后使用strplcopy,把input的数据拷贝出来。
    再进行发送
      

  6.   

    CnUDP1.SendBuffer(@tmpVar[0], 200, false);
      

  7.   

    var
      P:Pointer;
      tmpVar:Variant; 
      size:Integer;
    begin
       size:= VarArrayHighBound(tmpVar, 1) - VarArrayLowBound(tmpVar, 1) + 1;
       P := VarArrayLock(tmpVar);
       VarArrayUnlock(Value);
       CnUDP1.SendBuffer(P, size, false);
      

  8.   

    接收是字符串的话,也可以这样
    var
      tmpVar : string; 
    begin
      tmpVar := MSComm1.Input; 
      CnUDP1.SendBuffer(PChar(tmpVar), 200, false);
      

  9.   

    再次请问:如果用cnUDP接收这个数据包呢?
    procedure TForm1.CnUDP1DataReceived(Sender: TComponent; Buffer: Pointer;Len: Integer; FromIP: String;    Port: Integer); 
    varbeginend;