-2

我已经编写了函数DataReceivedHandler,它工作得很好,但是端口应该保持打开以读取即将到来的数据。在我的项目中,端口应该保持可用,以便在没有来自 Arduino 的任何数据时其他页面可以使用它。我怎样才能只有在收到数据时才打开它?

private static void DataReceivedHandler( object sender,SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;

    string indata = "";
    System.Threading.Thread.Sleep(1000);

    indata = sp.ReadExisting();
    // Console.WriteLine("Data Received:");
    if (indata == "kitchen_light_on\r\n")
        f1.update_flag("kitchen_light", 1);
    else
        if(indata == "kitchen_light_off\r\n")
            f1.update_flag("kitchen_light", 0);
}
4

2 回答 2

1

您需要一个SerialPort保持打开状态并由所有不同页面共享的对象。

请注意,这个System.IO.Ports.SerialPort类的设计很糟糕,你已经掉进了它的陷阱之一。您永远无法将结果ReadExisting()与任何东西进行比较,因为您可能现在获得部分数据,稍后获得部分数据。您首先必须将整个消息连接在一起,然后才能对其进行处理。或者您可能一次收到多条消息,在这种情况下,您需要在处理之前将它们分开。

于 2013-04-26T22:10:51.367 回答
0

我完全同意本。如果您的目标是确保获得完整的消息并且没有附加任何脏东西以便您的 Windows 程序了解要做什么,我建议使用标题和尾部标识符,例如>hereYourMessage<和/或从 Arduino 发送消息矮得多。

然后,您可以识别包含字符/数字或 >< 之间的任何内容的完整消息,并将它们剥离以传递消息以被解雇。

于 2013-04-28T13:42:05.520 回答