シリアルポートを読み取りたいが、データが来たときだけ(ポーリングはしたくない)。
これが私のやり方です。
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);
}
}
割り込みが来たときに読んでほしい。しかし、どうすればそれができますか?
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がトリガーし、データをコンソールに出力します。あなたはあなたのコードでこれを行うことができるはずだと思います。
ポートを開く前に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);
}
シリアル、バッファにデータがある場合、データ受信イベントがトリガーされます。これは、すべてのデータを一度に取得したことを意味するものではありません。すべてのデータを取得するまで何度も待たなければならない場合があります。これは、最終的な処理を行う前に、受信したデータを個別に処理する必要がある場所です。