【问题标题】:C# - Reading Serial Port values while processing another methodC# - 在处理另一种方法时读取串行端口值
【发布时间】:2017-08-02 15:07:32
【问题描述】:

我对 C# 完全陌生,我有一个非常简单的问题,我无法弄清楚。 我正在尝试改进我不完全理解的现有代码。

按下“连接”按钮时,我的程序使用串行端口连接到设备:

 private void button_Connect_Click(object sender, EventArgs e)
    {
        serialPort.PortName = (string)comboBox_SerialPorts.SelectedItem;
        serialPort.Open();
        serialPort.DataReceived += SerialPort_DataReceived;
    }

方法 SerialPort_DataReceived 处理 DataReceived 事件:

    public delegate void InvokeTreatment(byte[] buffer);
    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        byte[] buffer = new byte[13];
        try
        {
            serialPort.Read(buffer, 0, buffer.Length);

            byte tmp = 0;
            for (int i = 1; i < 11; i++)
                tmp += buffer[i];
            if ((buffer[11] == tmp) && (buffer[12] == '!'))
                try
                {
                    this.BeginInvoke(new InvokeTreatment(Treatment_UART), new object[] { buffer });
                }
                catch { }
        }
        catch { }
    }

Treatment_UART 是一个函数,它使用来自串行端口的值在我的界面上显示值。

private void Traitement_UART(byte[] buffer)

此时,我的程序正常工作:它实时显示从我的串行设备接收到的值。

我现在想在另一个名为“Processing”的方法中进行一些处理,该方法在按下按钮时启动(例如,处理从串行设备接收到的数据的长 for 循环)。 我的问题是,在 Processing 执行期间,序列值的实时接收和显示不再有效。我需要我的程序在执行 Processing 期间不断接收来自串行设备的信息。

可能有不同的方法可以做到这一点。我想过在另一个线程中运行我的函数,或者只是在我的 Processing 方法中调用“SerialPort_DataReceived”方法...... 我该怎么做?也许在另一个线程中运行 Processing 意味着从串行端口读取不正确(或未实现)值的风险?

提前致谢!

【问题讨论】:

  • 您的标签中似乎包含了答案!然后,您是否要求提供在不同字符串上运行方法的示例?
  • 我在问哪种方式是最好的(在处理中调用方法或使用不同的线程),也许是一个例子或提示如何实现这一点......
  • 你肯定需要一个新的线程。您当前的线程正忙于侦听您的串行端口,因此它无法完成任何其他任务。我在下面的回答中为您提供了一个示例!

标签: c# multithreading events interface serial-port


【解决方案1】:

要多线程,请确保您在顶部使用using System.Threading;,然后只需执行以下操作:

Thread thread = new Thread(yourFuntionHere(params));
thread.Start();

方法完成后线程会自行关闭,不用担心!

【讨论】:

  • 感谢您的回答。我的方法“处理”是 button_Click 的事件处理程序...这部分是否必须包含在方法中?
  • 好的,你应该把你的事件处理程序Processing 的胆量剪切粘贴到一个新创建的函数中。然后让Processing 创建调用该新函数的线程。这有意义吗?
  • 是的,这很有意义。非常感谢您的回答。我唯一剩下的问题是我的事件处理程序需要在 TextBox 中打印文本,但我收到以下错误:'Invalid inter-thread operation: The' textBox_state_measure 'control was accessed from a thread other than the one on which it was created.' 我不记得在特定线程中创建我的 TextBox ...
  • 没问题!好的,从技术上讲,您的文本框已在第一个线程上创建。想象一下 thread1 已经构建了你的表单,完成了它,现在正在读取串行数据。这就是为什么文本框属于thread1。最佳实践是使用创建 GUI 的同一线程对 GUI 进行任何更改/更新。出于这个原因,我建议您改为在新线程 2 上监听您的串行端口,然后让您的按钮单击停留在线程 1 上。 接近字符限制,所以我将继续为您提供新评论
  • 但是,如果你愿意,你可以破解它并使用后台线程,并让你的串行监听线程 1。你需要做一些搜索,比如Changing GUI from background worker thread c#,但你应该找到一些很好的例子。抱歉,我没有排练过使用后台工作人员。我用过一次,让我看看我的旧代码 1 秒。
【解决方案2】:

这是一个常见问题。有多种方法可以解决这个问题,但可能最直接的方法是 BackgroundWorker 类。 (见:https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多