2017-06-13 39 views
0

我写了一个简单的(或者我以为)C#应用程序来读取串行数据,并在胜利表格控制中绘制图表。串行数据线每隔5秒发生一次。问题是,该应用停止更新一些更新后的图表,我无法弄清楚发生了什么。这里是代码:c#串行通信问题(线程?)

using System; 
using System.IO.Ports; 
using System.Windows.Forms; 

namespace SimplifiedTempChart 
{ 
    public partial class Form1 : Form 
    { 
     float frcvdata; 
     float test;   
     public delegate void DisplayTempChartDelegate(float temperature); 
     public DisplayTempChartDelegate _DisplayTempChart; 

     public Form1() 
     { 
      InitializeComponent();    
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      _DisplayTempChart = new DisplayTempChartDelegate(DisplayTempChart); 
     } 

     private void serialDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e) 
     { 
      SerialPort sData = sender as SerialPort; 
      string recvData = sData.ReadExisting(); 
      float.TryParse(recvData, out frcvdata); 
      test = frcvdata * 100; 
      gaugeControl1.Invoke((MethodInvoker)delegate { _DisplayTempChart(test); }); 
     } 

     public void DisplayTempChart(float temperature) 
     { 
      gaugeControl1.SetPointerValue("Scale1", "Pointer1", temperature); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      SerialPort aSerialPort = new SerialPort("COM17"); 
      aSerialPort.BaudRate = 9600; 
      aSerialPort.Parity = Parity.None; 
      aSerialPort.StopBits = StopBits.One; 
      aSerialPort.DataBits = 8; 
      aSerialPort.Open(); 
      aSerialPort.DataReceived += new SerialDataReceivedEventHandler(serialDataReceivedEventHandler); 
     } 
    } 
} 

我添加了一个断点来指示serialDataReceivedEventHandler何时被命中。下面是调试输出会话:

serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 serialDataReceivedEventHandler打 线程0x1a04已退出,代码为0(为0x0)。 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 线程0x2200已退出,代码0(为0x0)。 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 线程0x22fc已经退出,代码0(为0x0)。 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 serialDataReceivedEventHandler击中 线程0x1720已退出,代码0(为0x0)。 线程0x18a8已退出代码0(0x0)。 线程0xed0已退出,代码为0(0x0)。 线程0xf74已退出,代码为0(0x0)。 线程0x5b4已退出,代码为0(0x0)。 线程0x1b7c已退出代码0(0x0)。 线程0x1d2c已退出代码0(0x0)。

当应用程序停止更新图表时,'线程退出'事件确实堆积 - 这看起来很可疑,但我不确定,我不明白如何开始解决此问题。

我可以重新启动图表更新只需按下窗体上的button1。

任何人都可以帮忙吗?

回答

1

我认为你aSerialPort实例被当作垃圾回收的早期。 您正在将其声明为局部变量,因此只要您的button_1_Click处理程序退出,垃圾收集就会变得难以理解。

尝试声明aSerialPort作为窗体的类成员,而不是为了引用该参考并阻止其被垃圾收集。

0

不知道通信问题是什么,但

float.TryParse(recvData, out frcvdata); 
test = frcvdata * 100; 

不好。基本上你是说,“试图解析recvData,但不管发生了什么,不管结果如何,即使它没有解析,也要把结果乘以100。

尝试,而不是:

bool parsed = float.TryParse(recvData, out frcvdata); 
if (parsed) 
{ 
    test = frcvdata * 100.0; 
    // invoke your delegate with known good data... 
} 
else 
    // do something else with parse failure, 
    // maybe print it so you can see why the parse to float failed? 
+0

好点。我继续前进,包括只是为了安全,但是没有任何解析失败,问题依然存在。 –

+0

frcvdata的值有多大?将一个非常大的数乘以100可能会给出一个浮点错误,但有一个例外。 – jdweng

+0

0.0