【发布时间】: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