私はSerialPortを使用してハードウェアとのインターフェースをとるC#マルチスレッドアプリケーションを持っています。serialport multithread unsolicitedメッセージ
プログラムは主にコマンドレスポンスシーケンスですが、内部エラーのためにハードウェアが迷惑な「RESET」メッセージを送信することがあります。このとき、ソフトウェアは特定の値を設定する一連のコマンドを送信して再初期化する必要があります。 (スレッドプールから)
つ以上のスレッドは、私はdatareceivedイベントで応答をチェックし、TryInitialize()にしてTakeSampleNowの他のスレッドはロック待ちができ
public class ALComm
{
private readonly AutoLoaderManager _manager;
private readonly AutoResetEvent dataArrived = new AutoResetEvent(false);
private SerialPort _alPort;
private string _alResponse;
.... Code to init _alPort and attach datareceived event etc
public void TakeSampleNow()
{
if (Monitor.TryEnter(_alPort, 1000)) //let's wait a second
{
_manager.MessageList.Enqueue("Try sampling");
try
{
Send("Command1");
string response = Receive();
switch(response)
{
case "X": blah blah..
case "Y": blah blah..
}
Send("Command2");
string response = Receive();
while(response != "OK")
{
Send("Command3");
string response = Receive();
Send("Command2");
string response = Receive();
}
}
finally
{
Console.WriteLine("Releasing port");
//Thread.CurrentThread.Priority = ThreadPriority.Normal;
Monitor.Exit(_alPort);
}
else
{
_manager.MessageList.Enqueue("Port is busy!!!");
}
}
public string Receive()
{
string inString = null;
dataArrived.WaitOne(1000);
inString = _alResponse;
return inString;
}
private void AlPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
_alResponse = _alPort.ReadLine();
//if (_alResponse.ToUpper().Contains("RESET"))
//{
// _alState = AlState.Reset;
// TryInitialize();
//}
dataArrived.Set();
}
private void TryInitialize()
{
Monitor.Enter(_alPort); //lock so other threads do not access samplenow during initialization
try
{
string response;
Console.WriteLine("Initializing ... The AutoLoader");
_alPort.DiscardInBuffer();
Send("CommandX");
response = Receive();
--- blah blah
_alResponse = "";
}
finally
{
Monitor.Exit(_alPort);
}
}
TakeSampleNow()を実行しようとすることができますロックを解除するには、_alResponseに "RESET"が含まれていて、メソッドから戻ってくる場合は、各応答をチェックする必要があります。それはそれをより複雑にします。
私はこれをよりうまくやり遂げることができます。私はそれが状態機械であると信じていますが、それを概念化することはできません。
迷惑な応答は大きな問題です。特に「リセット」と表示されたときは、「落ちてしまいました。あなたが努力する必要があるのは、そのような応答を*決して*得ることではありません。それがデバイスのものだったので、あなたがそれを得るときあなたのマシンを再起動します。 –
私もサービスを再開したいと思っています。しかし、それはブラウザによってユーザによって監視されるWindowsサービスです。 – cheedep