第一次做程序,先描述一下程序功能,我认为是自己不会用C#导致的各种问题,我不知道正确的方法。
软件与下位机是一问一答的方式,收到的数据包160个字节。
现在我使用timer控件来计时发送指令要数据,在received中委托处理
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ int n = sp.BytesToRead;//读取长度
byte[] readBuffer = new byte[n];
sp.Read(readBuffer, 0, n); //读入缓存
ArrayList_byte_R1.AddRange(readBuffer);
if (ArrayList_byte_R1.Count > 0 && ArrayList_byte_R1.Count < 160)
{
return;
} if (ArrayList_byte_R1.Count == 160)
{
ArrayList_byte_R1.CopyTo(copydata);
jsCount = ArrayList_byte_R1.Count;
ArrayList_byte_R1.Clear ();
this.BeginInvoke(interfaceUpdateHandle, copydata);
}
}
这160个字节基本上全部要显示在界面的各种label控件上,还有四组要传递到form2中在zedgraph中绘图,整个程序运行起来开始计时器能工作,但是如果移动界面或者打开form2,界面就开始卡,数据也不发送了。
我不知道是不是我的设计思路就不对,应该怎么去修改才能保证界面更新,和数据收发,还有绘图这样的功能实现呢?
软件与下位机是一问一答的方式,收到的数据包160个字节。
现在我使用timer控件来计时发送指令要数据,在received中委托处理
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ int n = sp.BytesToRead;//读取长度
byte[] readBuffer = new byte[n];
sp.Read(readBuffer, 0, n); //读入缓存
ArrayList_byte_R1.AddRange(readBuffer);
if (ArrayList_byte_R1.Count > 0 && ArrayList_byte_R1.Count < 160)
{
return;
} if (ArrayList_byte_R1.Count == 160)
{
ArrayList_byte_R1.CopyTo(copydata);
jsCount = ArrayList_byte_R1.Count;
ArrayList_byte_R1.Clear ();
this.BeginInvoke(interfaceUpdateHandle, copydata);
}
}
这160个字节基本上全部要显示在界面的各种label控件上,还有四组要传递到form2中在zedgraph中绘图,整个程序运行起来开始计时器能工作,但是如果移动界面或者打开form2,界面就开始卡,数据也不发送了。
我不知道是不是我的设计思路就不对,应该怎么去修改才能保证界面更新,和数据收发,还有绘图这样的功能实现呢?
{
if (this.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(UpdateUI);
this.Invoke(_myInvoke, new object[] { deletestr });
}
else
{
//更新UI
}
}
接收到数据后,你就调用UpdateUI(Data)就行了。