none
serialPortのOpen、Closeについて RRS feed

  • 質問

  • 1.組み込み系のアプリケーションでserialPortの読み書きを頻繁に

     行うプログラムを作っていますが、public Form1()のあとにserialPort1.Open();

     で開きっぱなしにしていますが、ゴミがたまるのかどうかはわかりませんが、

     数十回データ要求リクエストを発行していくと

     private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

     の読み込みが途中から動作しなくなっています。

     ソースの中に頻繁にserialPort.Open();Close()をイベント単位で入れた方がいいのでしょうか?

     ちなみにThread.Sleep(x)でタイマ入れていますがそれが原因とも思えません。

      Open()、Close()は頻繁にした方がいいのか押してください。

     多分、ニッチな領域かと思いますが、経験のある方がいらっしゃったら教えてください。

     

    2.送信イベントと受信イベントはクラスライブラリで定義することは可能なのでしょうか?

     クラスに定義して試しましたが、当然、serialPortのオブジェクトがないとエラーとなりました。

     (初歩的な質問で申し訳ありません。serialPortを使う時のパフォーマンスの改善方法はないでしょうか?

     Threadのせいとも思えませんが処理速度が格段に落ちてしまします)

     

     

     

    2008年5月3日 13:17

回答

  • 2つとも自己解決しました。

     

    クラスに定義する方法がわかりましたので、それによりパフォーマンスは格段に進歩しました。

     

    有難うございました。

     

    2008年5月24日 3:56

すべての返信

  • 1.については、以下が参考になるかもしれません。

     

    SerialPortのDataReceivedイベントについて
    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=468267&SiteID=7

     

    2.については、実現されたいことがはっきりわからないのですが、可能だと思います。
    例えばクラスライブラリ側で独自のイベントを定義し、serialPortオブジェクトは内部に持つか外から与えてもらえば良いでしょう。

    2008年5月3日 15:14
    モデレータ
  • trapemiyaさん。難うございます。

     

    エラーの発生部分に関しては、役に立ちました。

     

    でもちょっと症状が違って、12msぐらいの間に頻繁にWriteとRecieveが(多くても100バイト)通信の

    やり取りを頻繁に発生していると、Recieveイベントがフリーズしてしまうようです。

     

    バッファをクリアするために、Open()とClose()を繰り返したほうがいいのかなと思っています。

     

    取りあえずバッファをClearする方法がほかにあればと思います。

     

    2008年5月4日 11:56
  •  よっし さんからの引用

    でもちょっと症状が違って、12msぐらいの間に頻繁にWriteとRecieveが(多くても100バイト)通信の

    やり取りを頻繁に発生していると、Recieveイベントがフリーズしてしまうようです。

    バッファをクリアするために、Open()とClose()を繰り返したほうがいいのかなと思っています。

    取りあえずバッファをClearする方法がほかにあればと思います。

     

    少なくとも、私のところでは正常に動作します。

    頻繁にOpenとCloseを繰り返さねばいけないことはありません。

     

    まず。

     

    日本語がよくわかりませんが、12msecの間に「頻繁に」100バイトの送受信をするのですか?

     

    12msecの間に100バイトをコンスタントに送信するのに、

    100/0.012*10 = 83 kbps

    の速度が必要です。

    「頻繁に」するのでしたら「頻繁」の度合いに応じてより早い速度のシリアルポートを使わないといけません。

     

    手元のシリアルポートでは、100kbps程度までしかでません。

     

    また、

    > Recieveイベントがフリーズしてしまうようです。

    Receiveイベントとは何ですか?

    DataReceivedイベントならありますが、これはイベントなので、

    イベントが起きなくなることはありえてもフリーズするというのは意味が分かりません。

     

    Readのことでしょうか?

    それなら、ブロックしてしまって戻らなくなることはありえます。

     

    > 取りあえずバッファをClearする方法がほかにあればと思います。

     

    ないことはないと思いますが、必要を感じません。

     

    > バッファをクリアするために、Open()とClose()を繰り返したほうがいいのかなと思っています。

     

    やめたほうがいいでしょう。

     

    頻繁にOpen/Closeをしていたら速度がでません。

    ハードウェア、低レベルの実装、.Net Frameworkがおかしい可能性はもちろんありますが、

    疑う順番としてはユーザーのコードが最初です。

     

    アプリケーションが通信プロトコルにきちんとしたがっているか、

    転送エラー発生時にきちんと対応しているか、

    同期を間違っていないか、

     

    そういったことをもう一度検証してみることをオススメします。

    2008年5月7日 8:41
  • 2つとも自己解決しました。

     

    クラスに定義する方法がわかりましたので、それによりパフォーマンスは格段に進歩しました。

     

    有難うございました。

     

    2008年5月24日 3:56