5

定期的に (通常は 1 日 1 回) シリアル ポート経由で外部デバイスと通信する .NET 4 Windows サービスを作成しました。全体として、このサービスはうまく機能しますが、1 人の顧客に対して、時々 を呼び出すとSerialPort.Open()、次の例外がスローされます。

System.IO.IOException: 要求されたサービスを完了するためのシステム リソースが不足しています。
System.IO.Ports.InternalResources.WinIOError (Int32 errorCode、文字列 str) で
System.IO.Ports.SerialStream..ctor (文字列 portName、Int32 baudRate、パリティ パリティ、Int32 dataBits、StopBits stopBits、Int32 readTimeout、Int32 writeTimeout、ハンドシェイク ハンドシェイク、ブール値の dtrEnable、ブール値の rtsEnable、ブール値の discardNull、Byte parityReplace) で
System.IO.Ports.SerialPort.Open() で

例外に基づいて、サーバーのリソースが不足していると考えるでしょうが、そうではないようです。CPU は多かれ少なかれアイドル状態であり、十分なメモリとディスクがあります。

SerialPort.Open()他の IOExceptions をスローすることについてオンラインで多くの言及があり、Zach Saw の SerialPortFixerを実装しましたが、別の問題が修正されたようです。

これが私がやっていることの例です(非常に単純化されています)。このクラスのいくつかのインスタンス (異なるシリアル ポート名を使用) が常にメモリ内にあり、Run() メソッドが各インスタンスに対してほぼ 1 日に 1 回呼び出されます。

public class Collector
{
    private SerialPort _port;
    private string _portName;

    public void Run()
    {
        try
        {
            // Run Zach Saw's IOException workaround
            SerialPortFixer.Execute(_portName);

            using (_port = new SerialPort(_portName, 9600, Parity.None, 8, StopBits.One))
            {
                _port.DataReceived += PortDataReceived;
                _port.ErrorReceived += PortErrorReceived;
                _port.Handshake = Handshake.None;
                _port.DtrEnable = true;
                _port.RtsEnable = true;

                _port.Open();
                // Do the stuff
                _port.Close();
            }
        }
        catch (Exception e)
        {
            // Handle exception
        }
    }

    private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // Do other stuff
    }

    private void PortErrorReceived(object sender, SerialErrorReceivedEventArgs e)
    {
        // Log error
    }
}

どんな助けでも大歓迎です。

4

4 に答える 4

3

この質問に対する答えは、クライアントが使用するシリアル ポート サーバーが Wi-Fi バージョン (Moxa NPort W2150 Plus) であり、シリアル ポート サーバーに Wi-Fi 接続の問題がある場合に例外が発生することが判明したことです。

于 2013-06-28T08:36:55.453 に答える
0

NPort 5150 でも同じ問題がありました。(NPort Administrator で) ネットワーク タイムアウトを増やすと、問題が解決しました。

于 2015-01-30T10:20:52.047 に答える
0

私は最近同じ問題を抱えていました。私にとっての解決策は、ヌル モデム DB9 ケーブルを必要とするデバイスで誤ってストレート DB9 ケーブルを使用していたことでした。ヌル モデム ケーブルに交換すると、エラーは消え、デバイスは正常に機能しました。

私が Moxa に電話したとき、彼らはこの問題につながる可能性のある他の方法を試してみることを提案しました。

  • ウイルス対策ソフトウェアが通信を妨害している可能性があります
  • COM ポートを設定するときは、Nport Administrator ではなく Driver Manager Utility を使用してみてください (Windows マシンの場合)。
于 2017-05-09T19:49:11.690 に答える