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

时间:2017-02-28 17:24:06

标签: c# serial-port

我正在开发一个桌面应用程序,它通过SerialPort与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没有被触发。 我无法在此找到模式。它随机跳过一些事件。 什么出了什么问题?

1 个答案:

答案 0 :(得分:1)

查看备注中的documentation

  

不保证每收到一个字节都会引发DataReceived事件。使用BytesToRead属性确定要在缓冲区中读取多少数据。

如果事件在您的情况下太可靠而无法信任从您的设备捕获每个传入信息,那么您可以使用额外的线程,该线程将在后台运行,不断检查BytesToRead属性和/或不断阅读ReadExisting是非阻塞的。