【问题标题】:why SerialDataReceivedEventHandler work only when i put break point C#?为什么 SerialDataReceivedEventHandler 仅在我放置断点 C# 时才起作用?
【发布时间】:2013-04-26 16:02:08
【问题描述】:

我为从串行端口接收数据创建了一个事件处理程序,它只有在我放置断点并且当我删除它时才能正常工作,函数不会调用这是我的代码 我已经将端口声明为 SerialPort 的对象

private static void DataReceivedHandler( object sender,SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    // sp.Open();
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    if (indata == "kitchen_light_on\r\n")
        f1.update_flag("living_light", 1);
    else if(indata == "kitchen_light_off\r\n")
        f1.update_flag("living_light", 0);
} 

port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

【问题讨论】:

  • 通常这样的错误与调试本身无关。根据我的经验,我可以说这可能是一个时间问题(其他线程干扰了调用等)。你检查过这个方向吗?
  • 为什么不使用sp.ReadLine()

标签: c# events serial-port visual-studio-debugging


【解决方案1】:

您可能会遇到竞争情况:如果您在 sp.ReadExisting() 之前放置一个断点,那么端口可能有足够的时间来接收您假装接收的整行。如果没有断点,对 ReadExisting() 的调用可能太早或太快,因此端口只接收到该行的一部分(例如,仅“kitchen_li”)。如果发生这种情况,那么您的两个 if/elseif 条件都将为 false,并且您不会看到任何标志更新 - 事件处理程序被调用但什么也没做。

您可以在 if/elseif 语句中添加两行代码来检查这一点:

else
    Console.WriteLine("Both conditions failed, indata contains " + indata);

【讨论】:

  • 感谢它通过将此行添加到我的代码 System.Threading.Thread.Sleep(1000);
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2018-05-06
  • 2023-03-05
  • 2020-12-25
  • 2012-08-21
  • 2021-03-29
  • 2018-11-12
  • 2019-12-21
相关资源
最近更新 更多