110,545
社区成员
发帖
与我相关
我的任务
分享
private void deal_byte()
{
switch (p[2])
{
case 0:
A[0] = (short)(p[3] + p[4] * 256);
break;
case 1:
A[1] = (short)(p[3] + p[4] * 256);
break;
case 2:
A[2] = (short)(p[3] + p[4] * 256);
break;
case 3:
A[3] = (short)(p[3] + p[4] * 256);
break;
case 4:
A[4] = (short)(p[3] + p[4] * 256);
break;
case 5:
A[5] = (short)(p[3] + p[4] * 256);
break;
case 6:
A[6] = (short)(p[3] + p[4] * 256);
break;
case 7:
A[7] = (short)(p[3] + p[4] * 256);
break;
}
}
private List<byte> buffer = new List<byte>(4096);
private short[] A = new short[10];
private byte[] p = new byte[6]; //6个数据作为一个协议包,头+len+命令+数据低字节+数据高字节+效验和
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int n = serialPort1.BytesToRead; //读取串口事件发生时的字节数
byte[] buf = new byte[n]; //申明数组保存一帧数据
serialPort1.Read(buf, 0, n); //读取缓冲数据
bool dat_catch = false;
buffer.AddRange(buf); //缓存到listbuffer里面去
while (buffer.Count >= 4) //这里用while是因为里面有break 和continue
{
if (buffer[0] == 0xfe) //判断头
{
int len = buffer[1]; //下位机发送的字节数
if (buffer.Count < len + 2) break; //如果接受数据数小于字节数,继续接受
byte checksum = 0; //异或效验变量
for (int i = 2; i < len + 3; i++) //len=5
{ checksum += buffer[i]; } //得到效验值
//if (checksum != buffer[len + 3]) //如果效验失败,这个数据不要,继续接受下一个数据
//{ buffer.RemoveRange(0, len + 4); continue; } //这里的continue是说while循环,不是if
buffer.CopyTo(0, p, 0, len + 3); //复制一条完整数据到具体的数据缓存
dat_catch = true;
buffer.RemoveRange(0, len + 3); //正确分析一条数据,从缓存中移除数据。
if (dat_catch)
{
deal_byte(); //用变量保存想要的数据
}
}
else
{ buffer.RemoveAt(0); } //如果包的第一个数据错误,则重新开始
}
}
catch (System.Exception)
{
return;
}
}