这个必须要将数据进行缓存,因为一次来的数据可能并不是你所期望的一帧数据,可能多,也可能少,同时可能由于某种原因,一帧数据没有完,后一帧的数据又来了,会导致数据错乱,所以也要确定一帧数据到达的时间,超过了时间就丢弃。
var msg = Encoding.Default.GetString(this.buf.ToArray()); //2.完整性判断
while (msg.Length > BeginOfLine.Length + EndOfLine.Length)//至少要包含头(2字节)+长度(1字节)+校验(1字节)
{
if (msg.IndexOf(BeginOfLine) == 0)
{
if (msg.IndexOf(EndOfLine) > 0)
{
this.Raw = new byte[msg.IndexOf(EndOfLine) - BeginOfLine.Length + 1];
this.buf.CopyTo(BeginOfLine.Length, this.Raw, 0, msg.IndexOf(EndOfLine) - BeginOfLine.Length);
this.buf.RemoveRange(0, msg.IndexOf(EndOfLine) + EndOfLine.Length); if (this.buf.Count > 0)
{
msg = Encoding.Default.GetString(this.buf.ToArray());
}
else msg = "";
this.OnGetNew(this.Raw);
}
else
{
break;
}
}
else
{
//这里是很重要的,如果数据开始不是头,则删除数据
int index = msg.IndexOf(BeginOfLine);
if (index > 0)
{
this.buf.RemoveRange(0, index);
msg = msg.Substring(index,msg.Length- index);
}
else
{
if(this.buf.Count>0)this.buf.RemoveAt(0);
msg = "";
}
}