【发布时间】:2018-06-11 12:46:31
【问题描述】:
我的问题是关于来自System.IO.SerialPort 的DataReceived 事件。我有一个在该事件发生时被调用的方法。我用myPort.ReadExisting 读取数据,处理并保存。如果我得到一个特定字符,那么到该点的数据将被解释为命令并触发另一个事件。
我的问题是,如果我正在处理接收到的数据并且有新数据出现,会发生什么?方法的新实例是否在等待旧实例完成?如果不是,则可能导致冲突,因为该方法的两个实例都使用相同的变量。我在事件处理的概念上是错的还是有一种优雅的方式来处理它。
我的代码运行良好,结果符合预期,但我的数据处理没有那么复杂。我只是想了解这个问题并避免将来遇到问题。 我的代码示例是这样的:
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
int index = m_ports.FindIndex(p => p.PortName == port.PortName);
string tmpData;
m_currentData[index] += tmpData = port.ReadExisting();
Console.WriteLine(tmpData);
string currentData = m_currentData[index];
string currentOrder = "";
while (currentData.Contains(orderEndChar))
{
int endCharLocation = currentData.IndexOf(orderEndChar);
currentOrder = currentData.Substring(0, endCharLocation);
currentData = currentData.Substring(endCharLocation + 1);
orderEvent.gotOrder(currentOrder);
//orderEvent.gotOrder(new EventArgs());
}
m_currentData[index] = currentData;
}
这些列表是因为我希望它与多个端口一起工作,我可以从中获取命令。
【问题讨论】:
-
您可以通过在方法的开头和结尾调用
Console.WriteLine自行测试。 -
相关帖子。请看看它是否有帮助 - IO operation aborted error thrown while reading serial port
-
如何为每个传入的数据启动一个新线程,这样就不用等待了?
-
我不确定我是否完全理解您所关心的问题,但是 I/O 中断不会导致您的程序跳出它所在的任何方法;该事件将在消息循环中排队等待处理。
-
@DamoV 这真是个疯狂的想法。
标签: c# event-handling serial-port