串口或TCP通讯防粘包
防止粘包后导致数据无法接收的问题(C#)
Queue <byte> queue = new Queue<byte>();
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
byte[] buffer1 = new byte[1024];
int length = client.ReceiveFrom(buffer1, ref point);//接收数据报
int first1 = Array.IndexOf(buffer1, (byte)0xaa);
byte[] buffer2 = new byte[length];
Array.Copy(buffer1, 0, buffer2, 0, buffer2.Length);
int num1 = 0;
int num2 = 0;
//遍历每个数据并通过包头和包尾判断一包数据是否接收到
foreach (var item in buffer2)
{
if (item == 0xaa)
{
num1++;
}
if (num1 >=2 )
{
Open_queue = true;
queue.Enqueue(0xaa);
num1 = 0;
}
if (Open_queue)
{
queue.Enqueue(item);
}
if (item == '\r')
{
num2++;
}
if (item == '\n')
{
num2++;
}
if (num2 >= 2)
{
Open_queue = false;
num2 = 0;
byte[] buffer = new byte[queue.Count];
queue.CopyTo(buffer,0);
queue.Clear();
//最后两位为\r\n
byte[] check_byte = { buffer[buffer.Length - 4], buffer[buffer.Length - 3] };
uint[] check_uint = new uint[buffer.Length - 4];
for (int i = 0; i < check_uint.Length; i++)
{
check_uint[i] = buffer[i];
}
ushort check = BitConverter.ToUInt16(check_byte, 0);
ushort check_local = (ushort)crc32(check_uint);
if (!(check == check_local))
{
continue;
}
try
{
if (reciveMsg)
{
data_receive(buffer);
}
}
catch
{
}