serialport DataReceivedイベント

3620 ワード

serialport DataReceivedイベント、デフォルトはbyteを受信するとイベントがトリガーされます.
            lock (thisLock)
            {
                int len = sp.BytesToRead;
                if (len > 0)
                {
                    Byte[] data = new Byte[len];
                    try
                    {
                        sp.Read(data, 0, len);
                    }
                    catch (System.Exception)
                    {

                    }
                    SerialPortEventArgs args = new SerialPortEventArgs();
                    args.receivedBytes = data;
                    Debug.WriteLine("**** port1_DataReceived=" + Encoding.Default.GetString(data));
                    if (comReceiveDataEvent != null)
                    {
                        comReceiveDataEvent.Invoke(this, args);
                    }
                }

            }

例えば、実際に返されるデータは*IDN?です.トリガの回数は毎回違います
**** port1_DataReceived=*
**** port1_DataReceived=IDN?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=DN?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=D
**** port1_DataReceived=N?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=D
**** port1_DataReceived=N
**** port1_DataReceived=?

**** port1_DataReceived=*
**** port1_DataReceived=IDN
**** port1_DataReceived=?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=DN?

DataReceivedイベントの処理は、本質的に受信データをスレッドで処理する.
SerialPortクラスは、関数の終了後にローカル変数が解放されるため、ローカル変数として定義しないでください.スレッドはまだ終了していないし、ポートはまだ解放されていない.次の2つの異常が発生します
System.ObjectDisposedException was unhandled
Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll
Additional 

information:   Safe handle

または
System.UnauthorizedAccessException was unhandled
  HResult=-2147024891
  Message= “COM5” 。