8

シリアルポートを読みたいのですが、データが来るときだけです(ポーリングしたくない)。

これが私のやり方です。

                Schnittstelle = new SerialPort("COM3");
                Schnittstelle.BaudRate = 115200;
                Schnittstelle.DataBits = 8;
                Schnittstelle.StopBits = StopBits.Two;
             ....

そして、私はスレッドを開始します

             beginn = new Thread(readCom);
             beginn.Start();

私のreadComでは、連続して読んでいます(ポーリング:()

private void readCom()
    {

        try
        {
            while (Schnittstelle.IsOpen)
            {

                Dispatcher.BeginInvoke(new Action(() =>
                {

                    ComWindow.txtbCom.Text = ComWindow.txtbCom.Text + Environment.NewLine + Schnittstelle.ReadExisting();
                    ComWindow.txtbCom.ScrollToEnd();
                }));

                beginn.Join(10);

            }
        }
        catch (ThreadAbortException) 
        {

        }

        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

割り込みが来たら読んでほしい。しかし、どうすればそれができますか?

4

2 に答える 2

36

DataReceived イベントに eventHandler を追加する必要があります。

以下は msdn.microsoft.com からの例で、一部編集されています:コメントを参照してください!:

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);
}

データが受信されるたびに、DataReceivedHandler がトリガーされ、データがコンソールに出力されます。コードでこれを行うことができるはずだと思います。

于 2013-04-25T13:14:31.573 に答える
5

ポートを開く前に DataReceived イベントをサブスクライブし、トリガーされたときにそのイベントをリッスンする必要があります。

    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);
    }

シリアル、バッファにデータがある場合、データ受信イベントがトリガーされます。これは、一度にすべてのデータを取得したことを意味するものではありません。すべてのデータを取得するには、何回か待たなければならない場合があります。これは、最終的な処理を行う前に、受信したデータを個別に処理する必要がある場所です。おそらく、どこかにキャッシュしておいてください。

于 2013-04-25T13:27:19.267 に答える