• ベストアンサー

C++でシリアル受信処理を教えて

表題のとおりC++でシリアルで受信処理を作成しようと思っています。 2つのスレッドで、片方のスレッドでデータを受信し、もう片方のスレッドでデータを解析、 という具合に受信と解析を同時並行して行うようなプログラムを組みたいのですがうまく いきません。 具体的なソースの書き方、またはそれらが記載されているサイトをご存知の方は 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

両者のスレッド間通信はどうやってるのかしら。 多くは producer-consumer-queue を使うものだけど。 1) queueを用意する、最大要素数はテキトーに決めて。 2) 受信スレッドは、”データを受信したら queueにpushする”を繰り返す。 3) 解析スレッドは 、”データをqueueから取り出し解析する。queueが空ならそこで待つ”を繰り返す。 2 と 3 が並行動作すれば、受信中に解析できますな。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++でシリアルの受信処理の作成

    C++でシリアルの受信処理を作成しようと思っているのですが データの受信とデータの解析を別スレッドに分けようと思っています。 データの受信スレッドでバッファにデータを受け取って行き、 データの解析スレッドでバッファのデータを解析しようと思っています。 データの受信スレッドについては作成できるのですが、解析について、受信スレッド側で データを受信しつつ、解析スレッドでデータの解析を行う解析スレッドはどのように 作れば良いでしょうか? もう少し具体的に、解析のスタート、解析するデータサイズ、解析のストップは どう指定すれば良いでしょうか

  • シリアル受信の取りこぼし

    C++で作成したシリアルの受信処理について 1.受信イベントを検知 2.ReadFileでデータ読み取り 3.データ解析 の動作をスレッドの中で行うようにしているのですが 大量のデータを受け取る時に、データの取りこぼしが発生します。 取りこぼしを防ぐ処理方法や設定などはないでしょうか

  • マルチスレッド処理でOutOfMemory

    こんにちは。現在javaによるバッチ処理で、一定時間ごとにメールを受信してその内容を解析してDBに登録する、と言うプログラムを組んでいます。 メールの受信は、POPアカウントごとにサーバに接続して受信すると言う仕様にしなくてはなりません。このため、POPアカウントごとにThreadを生成して並行処理で複数のPOPサーバに同時に接続してメールを受信する、と言う流れにします。 ここで問題なのが、タイトルのとおり、OutOfMemorryエラーが発生してしまうことなんです。おそらくThreadの生成の仕方に問題があるのではないか、と言う考えにいたりましたが、解決策がわからないので、ここで質問させていただきます。以下が、そのコードを簡略化したものです。以下の一連の処理が一定時間ごとに行われる想定です。 ~中略~ // POPアカウント情報をリストへ格納 List popAccountList = getPopData(); for(int i = 0; i < popAccountList.size(); i++){ PopAccount data = popAccountList.get(i); // PopAccountの一意のIdをスレッドにセットして生成 PopGetThread thread = new PopGetThread(data.popData); // スレッドの中で、メール受信処理が行われる。 thread.start(); try{ // 1つのスレッドが処理を終えるまで待つ thread.join(); }catch(InterruptedException ie){ } } ~続く~ こういう具合で、この処理を一定時間ごと(分単位)に、繰り返します。Runtime.getRuntime.totalMemory()などで、確認すると、周期処理が進むごとに、徐々に使用メモリが増えていってしまい、やがてOutOfMemoryになります。Threadがメモリを食いつぶしていることが原因ではないかと思うのですが、このような場合、どう解決すればいいのでしょうか。どなたかご教授いただけませんでしょうか・・お願いします。

    • ベストアンサー
    • Java
  • VB2005 シリアル通信のClose処理

    いつもお世話になっております。 表題の件につきまして、ご教示ください。 【処理内容】 メインフォームのボタンからポートをオープンし、 受信データ(1Byte)をテキストボックスに表示し続ける。 ※受信データは定期受信 通信をやめたいときにメインフォームのボタンから ポートをクローズする。 上記、クローズ時に、ほぼフリーズします。 原因はシリアル通信の受信イベントが別スレッドにて処理されているため、 Invoke()にてテキストボックスの更新をしており、 これが悪さをしているみたいです。 BeginInvoke()を使用するとフリーズは回避することができるのですが、 テキストボックスに表示される受信データの内容が激しく欠落してしまいます。 Invoke()を使いつつ、フリーズを回避する方法はないのでしょうか。 無知で大変申し訳ございませんが、よろしくお願いいたします。

  • シリアル通信 大きいサイズの受信処理

    シリアル通信 大きいサイズの受信処理で質問があります OS:LINUX 開発環境 QT5.3 今 相手側機器から10秒ごとに190011Byteのデータくるようなしようとなっています そこで質問ですが 受信側ではどのような処理を組めば10秒ごとに来るデータをすべて受信できるのか よろしくお願いします open関数やread関数などを使用しています ボーレート値は230400bpsです 送受信バッファは1024byteとなっています

  • シリアル通信について

    VB6にてシリアル通信プログラムを作成しましたが、データが受信できません。 ハイパーターミナルなら受信できて、一度ハイパーターミナルを使用すると、作成したプログラムでもデータが受信できるようになります。(再起動するとまたハイパーターミナルを使用するまで受信できません) 自作プログラムでなにか処理がたりないのでしょうか?

  • シリアル通信のイベント受信について

    現在VB6.0を使用してシリアル通信のプログラムを MsCommを使用せず、CreateFileを使用して行っておりますが、 データの受信を受信したタイミングでテキストボックスに表示したいのですが どの様にすると受信したタイミングでデータを取得できるのかわからず困っております。

  • C#のシリアル通信プログラムで文字化け

    Visual C#でRS-232のシリアル通信をするプログラムを作成しましたが、 受信データが文字化けを起こしてしまいます。 下のURLにソースを置いているので、どこが不味いのか教えてください。 http://www1.axfc.net/uploader/Sc/so/205741 よろしくお願いいたします。

  • C++マルチスレッド処理について

    こんにちは 現在スレッドを作成して,マルチスレッド処理をしようとしているのですが, 全然理解できないので皆様のお力をお貸し下さい。 やりたい事は, (1) メインスレッドからスレッド1を作成。 (2) スレッド1では,ひたすらファイルなどからデータを取得させる。(読み込めなくなるまで) (3) メインスレッドでは,時々スレッド1を止めて,再度処理を続行させたい。 class Sample { public: // Sampleオブジェクト作成,同時にスレッド1を作成 Sample* create(); // スレッド1を止めて,再度動かす void process(); private: // この関数をスレッド1で処理させる // 内部では,読み込めなくなるまで無限ループ? void get(); }; スレッドに関してはイメージが湧くのですが, mutex (必要ですか?) に関しては一向に理解できません。 何を排他制御するのでしょうか。オブジェクト? 関数? 複雑ではなさそうなのですが,今までシングルスレッドの処理のみ書いていたため ピンときません。 よろしくお願い致します。

  • シリアル通信プログラム(受信)について

    現在、シリアル通信をする(受信のみ)プログラムを作成しています。 接続先は1秒ごとに10バイトのデータを自動で送信してきます。 現段階でPC側でデータを受信できることは確認できました。 しかし、受信データが文字化け(出力結果が{や■などがでています)しており、その原因がわかりません。 どこが問題なのか教えていただけないでしょうか? また、接続先からは10バイトのうち最初の2バイトは固定の値(0x2b,0x22)がでてくるはずなのですが、それもでてきていません。これも文字化けで見えていないだけでしょうか? 文字化けしても周期的に固定の値に対応した文字がでてくるものだと思ったのですが、でてきていません。 (ソースで50バイトまでみているのはこの周期性を確認するためです) シリアル通信を初めてさわるので、考え方自体間違っているかもしれませんが 配列pszBufに1つずつ、受信された1バイトのデータが格納されていると思っています。 個人的にはprintfでの表記(%cがいけない?)に間違いがあるかと疑っています。 ご回答よろしくお願いいたします。 (環境) Visual C++ 2008 (C/C++) (シリアルポート設定) ボーレート 9600bps パリティ   なし ストップビット 1 データビット 8 (ソース) ※ポートの設定は省略。受信部のみ記述 HANDLE hComm; DWORD dwErrors; COMSTAT ComStat; char pszBuf[1024]; DWORD dwRead; ClearCommError(hComm, &dwErrors, &ComStat); ReadFile(hComm, pszBuf, 50, &dwRead, NULL);  //50バイトまでデータを取得 for(int i=0;i<50;i++){ printf("%c\n",pszBuf[i]); } (参考URL) http://www.geocities.jp/terukat/_geo_contents_/win/comm.html

このQ&Aのポイント
  • windows10の画面で時計が狂っている現象が発生しています。また、カーソルも異常な動きをしています。時計の位置やマークにカーソルを持っていくと選択ができず、↕マークが表示されます。
  • NEC 121wareを使用している際に、windows10の画面で時計が狂ってしまう問題が発生しています。さらに、カーソルの挙動も異常で、時計の位置やマークにカーソルを持っていくと選択できない状況になります。
  • 時計が狂ってしまい、カーソルの動作も異常です。windows10の画面上で、時計の位置やマークにカーソルを持っていくと選択できず、↕マークが表示されます。この問題はNEC 121wareを使用している環境で発生しています。
回答を見る