C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: RS232でのシリアル通信終了時について


(過去ログ 24 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■10984 / inTopicNo.1)  RS232でのシリアル通信終了時について
  
□投稿者/ あら (40回)-(2007/12/03(Mon) 18:16:24)

分類:[C#] 

お世話になっております。

シリアル通信の終了処理について質問があります。
デバッグモードで起動し終了すると、40~50回に1度終了時に【エラー内容】の例外が発生します。
どのように記述すれば回避できるのでしょうか?
ご教授、アドバイス等宜しくお願いします。

C# .NET2005

【エラー内容】
System.ObjectDisposedException はハンドルされませんでした。
  Message="セーフ ハンドルは閉じられています。"
  Source="System"
  ObjectName=""
  StackTrace:
       場所 Microsoft.Win32.UnsafeNativeMethods.SetCommMask(SafeFileHandle hFile, Int32 dwEvtMask)
       場所 System.IO.Ports.SerialStream.Dispose(Boolean disposing)
       場所 System.IO.Ports.SerialStream.Finalize()

----
【ソース】
[Form1.cs]
        private Thread TestThred;

        private void Form1_Load(object sender, EventArgs e)
        {
            PollingThrd polling = new PollingThrd();
            TestThred = new System.Threading.Thread(new ThreadStart(polling.StartPolling));
            TestThred.IsBackground = true;
            TestThred.Start();
        }
        
[PollingThrd.cs]
    public class PollingThrd
    {
        public void StartPolling()
        {
            int wait_time = 1000;
            TestSerialPort serialTest = new TestSerialPort();
            AutoResetEvent autoEvent = new AutoResetEvent(false);
            StatusChecker statusChecker = new StatusChecker();
            TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus);

            using (System.Threading.Timer stateTimer = new System.Threading.Timer(timerDelegate, autoEvent, wait_time, wait_time))
            {
                while (true)
                {
                    autoEvent.WaitOne();
                    serialTest.Start();
                }
            }
        }
    }

    public class StatusChecker : IDisposable
    {
        public StatusChecker()
        { }

        public void CheckStatus(Object stateInfo)
        {
            AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
            autoEvent.Set();
        }

        public void Dispose()
        { }
    }
    
[TestSerialPort.cs]
    public class TestSerialPort
    {
        string portName = "COM1";
        public TestSerialPort()
        { }

        public void Start()
        {
            using (System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort())
            {

                //設定
                serialPort.PortName = portName;
                serialPort.ReadTimeout = 500;

                try
                {
                    serialPort.Open();
                }
                catch (System.IO.IOException ee)
                {
                    return;
                }

                //てすと
                serialPort.Write("ABC");
                try
                {
                    string s = serialPort.ReadLine();
                }
                catch (TimeoutException)
                { }
            }
        }
    }

引用返信 編集キー/
■11003 / inTopicNo.2)  Re[1]: RS232でのシリアル通信終了時について
□投稿者/ れい (260回)-(2007/12/04(Tue) 07:32:33)
No10984 (あら さん) に返信
> デバッグモードで起動し終了すると、40~50回に1度終了時に【エラー内容】の例外が発生します。
> どのように記述すれば回避できるのでしょうか?

何をしてるコードなのか、ややこしくて私にはわかりません。
イベントとかスレッドとかタイマーとかいろいろ使ってますが、
無駄なものがあるように見えます。

諸事情あってこうなってるのだと思いますが、
とりあえず問題の再現する最低限のコードを提示したらよいと思います。
引用返信 編集キー/
■11025 / inTopicNo.3)  Re[2]: RS232でのシリアル通信終了時について
□投稿者/ あら (41回)-(2007/12/05(Wed) 08:30:42)
返信ありがとうございます。

どうも最低限のコードが最初に提示させていただいたコードのようで、それより短くしようとすると発生しなくなりました。。。
ですが、Form1でSerialPortをCloseすると例外が補足できるようになったので、とりあえず、例外が発生しても無視する方向にしようと思います。

ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -