アプローチをポートからの応答があるとすぐに通知を受けるにはAutoResetEvent
が必要です。
SerialPort
FrameWorkのクラスには、統合されたDataReceived
イベントにいくつかの問題があります。利用可能な完全なパッケージがない場合(解答の長さを定義した場合)、時には解雇されることがあります。だからあなたはあなたが期待する答えの長さを調べるべきです。
私たちの非常にストリップダウン実装は:
public class Serialport
{
private SerialPort _serialPort;
private List<byte> _buffer;
private AutoResetEvent _autoResetEvent;
private const int WriteTimeOut = 5;
private event EventHandler ReceivedDataChanged;
public Serialport()
{
_serialPort = new SerialPort();
// set PortName, BaudRate etc
_serialPort.Open();
_serialPort.DiscardInBuffer();
_serialPort.DiscardOutBuffer();
_serialPort.DataReceived += ReceiveData;
}
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
var bytes = _serialPort.BytesToRead;
byte[] buffer = new byte[bytes];
if (_serialPort.IsOpen)
{
_serialPort.BaseStream.Read(buffer, 0, bytes);
_buffer.AddRange(buffer);
}
ReceivedDataChanged?.Invoke(this, new ReceivedBytesEventArgs(_buffer.ToArray()));
_buffer.Clear();
}
private void SendData(byte[] message, int answerLength)
{
_serialPort.ReceivedBytesThreshold = answerLength;
_serialPort.WriteTimeout = WriteTimeOut;
_serialPort.Write(message, 0, message.Length);
}
public string SendDataCommand()
{
if (_serialPort.IsOpen)
{
ReceivedDataChanged += InterpretAnswer;
SendData(message, length);
if (_autoResetEvent.WaitOne(100))
{
ReceivedDataChanged -= InterpretAnswer;
//Data Received and interpreted and send to the caller
return _requestAnswer;
}
ReceivedDataChanged -= InterpretAnswer;
}
return "Connection not open";
}
private void InterpretAnswer(object sender, EventArgs e)
{
// handle all interpretation
// Set the event
_autoResetEvent.Set();
}
}
SERIALPORTは、初期化して開かれました。その後、必要なすべてのイベントを結び、SendDataCommand()
メソッドに電話します。このメソッドは、一部のタスクから呼び出されるパブリックな可視メソッドです。これによりメソッドSendData
が呼び出されます。回答があるとすぐに、イベントがトリガーされ、解釈が開始されます。指定された時間内に解釈が行われた場合(_autoResetEvent.WaitOne(msToWait)
)、結果は呼び出し元のメソッドに返されます。 これは別のタスクで行う必要がありますので、応答を待つ間にUIはブロックされません
前述のように、これは非常に除外された例です。イベントにいくつかの問題があるので、SerialPortの受信ハンドラでさらにチェックを行う必要があります。このアプローチを使用すると、ビジネスロジックの抽象度がさらに向上します。
これが役に立ちます。
ありがとうございます – Ditn