0

だから私はこの問題と約1週間戦っていて、問題を知っていると思いますが、それが固定されるまでそこに答えを報告したくありません.

一言で言えば、コマンドを使用しようとすると IOException が発生しますSerialPort.Open()。結局のところ、これは非常に一般的であり、ほとんどの端末プログラムも実際にそうしていますが、単に無視しています。完全な物語については、上記の私の投稿を読んでください。今、私がやりたいことは、IOException を無視することですが、それでもシリアル ポートを開きます。try/catch でこれを行うことができないか、少なくとも方法がわかりません。

何かを試して、「問題がスローされることはわかっています。これは安全な問題であり、例外を無視してタスクを続行することを選択しています」と述べる方法があるのではないかと思っていました。明確にするために、エラーを無視して次に進みたくありません。エラーを無視して操作を完了したい。

以下は私の最善の推測ですが、うまくいきません。

        try
        {
            serialPort1.Open();               
        }
        catch (System.IO.IOException)
        {
            MessageBox.Show("An IO Exception occurred.");
        }
        finally
        {          
            //SAFELY IGNORE ERROR AND DO TASK ANYWAY HERE
        }

誰かがこれで私を助けることができれば、私は最も感謝しています.

serialport1.Open編集:後で コードを追加すると、次のようになります:IOException のスクリーンショット

これは基本的に、try/catch を使用しない場合と同じです。私がやりたいのは、これをやろうとしているということです。エラーがスローされてもかまわないので、とにかく実行してください。

4

3 に答える 3

5

一般に、例外を引き起こすコード行があり、例外が発生したかどうかに関係なく実行する必要がある追加の作業がある場合は、単に を使用しcatch、とにかく実行したいことをtry/の外 (後) に配置する必要がありますcatch


あなたの特定のケース(他の質問で説明されています)については、.NET である恐ろしい壊れ方を扱っていますSystem.IO.Ports.SerialPort。シリアルポートを開くことは成功しましたが、これSerialPort.Openは複雑な方法であり、余分なものがたくさんあり、その余分な (そして不要な) もののどれかが失敗した場合は、ポートを閉じることを要求します。他にも問題が見つかりましSystem.IO.Ports.SerialPortた (たとえば、内部デバイス名でポートを開くことができないなど)。IMO、早く取り除く System.IO.Ports.SerialPortほど良いです。

Win32 シリアル ポート関数を p/invoke するか (CreateFile残りはここにあります)、既にラッパー ライブラリを書いている人を見つけることができます (私は書きましたが、公開されていません)。

于 2013-02-21T23:22:13.780 に答える
0

SerialPort.Openから:

SerialPort オブジェクトごとに存在できるオープン接続は 1 つだけです。ポートがすぐに閉じられない可能性があるため、アプリケーションのベスト プラクティスは、Close メソッドを呼び出した後、Open メソッドを呼び出す前にしばらく待機することです。

ポートが無効な状態です。

  • また -

基になるポートの状態を設定しようとして失敗しました。たとえば、この SerialPort オブジェクトから渡されたパラメーターは無効でした。

これが起こっているに違いありません... SerialPort が最近開いていて、準備が整う前にもう一度開こうとしています。

私のアドバイスは、ループを作成し、オープニング試行の間に少しスリープすることです。どれくらいの期間、何回挑戦できるかを考えてみましょう。 break成功するとループから抜けます。

foreach(int i in Enumerable.Range(1, numberOfAttempts)
{
  try
  {
    serialPort1.Open();
    break;
  }
  catch(Exception ex)
  {
    //log attempt #i failed because of ex
  }
  Thread.Sleep(millisecondsToWait);
}
于 2013-02-21T23:36:43.973 に答える
0

serialPort1.Open();

例外をスローしているものです。通常、コーディング時に例外が発生した場合は、接続をクリーンアップします。

他の人が述べたように、この同じメソッドを呼び出し続けると、呼び出しに関することが変わらない限り、例外が発生し続けます。

それを理解した上で、serialPort1.Open(); 以外のシリアル ポートを開く他の方法を探すことをお勧めします。電話。C# には組み込み方法がある場合とない場合があります。だからあなたは創造的でなければならないかもしれません:)

于 2013-02-21T23:32:01.737 に答える