为什么SerialDataReceivedEventHandler只有在我放置断点C#时才能工作?

时间:2013-04-26 16:02:08

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

我做了一个事件处理程序,用于从串口接收数据,只有当我放置断点时才能完美地工作,当我删除它时,函数不会调用这是我的代码 我已经将端口声明为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); 

1 个答案:

答案 0 :(得分:2)

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

您可以在if / elseif语句中检查这两行代码:

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