【问题标题】:c# serial comms issue (threads?)c#串行通信问题(线程?)
【发布时间】:2017-11-15 14:31:35
【问题描述】:

我编写了一个简单的(或者我认为是这样的)C# 应用程序来读取串行数据并将其绘制在 win 表单仪表控件中。串行数据线每隔 5 秒出现一次。问题是,应用程序在一些更新后停止更新图表,我无法弄清楚发生了什么。代码如下:

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 即可重新开始图表更新。

谁能帮忙?

【问题讨论】:

    标签: c# multithreading serial-port


    【解决方案1】:

    我认为您的 aSerialPort 实例正在被早期垃圾收集。 您将其声明为局部变量,因此一旦您的 button_1_Click 处理程序退出,它就可以用于垃圾收集。

    尝试将 aSerialPort 声明为 Form 的类成员,以便根引用并防止它被垃圾收集。

    【讨论】:

      【解决方案2】:

      不确定是什么沟通问题,但是

      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?
      

      【讨论】:

      • 好点。为了安全起见,我继续将其包含在内,但是没有任何解析失败,问题仍然存在。
      • frcvdata 的值有多大?将一个非常大的数字乘以 100 可能会产生浮点错误并引发异常。
      • 0.0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多