对通讯不熟悉 ,最近在写这块,用socket 遇到了点问题。
就是在接收设备端数据时,我打算用 recv函数 可是我的包长度不定,而且有的可能很长 ,还要分包才行,请问我该怎么实现。最好是一个一个字节的接收。我接收的包也有个规律 遇到02 开始接收 遇到03 证明包结束。请各位指导!!小女子感激不尽。
就是在接收设备端数据时,我打算用 recv函数 可是我的包长度不定,而且有的可能很长 ,还要分包才行,请问我该怎么实现。最好是一个一个字节的接收。我接收的包也有个规律 遇到02 开始接收 遇到03 证明包结束。请各位指导!!小女子感激不尽。
整个命令字节就是 01 ac 01 00 ff + 数据 + CRC 这样就不会错了,也不用一个一个接收,可以按一整包接收。 一般上位机和下位机都是按类似协议通讯。部分接收代码:var
leng:longword;
rbuf:array of byte;
begin leng:=Socket.ReceiveLength;
setlength(rbuf,leng);
for i:=low(rbuf) to high(rbuf) do
begin
rbuf[i]:=0
end; Socket.ReceiveBuf(rbuf[0],leng);
设备返回的数据包是有个协议的,我觉得您说的这个应该是比较贴近我的现实情况的。一整个包接收,我用recv函数可以吗,哪里不是要确定长度才行吗?能否再详细指导下,我在这块确实太菜了
我做TCP通讯一般用的是自带的ClientSocket和ServerSocket,ClientSocket里面有个OnRead事件
procedure TMainForm.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
数据接收触发。Socket.ReceiveLength是触发后获取到的数据包长度。
你说的recv我不知道是哪个里面来的。
我做TCP通讯一般用的是自带的ClientSocket和ServerSocket,ClientSocket里面有个OnRead事件
procedure TMainForm.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
数据接收触发。Socket.ReceiveLength是触发后获取到的数据包长度。
你说的recv我不知道是哪个里面来的。原来是这样,我没有用控件,直接建立的套子段
应答帧结构:
+--------+--------+------------------------------------------+
| 字段 | 字节数 | 描述 |
+--------+--------+------------------------------------------+
| 帧头 | 1 | 0x02,表明一帧的开始,为接收方提供同步 |
| 地址 | 2 | 可变信息标志地址,由可变信息标志厂家设定 |
| 帧数据 | 不定长 | |
| 帧校验 | 2 | 供接收方判断所收帧的正确性 |
| 帧尾 | 1 | 0x03,表明一帧的结束,为接收方提供同步 |
+--------+--------+------------------------------------------+