小弟最近遇到个问题一直解决不了 望各位经验丰富的高手支招
本人把登录窗体设为了父窗体 登录后弹出了一个子窗体 里面有其它功能运行正常
本人在子窗体里面放了两个label来显示温度和湿度 如下图所示:
温度和湿度通过串口接收数据来显示 所以用了个串口的控件 每次接收4个字符 前2个温度 后2个湿度(10s会接收一次)
窗口接收数据的代码如下:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
if( data.Length == 4 )
{
string wendu = ((data[0] – “0”) * 10 + (data[1] – “0”)).ToString(); //温度 都是整数
string shidu = ((data[2] – “0”) * 10 + (data[3] – “0”)).ToString(); //湿度 都是整数
label28.Text = wendu; //温度显示的label
label29.Text = shidu; //湿度显示的label
}
serialPort1.DiscardInBuffer();
}
实际运行时发现,label上面的数字第一次接收显示是正确的,但是之后就不会再更新数据了
添加断点后发现串口接收的中断确实是10s会进入一次 数据正确接收 但是为什么label.Text显示不会更新呢?
求各位指点
本人把登录窗体设为了父窗体 登录后弹出了一个子窗体 里面有其它功能运行正常
本人在子窗体里面放了两个label来显示温度和湿度 如下图所示:
温度和湿度通过串口接收数据来显示 所以用了个串口的控件 每次接收4个字符 前2个温度 后2个湿度(10s会接收一次)
窗口接收数据的代码如下:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
if( data.Length == 4 )
{
string wendu = ((data[0] – “0”) * 10 + (data[1] – “0”)).ToString(); //温度 都是整数
string shidu = ((data[2] – “0”) * 10 + (data[3] – “0”)).ToString(); //湿度 都是整数
label28.Text = wendu; //温度显示的label
label29.Text = shidu; //湿度显示的label
}
serialPort1.DiscardInBuffer();
}
实际运行时发现,label上面的数字第一次接收显示是正确的,但是之后就不会再更新数据了
添加断点后发现串口接收的中断确实是10s会进入一次 数据正确接收 但是为什么label.Text显示不会更新呢?
求各位指点
解决方案
20
保存数据要声明一个 private List<byte> 集合,然后读取的内容要累计到这个集合中。简单地以为每一次都能读取到4个字节,这是不正确的。
假如你调试、或 Debug.Print 打印日志时发现数据是正确的,那么就把那两行为 .Text 属性赋值的语句放到
Control.BeginInvoke((Action)delegate
{
….
});
委托中,确保它无论怎么样都注册到主线程去排队显示。
假如你调试、或 Debug.Print 打印日志时发现数据是正确的,那么就把那两行为 .Text 属性赋值的语句放到
Control.BeginInvoke((Action)delegate
{
….
});
委托中,确保它无论怎么样都注册到主线程去排队显示。
10
不要写 DiscardInBuffer 这种代码,这种代码是“成事不足败事有余的”。你应该读取全部信息,然后处理信息。从逻辑上看根本没有什么“扔掉信息”的必要。
编程之道,是尽可能删除代码仍然能够让程序通过测试,这才是好的程序。假如你写DiscardInBuffer,那么要问问“为什么要这么做?”,这么做除了掩盖错误还能怎么?而用一句DiscardInBuffer 能够真正能欺骗用户、还是欺骗本人呢?
编程之道,是尽可能删除代码仍然能够让程序通过测试,这才是好的程序。假如你写DiscardInBuffer,那么要问问“为什么要这么做?”,这么做除了掩盖错误还能怎么?而用一句DiscardInBuffer 能够真正能欺骗用户、还是欺骗本人呢?
10
这样试试:
delegate void lblset(Label lbl, string s);
lblset mylblset;
private void Lblset(Label lbl, string s)
{
lbl.Text = s;
}
delegate void lblset(Label lbl, string s);
lblset mylblset;
private void Lblset(Label lbl, string s)
{
lbl.Text = s;
}
private void Form1_Load(object sender, EventArgs e)
{
mylblset = new lblset(Lblset);
}
。
label28.Invoke(mylblset, new object[] { label28,wendu }); //温度显示的label
label29.Invoke(mylblset, new object[] { label29, shidu }); //湿度显示的label