C#串口接收数据显示 窗体应用程序设计

.Net技术 码拜 8年前 (2016-03-07) 2726次浏览
小弟最近遇到个问题一直解决不了  望各位经验丰富的高手支招
本人把登录窗体设为了父窗体  登录后弹出了一个子窗体   里面有其它功能运行正常
本人在子窗体里面放了两个label来显示温度和湿度   如下图所示:
C#串口接收数据显示 窗体应用程序设计
温度和湿度通过串口接收数据来显示   所以用了个串口的控件  每次接收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
{
….
});
委托中,确保它无论怎么样都注册到主线程去排队显示。

10

不要写 DiscardInBuffer 这种代码,这种代码是“成事不足败事有余的”。你应该读取全部信息,然后处理信息。从逻辑上看根本没有什么“扔掉信息”的必要。
编程之道,是尽可能删除代码仍然能够让程序通过测试,这才是好的程序。假如你写DiscardInBuffer,那么要问问“为什么要这么做?”,这么做除了掩盖错误还能怎么?而用一句DiscardInBuffer 能够真正能欺骗用户、还是欺骗本人呢?

10

这样试试:
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


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#串口接收数据显示 窗体应用程序设计
喜欢 (0)
[1034331897@qq.com]
分享 (0)