- 締切済み
.NETの SerialPortクラスでデータ受信イベントを処理するには?
こんばんは。いつもお世話になっております。 Visual C++ 2005でSerialPortクラスを使ってシリアル通信をしたいのですが、データ受信イベントハンドラをどのように扱えばよいか分からず困っていますのでご教示ください。 HelpやMSDN、インターネット上で検索をして見つかるのはC#の例ばかりで、C++でどのように記述するのかが見つかりませんでした。 イベントやデリゲートなど、.NETで導入された(であろう)概念が出てきたり、^(ケット)記号が出てきたりと戸惑うことも多いのですが、きっと serialPort1->DataReceived += gcnew イベントハンドラを登録; // イベントハンドラの本体 private: System::Void serialPort1_DataReceived(System::Object^ sender, System::EventArgs^ e){ ほげほげ; } みたいな感じで書くのではないかと予想しています。 Visual Basic 6.0 でのシリアル通信はずっと使ってきました。 C/C++は使い始めて10年弱、C++/CLIは未経験です。(似て非なる言語?) よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
回答No.1
補足
episteme様、回答ありがとうございます。 大分いいところまで行っていたのですね! ということで、気を取り直してコンパイラが吐き出すえらメッセージと格闘した末、 // イベントハンドラの登録 this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived); // イベントハンドラの本体 private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e){ try{ // richTextBox1->Text = "hoge"; // ↑ これはやっちゃいけないらしい。 } catch(InvalidOperationException^ e){ } catch(TimeoutException^ e){ } catch(Exception^ e){ } } としたところ、コンパイルがとおり、データ受信時にはイベントハンドラが呼び出されることまで確認できました。(質問投稿時は、EventArgsの型が違っていてコンパイラに怒られていました。) しかし。データ受信イベントハンドラは別スレッドで動いているようで、1行コメントアウトしてある部分を使おうとすると、InvalidOperationException が発生してしまいます。受信したデータをフォームに渡すにはどうしたらいいでしょうか?