如何在c#中仅在接收数据时打开SerialPort,而不是一直打开

本文关键字:SerialPort 一直 数据 | 更新日期: 2023-09-27 18:11:01

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

如何在c#中仅在接收数据时打开SerialPort,而不是一直打开

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

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

我完全同意Ben的话。如果您的目标是确保获得完整的消息,并且没有任何附加到Windows程序以了解该做什么,我建议使用头和尾标识符,如>hereYourMessage<和/或使您的消息从Arduino短得多。

然后,您可以识别包含字符/数字或><然后把它们去掉,传递被解雇的消息。>