本文整理汇总了C#中Gurux.DLMS.GXDLMSSettings.CheckFrame方法的典型用法代码示例。如果您正苦于以下问题:C# GXDLMSSettings.CheckFrame方法的具体用法?C# GXDLMSSettings.CheckFrame怎么用?C# GXDLMSSettings.CheckFrame使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Gurux.DLMS.GXDLMSSettings
的用法示例。
在下文中一共展示了GXDLMSSettings.CheckFrame方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetHdlcData
static byte GetHdlcData(bool server, GXDLMSSettings settings, GXByteBuffer reply, GXReplyData data)
{
short ch;
int pos, packetStartID = reply.Position, frameLen = 0;
int crc, crcRead;
// If whole frame is not received yet.
if (reply.Size - reply.Position < 9)
{
data.IsComplete = false;
return 0;
}
data.IsComplete = true;
// Find start of HDLC frame.
for (pos = reply.Position; pos < reply.Size; ++pos)
{
ch = reply.GetUInt8();
if (ch == GXCommon.HDLCFrameStartEnd)
{
packetStartID = pos;
break;
}
}
// Not a HDLC frame.
// Sometimes meters can send some strange data between DLMS frames.
if (reply.Position == reply.Size)
{
data.IsComplete = false;
// Not enough data to parse;
return 0;
}
byte frame = reply.GetUInt8();
if ((frame & 0xF0) != 0xA0)
{
//If same strage data.
return GetHdlcData(server, settings, reply, data);
}
// Check frame length.
if ((frame & 0x7) != 0)
{
frameLen = ((frame & 0x7) << 8);
}
ch = reply.GetUInt8();
// If not enough data.
frameLen += ch;
if (reply.Size - reply.Position + 1 < frameLen)
{
data.IsComplete = false;
reply.Position = packetStartID;
// Not enough data to parse;
return 0;
}
int eopPos = frameLen + packetStartID + 1;
ch = reply.GetUInt8(eopPos);
if (ch != GXCommon.HDLCFrameStartEnd)
{
throw new GXDLMSException("Invalid data format.");
}
// Check addresses.
if (!CheckHdlcAddress(server, settings, reply, eopPos))
{
//If echo,
reply.Position = 1 + eopPos;
return GetHdlcData(server, settings, reply, data);
}
// Is there more data available.
if ((frame & 0x8) != 0)
{
data.MoreData = (RequestTypes)(data.MoreData | RequestTypes.Frame);
}
else
{
data.MoreData = (RequestTypes)(data.MoreData & ~RequestTypes.Frame);
}
// Get frame type.
frame = reply.GetUInt8();
if (data.Xml == null && !settings.CheckFrame(frame))
{
reply.Position = (eopPos + 1);
return GetHdlcData(server, settings, reply, data);
}
// Check that header CRC is correct.
crc = GXFCS16.CountFCS16(reply.Data, packetStartID + 1, reply.Position - packetStartID - 1);
crcRead = reply.GetUInt16();
if (crc != crcRead)
{
throw new Exception("Wrong CRC.");
}
// Check that packet CRC match only if there is a data part.
if (reply.Position != packetStartID + frameLen + 1)
{
crc = GXFCS16.CountFCS16(reply.Data, packetStartID + 1,
frameLen - 2);
crcRead = reply.GetUInt16(packetStartID + frameLen - 1);
if (crc != crcRead)
{
throw new Exception("Wrong CRC.");
}
// Remove CRC and EOP from packet length.
//.........这里部分代码省略.........