none
C# 2010で、スリープからの復帰時のシリアルポートの処理 RRS feed

  • 質問

  • PCがスリープから復帰する際の、シリアルポートの処理で助けてください
    シリアルポートをOpenしたまま、PCがスリープモードに入り、そこから復帰した際、OSはシリアルポートを閉じてしまいます
    その際にいったんプログラム中でもクローズにしようとすると、システムクラッシュになります
    try{
    sr.Close();
    ・・・・
    }catch(Exeption ex){
    }

    としても、catchを終了したところでプログラムがクラッシュします
    以下のような感じで、リード関数がエラーが発生します

    using System.IO.Ports;

    /// <summary>シリアルポート</summary>
    private SerialPort _srPort;

    foo()
    {
        ・・・
        //受信スレッド
        try{
            ・・・
            while(true){
                iDataLen = _srPort.Read(barrTmp, 0, readSize);    //復帰時にシリアルポートが閉じているのでここでスローが発生
                ・・・
            }
            ・・・
        }catch(Exeption ex){//ex.Message=ファンクションが間違っています
            //シリアルポート終了
            if (_srPort != null) {
                _srPort.Close();        //ここでクラッシュ(try~catchをさらに入れてもcatchを終了したところでやはりクラッシュ)
                _srPort.Dispose();
                _srPort = null;
            }
        }
    }

    ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    これを以下のように、
    シリアルポートをクローズする前に、
    無理矢理ウエイトを入れるとクラッシュの頻度は減ります

    using System.IO.Ports;

    /// <summary>シリアルポート</summary>
    private SerialPort _srPort;

    foo()
    {
        ・・・
        //受信スレッド
        try{
            ・・・
            while(true){
                iDataLen = _srPort.Read(barrTmp, 0, readSize);    //復帰時にシリアルポートが閉じているのでここでスローが発生
                ・・・
            }
            ・・・
        }catch(Exeption ex){//ex.Message=ファンクションが間違っています
            //シリアルポート終了
            if (_srPort != null) {
                for (int i = 0; i < 10; i++) {                    //ここを追加
                    Thread.Sleep(100);                            //ここを追加
                    System.Windows.Forms.Application.DoEvents();//ここを追加
                }                                                //ここを追加
                _srPort.Close();        //大夫クラッシュする頻度は減るが、相変わらずクラッシュは発生する
                _srPort.Dispose();
                _srPort = null;
            }
        }
    }

    ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    上記のようにすれば、クラッシュの頻度は減りますが
    無くなるわけではありません
    スリープから復帰する際の、OSからのハードウェアの初期化が間に合っていないようなのですが
    この様なときは、どのようにシリアルポートを終了するのが正しいのでしょう

    2016年3月18日 6:28

回答

  • こんにちは。

    以下と似たようなケースでしょうか。
    スリープに入るときに通信をOFFにする(ポートを閉じるDisposeする)対応を取っているようです。これでどうでしょうか。

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=45106&KLOG=76


    • 編集済み ichiethel 2016年3月18日 6:49
    • 回答としてマーク いちろう 2016年6月11日 13:57
    2016年3月18日 6:47

すべての返信

  • こんにちは。

    以下と似たようなケースでしょうか。
    スリープに入るときに通信をOFFにする(ポートを閉じるDisposeする)対応を取っているようです。これでどうでしょうか。

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=45106&KLOG=76


    • 編集済み ichiethel 2016年3月18日 6:49
    • 回答としてマーク いちろう 2016年6月11日 13:57
    2016年3月18日 6:47
  • ありがとうございます。
    復帰を検知していったん全ての通信を終了しないとだめでした
    2016年6月11日 13:57