如何在C#中收到数据时打开SerialPort,而不是一直打开?

时间:2013-04-26 21:49:34

标签: c# arduino

我编写了函数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);
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我完全同意本。如果您的目标是确保获取完整的消息并且没有附加任何脏消息,以便Windows程序了解该怎么做,我建议使用标头和尾部标识符,例如>hereYourMessage<和/或制作来自Arduino的消息要短得多。

然后,您可以识别完整的消息,其中包含&gt;&lt;&lt;&lt;&lt;&lt;并剥离它们以传递消息以解雇。