我用的是MUDOBS协议,采集下位机两个通道的模拟量-500mV~+500mV,数据能采集上来(开机textbox1和textbox1中的数据分别是2.09mV、1.85mV),我在第一个通道输入标准10mV的信号后,应在textbox1中显示10mV的值,但是,数据在textbox2和textbox1文本框中数据都在变化,而且textbox1中的数据变的更大,两个通道的数据不断的变化,不稳定。(第一通道输入10mV值后,的显示值分别是textbox1.text=56.18mV,textbox1.text=13.82mv)
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;
} }
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;
} }
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货