111,120
社区成员
发帖
与我相关
我的任务
分享 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (ReceiveEventFlag) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buff1 = new byte[n];
received_count += n;//增加接收计数
//serialPort1.ReceivedBytesThreshold = 9;
serialPort1.Read(buff1, 0, n);//读取缓冲数据
//TimeSpan th = new TimeSpan(0, 0, 0, 50);//时间间隔
//Thread.Sleep(th);
bool data_1_catched = false;//缓存记录数据是否捕获到
//1.缓存数据
buffer.AddRange(buff1);
//完整性判断
byte[] ReceiveBytes = new byte[n-2];
while (buffer.Count >= 4)
{
if (buffer[0] == Tx_ML[0]&&buffer[1] == Tx_ML[1])
{
int len = buffer[2];
if (buffer.Count<len+4)
{
break;
}
buffer.CopyTo(0, ReceiveBytes, 0, len +3);
byte [] jiaoyan =new byte [n];
jiaoyan = Scoft.Bclas.ClasCRC.CRC16_C(ReceiveBytes);
byte[] byjy = new byte[ReceiveBytes.Length+jiaoyan.Length];
Array.Copy(ReceiveBytes, 0, byjy, 0, ReceiveBytes.Length);
Array.Copy(jiaoyan, 0, byjy, ReceiveBytes.Length, jiaoyan.Length);
if (buffer[5] != jiaoyan[0] && buffer[6] != jiaoyan[1])
{
buffer.RemoveRange(0, len + 5);
continue;
}
EDA19017_Mg1_Llimit = Convert.ToUInt32(ReceiveBytes[3].ToString("X2") + ReceiveBytes[4].ToString("X2"), 16);
buffer.RemoveRange(0, 7);
}
else
{
buffer.RemoveAt(0);
}
}
// EDA19017_Mg1_Llimit = Convert.ToUInt32((Scoft.Bclas.ClasCRC.ByteToString(buff1)).Substring(6, 4), 16);
//buffer.RemoveRange(0, buff1.Length);
data_1_catched = true;
builderk.Remove(0, builderk.Length);//清除字符串构造器的内容
if (data_1_catched)
{
this.Invoke((EventHandler)
(delegate
{
if (E9060_K1KZ == 1)
{
this.textBox1.Clear();
this.textBox1.Text = Convert.ToString(Scoft.Bclas.ClasCRC.GetSiSheWuRuNumber(Bclas.ClasCRC.L_ineartn(EDA9017_Rge1_Ulimit, EDA9017_Rge1_Llimit, EDA9017_Nf1_Ulimit, EDA9017_Nf1_Llimit, EDA19017_Mg1_Llimit), 2)) + "\r\n";
E9060_K1KZ = 2;
//return;
}
else if (E9060_K1KZ == 2)
{
this.textBox2.Clear();
this.textBox2.Text = Convert.ToString(Scoft.Bclas.ClasCRC.GetSiSheWuRuNumber(Bclas.ClasCRC.L_ineartn(EDA9017_Rge1_Ulimit, EDA9017_Rge1_Llimit, EDA9017_Nf1_Ulimit, EDA9017_Nf1_Llimit, EDA19017_Mg1_Llimit), 2))+"\r\n";
E9060_K1KZ = 1;
//return;
}
}));
}
builderk.Remove(0, builderk.Length);//清除字符串构造器的内容
serialPort1.DiscardInBuffer();
ReceiveEventFlag = true;
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
//serialPort1.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(comm1_DataReceived);
received_count = 0;
}
}