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;