c# - 让多个线程轮询同一个串口的正确方法是什么?

标签 c# multithreading user-interface serial-port polling

我对与硬件交互还很陌生。我目前正在使用 Windows 窗体在 C# 中构建 GUI。我正在使用串行端口/usb 与硬件设备交互。我想要实现的是让多个线程在不同时间轮询设备。应该定期(至少每秒)检索一些数据,例如温度、电流、功率等,并在 GUI 上更新以供用户查看。而其他数据只有在用户按下表单上的按钮时才会被检索。多线程是解决这个问题的正确方法吗?如果没有,什么是更好的解决方案?示例将不胜感激。谢谢你们的时间!

更新: 我正在尝试使用你们许多人建议的 SerialPort.DataReceived 事件和终止符“\r”来解析来自串口的各个回复。然后我调用一个名为 DisplayText 的方法来处理该字符串。我现在的问题是我不知道如何弄清楚字符串代表什么。是否代表温度、电流等。

private char terminator = '\r';
private void SerialPorts_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            output += serialPort1.ReadExisting();
            if (output.IndexOf((char)this.terminator) > -1)
            {
                string workingString = output.Substring(0, output.IndexOf(terminator));

                output = output.Substring(output.IndexOf(terminator) + 1);

                this.Invoke(new EventHandler((s, a)=>DisplayText(s, a, workingString)));
            }

        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void DisplayText(object sender, EventArgs e, string s)
    {
        Console.WriteLine(s); // for testing only
        richTextBox1.AppendText(s); // for testing only
    }

最佳答案

我认为让多个线程轮询单个端口并尝试同步不是一个好主意。

最好有一个线程来执行轮询并将所有值存储在某个“中间”对象(单例、静态字段,您喜欢的)中,而不是同步对此存储的访问。

因此一个线程轮询端口,收集值并将它们存储在某处,而其他线程则从那里获取值。

关于c# - 让多个线程轮询同一个串口的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122212/

相关文章:

c# - asp gridview中需要加一条横线来划分行

c# - 剪贴板监视器 C#

c# - 如何在WPF中进行多个项目的数据绑定(bind)

multithreading - JMeter一次只对全局变量进行初始化

java - ContentPane 和 JProgressBar 不可见

python-2.7 - 如何隐藏/删除使用 Kivy 开发的窗口上的默认最小化/最大化按钮?

c# - For 循环和 DateTime 问题

objective-c - 设置图像 : forState: lagging the UI

C++ pthreads/semaphores 不运行

java - Android Studio 和我的设备中的分辨率相同但外观不同