111,093
社区成员




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;
}
}