いくつかの簡単なコマンドを Arduino に送信する C# プログラムを作成しています。USBシリアル仮想ポート経由。
コードが try/catch ブロックで保護されていても、プログラムがハングすることがあります。
問題を見たとき、問題はポートを閉じることにあるようです。
関数は非常に単純です。
void Send() {
try {
Debug.WriteLine("SR1 "+rel+" "+status);
_serialArduino.Open();
Debug.WriteLine("SR2");
_serialArduino.WriteLine(string.Format("switch {0} {1}\n", rel, Convert.ToSByte(status)));
Debug.WriteLine("SR3 '"+_serialArduino.ReadLine()+"'");
_serialArduino.Close();
Debug.WriteLine("SR4");
Thread.Sleep(400);
} catch (Exception e) {
LogManager.Write(string.Format("ERR SwitchRel({0}, {1}) - {2}", rel, status, e.Message));
}
}
Close 関数中の問題について読みましたが、この場合、DataReceived イベント ハンドラーが定義されていません (==null)。
何か案が?
※一部内容を加筆修正しました※
数日間のデバッグとログ分析の後、次のことがわかりました。
- Win7Embedded Standard を実行しているデバイスで作業しています
- アプリケーションはC#で書かれています
- しばらくして(または、これまでのところ不明なことが原因である可能性があります)、Arduinoを接続しているポートが列挙されたポートのリストから消えました
- プログラムは最初にログに「デバイスが切断されました」と報告し、次に「ポートCOM9が存在しません」というメッセージを報告します
- デバイス マネージャーは、「ポート」ツリーで COM9 を報告します (!!)
- プログラムを終了して再実行すると、「COM9 が存在しません」と報告され、ポートを一覧表示しても COM9 は表示されません
私の推測では、usbser ドライバーがめちゃくちゃになっていると思います。
これまでの唯一の解決策は、ボードをリセットすることです。
再起動せずにドライバーをリセットし、既知の状態に戻るかどうかを確認する方法はありますか? それとも、ポートを検出しない DotNet Framework ですか?