delphi xe UDP16进制通讯

1、在窗口上添加TIdUDPClient和TIdUDPServer控件,mome控件

2、在use里添加IdGlobal引用

3、在窗口的启动代码里加上:

    self.IdUDPServer1.Bindings.Clear;
     self.IdUDPServer1.Bindings.Add.IP:= '0.0.0.0';//绑定IP
     self.IdUDPServer1.Bindings.Add.Port:=strtoint(edit_re_port.Text);//绑定端口
     self.IdUDPServer1.Active:=true;
     memo1.Lines.Add('server is running');

4、添加一个转换函数

function HexStrToByte(HesStr: String): Byte;
var
  iLen: Integer;
begin
  Result := 0;
  iLen := length(HesStr);
  if iLen <> 2 then Exit;
  If not (HesStr[1] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F',
   'a', 'b', 'c', 'd', 'e', 'f']) Then Exit;
  If not (HesStr[2] in ['0'..'9', 'A', 'B', 'C', 'D', 'E', 'F',
   'a', 'b', 'c', 'd', 'e', 'f']) Then Exit;
   Result := StrToInt('$' + HesStr);
end;

把字符串转换为二进制Byte

5、在发送代码里加上代码:

var
 s,s1,s2:string;
 data_send,re_buf:TIdBytes;
 I,n,num,i1:integer;
begin
   

   s:=ling;
   n:=length(s) div 2;
   setlength(re_buf,255);
   setlength(data_send,n);
   for I := 1 to n do
   begin
      s1:=copy(s,i*2-1,2);
      data_send[I-1]:=HexStrToByte(s1);
   end;
     try
        IdUDPClient1.Active:=false;
        IdUDPClient1.Host:=plc_ip[lu_sn];
        IdUDPClient1.Port:=strtoint(lu_port[lu_sn]);
        IdUDPClient1.ReceiveTimeout:=100;
        if tem_Udp.Active=false then IdUDPClient1.Active:=true;
        IdUDPClient1.Connect;
        IdUDPClient1.SendBuffer(data_send);
         Result:='';   //用于阻塞式接收
         for i:=0 to num-1 do
           Result:=Result+ByteToHex(re_buf[i]);//用于阻塞式接收  如果采用这个,就不需要TIdUDPServer
        IdUDPClient1.Disconnect;
        IdUDPClient1.Active:=false;
     except
     on E:exception do
       begin 

              Result:='';       
            IdUDPClient1.Disconnect;
          IdUDPClient1.Active:=false;
       end;

     end;

end;

6、如果不用阻塞式接收,则在TIdUDPServer的onUDPread事件里加上代码:

var
     num,i:integer;
     s,str:string;
 begin
   // Memo1.Lines.Add(BytesToString(AData)); //把接收的信息加到Memo1
   num:= Length(AData);
     s:='';
         for i:=0 to num-1 do
           s:=s+ByteToHex(AData[i]);
    Memo1.Lines.Add(s);

end;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值