-1

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

1 回答 1

2

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

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

else
    Console.WriteLine("Both conditions failed, indata contains " + indata);
于 2013-04-26T16:17:38.210 回答