C# read only Serial port when data comes

前端 未结 2 2029
旧巷少年郎
旧巷少年郎 2020-12-03 02:13

I want read my serial port but only when data comes(I want not polling).

This is how I do it.

                Schnittstelle = new SerialPort(\"COM3\"         


        
相关标签:
2条回答
  • 2020-12-03 02:38

    You will have to add an eventHandler to the DataReceived event.

    Below is an example from msdn.microsoft.com, with some edits: see comments!:

    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM1");
    
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
    
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
        mySerialPort.Open();
    
        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }
    
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Debug.Print("Data Received:");
        Debug.Print(indata);
    }
    

    Everytime data comes in, the DataReceivedHandler will trigger and prints your data to the console. I think you should be able to do this in your code.

    0 讨论(0)
  • 2020-12-03 02:58

    you need to subscribe to the DataReceived event before opening the port, then listen to that event when triggered.

        private void OpenSerialPort()
        {
            try
            {
                m_serialPort.DataReceived += SerialPortDataReceived;
                m_serialPort.Open();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message + ex.StackTrace);
            }
        } 
    
        private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            var serialPort = (SerialPort)sender;
            var data = serialPort.ReadExisting();
            ProcessData(data);
        }
    

    Serial, when there is data in the buffer, the data received event is triggered, this doesn't mean that you got all your data at once. You may have to wait for number of times to get all of your data; this is where you need to process the received data separate, perhaps keep them on cache somewhere, before you do the final processing.

    0 讨论(0)
提交回复
热议问题