c# supersocket 自定义协议 错误处理 粘包处理

bianchao1 bianchao1 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教一个问题。
我使用FixedHeaderReceiveFilter(头部格式固定并且包含内容长度的协议)时
如果硬件设备发送的信息 不符合我自定义协议格式,会导致后面正确数据无法解析。

正确协议格式 如下

0c 03 02 ff ff 94 35
地址 命令 长度 数据(2) CRC(2)

头部为3个字节,DTUReceiveFilter() : base(3),根据头部3个字节中最后一个字节“长度”获取头部后面的数据内容和CRC

如果设备发来了错误格式信息 aa (只有一个字节),过了一会又发来了格式正确的信息,
那么就会变成 aa 0c 03 02 ff ff 94 35

后面数据的解析会一直受影响
请问怎么解决。

硬件设备使用的modbus rtu协议,接收数据时,
会根据时间间隔(3.5个字符的静止时间,大概几毫秒吧)区分每条信息的起始。
超过3.5个字符的静止时间后,会认为是下一条新信息。

下面贴一下代码

public class DTUReceiveFilter : FixedHeaderReceiveFilter<DTURequestInfo>
{
public DTUReceiveFilter()
: base(4)
{

}

/// <summary>
/// 获取数据域和结尾字节长度
/// </summary>
/// <param name="header"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
/// <returns></returns>
protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
{
//length为头部(包含1字节的length数据长度)长度

int len = (int)header[offset + length - 1];//length只有一个字节
return len + 2;//结尾有2个字节CRC
}

/// <summary>
/// 实现帧内容解析
/// </summary>
/// <param name="header"></param>
/// <param name="bodyBuffer"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
/// <returns></returns>
protected override DTURequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
{
DTURequestInfo res = new DTURequestInfo();

string entireFrame = CRC.BytesToHexStr(header.Array) + CRC.BytesToHexStr(bodyBuffer.CloneRange(offset, length));
res.EntireFrame = entireFrame;
res.DTUDeviceID = entireFrame.Substring(0, 2);
res.TerminalDeviceAddress = entireFrame.Substring(2, 2);
res.ControlCode = entireFrame.Substring(4, 2);
res.Length = entireFrame.Substring(6, 2);
int dataLen = int.Parse(CRC.HEXtoDEC(CRC.ReverseHexString(res.Length)));
res.DataContent = entireFrame.Substring(8, dataLen * 2);
res.CRC = entireFrame.Substring(8 + dataLen * 2, 4);
return res;
}

}

...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部
bianchao1
C# 111,129 成员 642,539 内容