Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何仅在接收数据时打开SerialPort,而不是始终打开?_C#_Arduino - Fatal编程技术网

在C#中,如何仅在接收数据时打开SerialPort,而不是始终打开?

在C#中,如何仅在接收数据时打开SerialPort,而不是始终打开?,c#,arduino,C#,Arduino,我已经编写了函数DataReceivedHandler,它工作得很好,但是端口应该保持打开状态以读取即将到来的数据。在我的项目中,端口应该保持可用,以便在没有来自Arduino的任何数据时,其他页面可以使用它。如何仅在收到数据时打开它 private static void DataReceivedHandler( object sender,SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender;

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

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


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

我完全同意Ben的观点。如果您的目标是确保获得完整的消息,并且没有任何脏消息附加到消息上,以便您的Windows程序了解该做什么,我建议您使用头和尾标识符,例如
>此处您的消息<之间的字符/数字或任何内容,并将它们去掉以传递消息以被解雇