0

いくつかの簡単なコマンドを 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 ですか?

4

0 に答える 0