Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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 DataReceivedHandler。_C#_Serial Port - Fatal编程技术网

没有为每个事件调用c#SerialPort DataReceivedHandler。

没有为每个事件调用c#SerialPort DataReceivedHandler。,c#,serial-port,C#,Serial Port,我正在开发一个通过串口与Arduino交互的桌面应用程序。 我希望每次arduino在串行端口上写入内容时,我的应用程序都会做出响应。 但并非所有事件都会触发DataReceivedHandler。 这是连接代码- public static bool connectToArduino() { foreach (string name in SerialPort.GetPortNames()) { SerialPort serialPort = new Seria

我正在开发一个通过串口与Arduino交互的桌面应用程序。 我希望每次arduino在串行端口上写入内容时,我的应用程序都会做出响应。 但并非所有事件都会触发DataReceivedHandler。 这是连接代码-

public static bool connectToArduino()
{
    foreach (string name in SerialPort.GetPortNames())
    {
        SerialPort serialPort = new SerialPort(name);
        Console.WriteLine(name);
        if (serialPort.IsOpen == false)
        {
            serialPort.PortName = name;
            try
            {
                Console.WriteLine("Openning serial port.");
                serialPort.WriteTimeout = 5000;
                serialPort.ReadTimeout = 5000;
                serialPort.BaudRate = 115200;
                serialPort.Open();
                serialPort.Write(Constants.CONNECT_APP_STRING);
                Console.WriteLine("Written to serial port.");
                string reply = serialPort.ReadLine();
                //string reply = serialPort.ReadTo("\n");
                Console.WriteLine("Reply is: " + reply);
                Console.WriteLine("Read from serial port.");
                if (reply == Constants.CONNECT_ACK)
                {
                    Console.WriteLine(name);
                    Console.WriteLine("Connected with arduino controller");
                    //serialPort.DataReceived += DataReceivedHandler;
                    serialController = serialPort;
                    return true;
                }
                else if (reply+"\n" == Constants.CONNECT_ARDUINO_STRING) {
                    serialPort.WriteLine(Constants.CONNECT_ACK);
                    serialController = serialPort;
                    MessageBox.Show("Connected with arduino controller");
                    return true;
                }
                else
                {
                    serialPort.Close();
                }
            }
            catch (TimeoutException)
            {
                Console.WriteLine("Timeout occured.");
                serialPort.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "ERROR");
                Console.WriteLine(ex);
            }
        }
    }
    MessageBox.Show("Connection with Arduino failed!");
    return false;
}
在此之后,我设置数据接收处理程序-

SerialComm.serialController.DataReceived += DataReceivedHandler;
现在的问题是,有时DataReceivedHandler没有被触发。 我找不到这种模式。它只是随机跳过一些事件。 知道出了什么问题吗

查看以下内容,您可以在备注中找到:

不能保证为接收到的每个字节引发DataReceived事件。使用BytesToRead属性确定缓冲区中还有多少数据需要读取


如果该事件在您的情况下太不可靠而不可信,那么您可以使用一个额外的线程在后台运行,不断检查属性和/或不断读取非阻塞的信息。

此事件似乎不是最可靠的。如果你找的话,你可以找到很多关于它的文章。您输入数据的频率是多少?每秒?事件的频率非常不稳定,实际上这个应用程序是一个涉及激光的游戏控制器。因此,每当用户切断激光或按下按钮时,就会发生一个事件。那么,这个问题的解决方案是什么呢?如果我想要一种可靠的方式来获取所有事件,我应该使用什么来代替呢?我可以简单地将整个DataReceived处理程序移动到另一个线程吗?如果是,我会怎么做?另外,我如何确保线程没有被终止,因为我在应用程序日志中看到了很多“线程0x2764已退出,代码为0(0x0)”。DataReceived处理程序位于另一个线程上。该事件在另一个线程上触发。我的意思是在连接到设备后创建一个新任务,并让它运行,直到程序关闭或设备断开连接。除非您没有杀死任务/线程,并且它还没有完成它的工作,否则它将处于活动状态并正在执行它的工作:)