如何在serialport控件的dataReceived事件中将读取的数据更新到UI上,求助
大家好,小弟正在接触一个温度测量方面的项目,采集到的温度数据通过串口传递到上位机,我用的C#的serialport控件,在控件的dataReceived事件里处理接收到的数据(主要是将数处理后显示在波形控件和文本框中),程序运行后出现问题,波形控件一开始可以更新,读取几个数据后就停止不再更新。调试半天找不到问题,看到有网友说,invoke里面不宜放太多方法,是不是这出现什么问题了,有没有什么方法可以不用invoke,将数据分离出去处理呢,求解。多谢。以下是我的代码:
UI 串口
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
isReceving = true;//当前正在接收数据
int Len = serialPort.BytesToRead;//获取缓冲区数据字节数
if ((Len < 1)||(Len != 7))// 数据包为7个字节
{
isReceving = false;//接收完成标志
return;
}
byte[] recData = new byte[Len];//新建字节数组,用以接收缓冲区数据
serialPort.Read(recData, 0, Len);//读取Len字节数据到recData数组
string recHex = string.Empty;//新建字符串变量
for (int i = 0; i < recData.Length; i++)
{
string strTemp = Convert.ToString(recData[i], 16);//转换成16进制字符
if (recData.Length < 2)
{
strTemp = '0' + strTemp;
}
if (strTemp.Length < 2)
{
strTemp = '0' + strTemp;
}
recHex += strTemp;
}
string strHead = recHex[0].ToString()+recHex[1].ToString() ;//取出包头
string strData = recHex[6].ToString() + recHex[7].ToString() + recHex[8].ToString() + recHex[9].ToString();//取出数据
this.Invoke(new EventHandler(delegate
{
doingHex = true;
DateTime dt = new DateTime(year, month, day);
switch (strHead)
{
case "02":
{
float floatData = Convert.ToInt32(strData, 16) / 10;
tbxTemp2.Text = floatData.ToString();
xData.Add((float)((DateTime.Now - dt).Ticks) /10000000);//画x轴
yData.Add(floatData);//y轴
zGraph.Refresh();//画波形
string strSQL = "insert into tb_Data([反应釜],[日期],[时间],[温度值]) values('" + 2 + "','" + DateTime.Now.ToShortDateString() + "','" + DateTime.Now.ToLongTimeString() + "','" + floatData + "')";
dataoperate.getCom(strSQL);//存数据库
}
break;
case "03":
{
float floatData = Convert.ToInt32(strData, 16) / 10;
tbxTemp3.Text = floatData.ToString();
x1Data.Add((float)((DateTime.Now - dt).Ticks) / 10000000);//画x轴
y1Data.Add(floatData);//y轴
zGraph.Refresh();//更新UI数据
string strSQL = "insert into tb_Data([反应釜],[日期],[时间],[温度值]) values('" + 3 + "','" + DateTime.Now.ToShortDateString() + "','" + DateTime.Now.ToLongTimeString() + "','" + floatData + "')";
dataoperate.getCom(strSQL);//存数据库
}
break;
default: return;
}
doingHex = false;
}
));
while (doingHex)
{
//处理串口接收事件及其它系统消息。
Application.DoEvents();
}
//// ***接收完成状态指示。
isReceving = false;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}