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

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

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

Re[2]: SerialPort使用後、Closeするとフリーズする


(過去ログ 89 を表示中)

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

■52825 / inTopicNo.1)  SerialPort使用後、Closeするとフリーズする
  
□投稿者/ kaze (10回)-(2010/08/24(Tue) 22:21:53)

分類:[C++/CLI] 

お世話になります。
VS2010でC++/CLIを使用しています。

RS232C使用後、Close時にフリーズしてしまう現象に悩まされています。
http://vsug.jp/tabid/63/forumid/46/view/topic/postid/9990/tpage/1/Default.aspx
を参考に、VC++2008EEとVC2010++EEにて以下を動作させてみたのですが、改善しませんでした。
この場合、どのようにすれば良いのでしょうか?
よろしくお願いします。

     private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
                                     serialPort1->PortName = "COM15";
                    serialPort1->Open();
             }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 if(serialPort1->IsOpen){
                     serialPort1->Close();
                 }
                 this->Close();
             }

    delegate void SetTextCallback(String^ text);
    private: void SetText(String^ text){
            if( this->textBox1->InvokeRequired )
            {
                SetTextCallback^ d = gcnew SetTextCallback(this, &RS232CTest::Form1::SetText);
//                this->Invoke( d, text );  // これでは Close時にフリーズする
                this->BeginInvoke( d, text ); // こっちが正解 → やっぱりフリーズする
            }
            else
            {
                this->textBox1->Text += text;
            }
        }

    private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
            String^ str;

            try{
                str = serialPort1->ReadLine();
                SetText(str);
            }catch(InvalidOperationException^ e){
                SetText(e->Message );
            }catch(TimeoutException^ e){
                SetText(e->Message );
            }catch(Exception^ e){
                SetText(e->Message );
            }
}

引用返信 編集キー/
■52826 / inTopicNo.2)  Re[1]: SerialPort使用後、Closeするとフリーズする
□投稿者/ オショウ (552回)-(2010/08/24(Tue) 22:42:15)
> RS232C使用後、Close時にフリーズしてしまう現象に悩まされています。

  フリーズが発生する構造(プログラム)なっているからです。

  DataReceivedで、いきなりReadLineしているのが原因
  です。

  ちゃんと、eのイベントの内容を吟味し、受信バッファに
  データが受信された時のみ、Readするように。

  あと、ReadLineでは、受信データのデリミタに0x0dや0x0d0x0aと
  コードがついてこないと、ReadLineから返ってきません。
  タイムアウトを設定すれば、抜けるでしょうが・・・

※ 1バイトも受信していない状態なら、クローズしたらフリーズ
  しないで閉じません?もしそれでもフリーズするならば、Open
  時にハンドシェークやいろいろな設定を、正確に行うべきです。

以上。参考まで
引用返信 編集キー/
■52902 / inTopicNo.3)  Re[2]: SerialPort使用後、Closeするとフリーズする
□投稿者/ kaze (11回)-(2010/08/27(Fri) 11:12:20)
返事が遅くなってすいません。
確認したところ、元のデータにゴミがあったこともあり、その為フリーズしていました。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -