我对与硬件交互还很陌生。我目前正在使用 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/