私は新しいシリアルポートを作成し、それを開くプライベート関数を持っています。時々、私はアプリケーションを終了する "安全なハンドルが閉じられました"例外を取得します。さて、私はいくつかのオプションの修正を読んでいて、あなたの経験から、私のコードで本当の問題かもしれないものを知りたいと思っています。 1)_serialPort
変数をこのプライベート関数の範囲外に定義する必要があります。 2)シリアルポートのreadTimeoutプロパティは無限ではありません。 3)上記のusingステートメントは、portName
変数を削除します。安全なハンドルが閉じられました - 修正する多数のオプション
SerialPort _serialPort;
string[] devices =
ConfigurationManager.AppSettings["GasAnalyzerDeviceName"].Split(',');
string portName;
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"))
{
portName = (from p in searcher.Get().Cast<ManagementBaseObject>()
let c = "" + p["Caption"]
where c != null
where devices.Any(d => c.Contains(d.Trim()))
from pn in SerialPort.GetPortNames()
where c.Contains(pn)
select pn).FirstOrDefault();
}
if (portName == null)
portName = ConfigurationManager.AppSettings["GasAnalyzerPortName"];
if (portName == null)
throw new Exception("Gas port not found");
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
// Set Serial port properties
_serialPort.PortName = portName;
_serialPort.BaudRate = 115200;
_serialPort.DataBits = 8;
_serialPort.Parity = Parity.None;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = Timeout.Infinite;//1200;
_serialPort.WriteTimeout = 1200;
ありがとう!
コードの実際の問題は、あなたの質問に投稿されていないということです。 – Guy
@Guy、それは今、それに問題がありました。ありがとう。 – NettaD
どのラインが例外を投げていますか? – mjwills