使用缓存机制完成。
首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);
用来存放所有的数据,
在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,
如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。
//针对数据协议:head + len + playload + check 类型
private List<byte> buffer = new List<byte>(4096);
private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件
{
int n = sp.BytesToRead;
byte[] buf = new byte[n];
sp.Read(buf, 0, n);
//1.缓存数据
buffer.AddRange(buf);
//2.完整性判断
while (buffer.Count >= 4) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同
{
//2.1 查找数据头
if (buffer[0] == 0x01) //传输数据有帧头,用于判断
{
int len = buffer[2];
if (buffer.Count < len + 4) //数据区尚未接收完整
{
break;
}
//得到完整的数据,复制到ReceiveBytes中进行校验
byte[] ReceiveBytes = new byte[len + 4];
buffer.CopyTo(0, ReceiveBytes, 0, len + 4);
byte jiaoyan; //开始校验---自定义实现
jiaoyan = this.JY(ReceiveBytes);//
if (jiaoyan != ReceiveBytes[len+3]) //校验失败,最后一个字节是校验位
{
buffer.RemoveRange(0, len + 4);
MessageBox.Show("数据包不正确!");
continue;
}
buffer.RemoveRange(0, len + 4);
///执行对数据进行处理操作RunReceiveDataCallback(ReceiveBytes);
}
else //帧头不正确时,记得清除
{
buffer.RemoveAt(0);
}
}
}
//针对协议类型: head + len +cmd + seq+ playload +check + tail;
private List<byte> buffer = new List<byte>(4096);
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
try
{
int nCount = serialPort1.BytesToRead;
if (nCount == 0)
{
return;
}
byte[] btAryBuffer = new byte[nCount];
serialPort1.Read(btAryBuffer, 0, nCount);
//缓存数据
buffer.AddRange(btAryBuffer);
int index = 1;
while (buffer.Count>0x07) //最短协议长度
{
if (buffer[0] == 0x01) //协议头
{
if (buffer[index] != 0x03) //查询协议尾
{
index++;
if (index > buffer.Count) //没有接受到帧尾 0x03
{
break; //退出继续接收
}
}
else // 接收到协议尾 得到完整一帧数据
{
byte[] ReceiveBytes = new byte[index+1];
buffer.CopyTo(0, ReceiveBytes, 0, index+1);
RunReceiveDataCallback(ReceiveBytes);
buffer.RemoveRange(0, index);
}
}
else
{
buffer.RemoveAt(0);
}
}
}
catch (System.Exception ex)
{
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
handerListening = false;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)