用indy读取不定长的数据如何操作??? ( 积分: 200 )

F

fchyed

Unregistered / Unconfirmed
GUEST, unregistred user!
目前做的是一个上位机程序,与下位机通信。下位机为客户端,上位机为服务器端。当上位机给下位机发一个命令时,会给上位机反馈一段十六进制值。出问题时下位机也会不时给上位机发送一段十六进制数据。但是下位机发送的数据段长度不固定,如何处理??

procedure TServerFrmMain.ServerExecute(AThread: TIdPeerThread);
var
ActClient, RecClient: PClient;
CommBlock, NewCommBlock: TCommBlock;
RecThread: TIdPeerThread;
i: Integer;
Msg : String;
Rebuffer : array [0..52] of byte;
const
Sendbuffer : array [0..38] of byte =(
$FF,$02, $00,$00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00,$00, $00, $00,
$00, $00, $00, $00, $00,$01,$03,$00,$00, $00, $00,
$00,$03,$03, $EF, $01,$FE);
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
AThread.Connection.WriteBuffer(sendbuffer,39);
AThread.Connection.ReadBuffer(rebuffer,52);
msg := '';
for i := 0 to 52 do msg := msg + format('%x',[rebuffer]);
Protocol.Lines.Add (msg+'/n');
end
我收到的数据都是 以 0xFF 开头 0xFE结尾的。如
0XFF 0X02 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X01 0X03 0X00 0X00 0X00 0X00 0X00 0X03 0X03 0XEF 0X01 0XFE
有的时候收到的报文长些

0XFF 0X02 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0X00 0XF0 0X00 0X12 0X34 0X56 0X00 0X00 0X07 0X04 0X0F 0X5A 0X00 0X00 0X00 0X08 0XFE


当 收到的数据长度为 52 时,这样好用。但是下位机发送的数据段长度小于52时;系统就收不到了,堵塞在那里了。
各位大侠有没有好方法,处理这个问题???
 
你可以分两部来发送,首先规定一个头数据,这个是定长的,头写法如下
type
TDataHeader = package record
DataType : Integer;
DataLength: Integer;
end;
首先填充这个头部
var
DataHeader: TDataHeader;
begin
DataHeader.DataType := 1000; //表示某个特定类型的数据
DataHeader.DataLength := 赋值你下面要传送的数据的长度
//然后发送头部,跟着发送数具体。这样就可以了
end;
 
我操,这个世界没有天理了~~~~~
 
zqw0117 这样不行,上位机发送的数据格式已经确定了。不能发你说的记录类型。就是发一串数据过来。
 
我已经解决这个问题了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
963
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
952
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部