c#serial comms issue(threads?)

时间:2017-06-13 17:20:32

标签: c# multithreading serial-port

我写了一个简单的(或者我认为的)C#app来读取串行数据并将其绘制在win form gauge控件中。串行数据线以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即可重新启动图表更新。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我认为你的aSerialPort实例很早就被垃圾收集了。 您将其声明为局部变量,因此只要您的button_1_Click处理程序退出,它就会变得易于垃圾收集。

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

答案 1 :(得分:0)

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

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

不好。基本上你是在说,"尝试解析recvData但无论发生什么,无论结果如何,即使它没有解析,也要将结果乘以100。&#34 ;

尝试改为:

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?
相关问题