6

USB-GPS と通信するアプリケーションがあります。何も起こらなければ、それは魅力として機能しています。しかし、私には大きな問題があります。USB が引き抜かれると、プログラムが (時々) クラッシュします。必要な場所に Try/Catch がありますが、この IOExeption はキャッチされません。「デバイスがコマンドを認識しません」というメッセージが表示され、プログラムが停止します。ポートを開始するコードは次のとおりです。

        public LatLongFromGPS(Form1 parent)
    {
        this.parent = parent;
        String port;
        this.SPort = new SerialPort(port, 4800);
        this.SPort.ReadTimeout = 500;
        this.SPort.DataReceived += new SerialDataReceivedEventHandler(dataReceived);
    }

    public bool checkIfPortsOpen()
    {
        return (this.SPort.IsOpen);
    }

    public void openPort()
    {
        try
        {
            if (!this.SPort.IsOpen)
            {
                this.SPort.Open();
            }
        }
        catch(Exception ex)
        {
            parent.LoggIt.WriteLogg("OPENPORT " + ex.ToString(), Logger.LoggType.Debug);
        }
    }

    public void dataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            if (SPort.IsOpen)
            {
                String GPGGAString;
                Thread.CurrentThread.Join(200);
                buffert = new char[this.SPort.BytesToRead];
                this.SPort.Read(buffert, 0, buffert.Length);
                GPGGAString = findStringFromGPS();
                if (GPGGAString != null)
                {
                    getLatitudefromString(GPGGAString);
                    getLongitudefromString(GPGGAString);
                    getTimeFromString(GPGGAString);
                    this.newData = true;
                }
            }
        }
        catch(Exception ex)
        {
            parent.LoggIt.WriteLogg("GPSERROR    " + ex.ToString(), Logger.LoggType.Debug);
        }
    }

次に、これをタイマーに入れて情報を確認します

if (this.LatLong.newDataReceived())
   {
        //DOING STUFF
   }

if (!this.LatLong.checkIfPortsOpen())
       this.LatLong.openPort();

クラッシュを止める方法について何か提案はありますか?

[編集] スタック:

at System.IO.Ports.InternalResources.WinIOError(Int32, System.String)

at System.IO.Ports.InternalResources.WinIOError()

at System.IO.Ports.SerialStream.Dispose(Boolean)

at System.IO.Ports.SerialStream.Finalize()
4

2 に答える 2

1

ここに当てはまるかどうかは完全にはわかりませんが、アプリドメイン レベルで全体的なクラッシュをキャッチするメカニズムがあります - http://msdn.microsoft.com/en-GB/library/system.appdomain.unhandledexception.aspx

(ThreadException などの他のイベントに関するセクションではなく、状況によっては独自のハンドラーが必要になる場合があります)

于 2013-02-19T14:08:02.933 に答える
0

ベスト プラクティスではありませんが、トップレベルの例外処理によって問題が解決する場合があります。例については、 http://richnewman.wordpress.com/2007/04/07/top-level-exception-handling-in-windows-forms-applications-%E2%80%93-code-listing-1/を参照してください。

于 2013-02-19T14:24:28.537 に答える