`
帧结构
private List<byte> bufferZone = new List<byte>(10000);
public void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (null == _port || !_port.IsOpen || isClosing)
{
return;
}
int n = _port.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
_port.Read(buf, 0, n);//读取缓存数据;
bufferZone.AddRange(buf);
for (int i = 0; i < bufferZone.Count; i++)
{
int rcyByte = bufferZone[i];
//Console.WriteLine("接收到的字节" + rcyByte.ToString("X2"));
_sb.Append(rcyByte.ToString("X2") + " ");
switch (_dataState)
{
case FrameDataRecvState.HEAD_FRIST:
_framByteList.Clear();
if (rcyByte == GlobalData.HEAD_FRIST)
{
// Console.WriteLine("收到帧头的第一个字节: ");
_dataState = FrameDataRecvState.HEAD_SECOND;
}
break;
case FrameDataRecvState.HEAD_SECOND:
if (rcyByte == GlobalData.HEAD_SECOND)
{
// Console.WriteLine("收到帧头的第二个字节: ");
_dataState = FrameDataRecvState.HEAD_THIRD;
}
else
{
_dataState = FrameDataRecvState.HEAD_FRIST;
}
break;
case FrameDataRecvState.HEAD_THIRD:
if (rcyByte == GlobalData.HEAD_THIRD)
{
//Console.WriteLine("收到帧头的第三个字节: ");
_dataState = FrameDataRecvState.FRAM_LENGTH;
}
else
{
_dataState = FrameDataRecvState.HEAD_FRIST;
}
break;
case FrameDataRecvState.FRAM_LENGTH:
// 判断帧长
_framDataLength = rcyByte & 0x3f;
if (_framDataLength > 61)
{
//帧长不符合协议规范
_dataState = FrameDataRecvState.HEAD_FRIST;
//Console.WriteLine("帧长大于最大值: 帧长为==========" + _framDataLength);
}
else
{
// Console.WriteLine("收到帧长数据: " + _framDataLength);
//帧长符合协议规范
_framByteList.Add(Convert.ToByte(rcyByte));
_dataState = FrameDataRecvState.FRAM_ID;
}
break;
case FrameDataRecvState.FRAM_ID:
// 判断是否正确的帧ID
if (_framIdHashSet.Contains(rcyByte))
{
// Console.WriteLine("是正确的帧ID: ");
// 是正确的帧ID
_dataState = FrameDataRecvState.FRAM_DATA;
_framByteList.Add(Convert.ToByte(rcyByte));
}
else
{
// Console.WriteLine("帧ID错误: " + rcyByte);
_dataState = FrameDataRecvState.HEAD_FRIST;
_framByteList.Clear();
}
break;
case FrameDataRecvState.FRAM_DATA:
// 接收数据,对数据进行校验,校验通过,进行数据解析
// 校验不通过,清空解析数据缓冲区
// Console.WriteLine("开始接收数据: ");
_framByteList.Add(Convert.ToByte(rcyByte));
if (_framByteList.Count == _framDataLength)
{
// 校验数据
byte xorByte = GetXor(_framByteList);
byte jiaoyan = _framByteList[_framByteList.Count - 1];
if ((xorByte ^ jiaoyan) == 0)
{
// Console.WriteLine("校验通过,对数据解析: ");
// 另外开线程处理
List<byte> parseList = new List<byte>();
parseList.AddRange(_framByteList);
Thread ParseDataThread = new Thread(new ParameterizedThreadStart(ParseDataThreadMethod));
ParseDataThread.Start(parseList);
}
_framByteList.Clear();
_dataState = FrameDataRecvState.HEAD_FRIST;
}
break;
default:
break;
}
}
bufferZone.RemoveRange(0,n);
}