• ベストアンサー

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

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

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

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

> read関数を何回も受信することになりますか? > それとも一回だけread関数をじっこうすることによりできるのでしょうか? 知らんよそんなの。 少なくとも35msのうちに1024byte取り込まんならんのだけは確か。 相手側機器が用意できなくても 折り返しケーブルが用意できるなら、 「10秒ごとに190011Byte送信する」小さなアプリ作って 試せばいいやん。

その他の回答 (2)

  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.3

普通はシリアルポートの読み書きをする関数なら、データを受信してそれが受信バッファに書き込まれた時にイベントが発生するので、そのイベントの処理の中で受信バッファを読みに行くわけでしょ?バッファサイズが1KBだから、一度に読み込めるデータは最大でも1KBと言うことになり、欲しいデータの190011Byteに対してバッファの方が小さい、すなわち受信イベントの処理は何度も発生することになります。 イベントが発生した時、受信バッファに入っているデータ量は1KB以下の不定な量(受信処理が十分に早ければバッファの半分も行かないはず)であり、読み取り関数で読むと実際に読めた量を教えてくれるか、違う関数でバッファに入ってるデータ量を調べ、その分だけ読み取り関数で引っ張ってくるか、まあその辺でしょう。そうやって必要なデータを複数回に分けて読み込みます。 もし読み取りが間に合わないと受信バッファオーバーフローで例外が発生するから、その場合は相手方に再送要求を送るなり、後続のデータ列を読み捨て続けるなりして、次に備えます。オーバーフローが頻発するんだったら受信バッファを大きくするか、処理を見直すか…

回答No.1

スレッドを起こし、そいつが受信に専念すれば。

hanyu-yuugo
質問者

補足

ご回答ありがとうございます 中の処理になりますが、 read関数を何回も受信することになりますか? それとも一回だけread関数をじっこうすることによりできるのでしょうか? ご回答お待ちしております

関連するQ&A

  • パリティビット有無での速度

    初めまして、現在私はLINUX PCで 開発環境QTを使用しプログラムを組んでいます。 今回シリアル通信の速度について疑問が生まれましたので質問させていただきました。 ボーレート値:230400bps データ長:8bit で通信を行っているのですが、 今回の仕様としまして10秒ごとに190011バイト送信するようなプログラムを組んでいます。 また190011バイトを受信するようなプログラムも作成しています ノンパリティ設定で そこで処理速度を見ていると、 送信側のプログラムで、最初のデータ送信開始から最後のデータ終了までの時間を見ると9300msでした 受信側は9400msでした。 次にパリティビット有の設定で、上記と同じ試験を行ったのですが、送信側の処理速度が9300ms 受信側は9400msでした。 質問ですが、パリティを付加すると今回の場合で行くと190011バイトを10秒ごと(一気に送信は到底無理なので分けて送信しています)に送信するので、パリティビットが付加されると、単純に190011ビット増えることになります。今回のボーレート値は230400bpsなので、パリティ有とパリティなしでは0.7秒も差があることが計算でわかりました。 しかし今回の値を見るとさほど時間が変化していないことがわかりました。 そのようなことがあるのかわかりません。理由があるのならばわかりたいと思い質問させていただきました。 どうかよろしくお願いします。

  • Arduino シリアル通信でのバイナリ受信

    詳しい方教えてください。 送信元のPCから、受信側のArduinoへ、シリアル通信によってバイナリデータを送ることで、Arduino側でのサーボモータのシリアル駆動を試みています。 PC側からのバイナリデータ送信はVB.NET側で作成済みで、USB-TTLコンバータ(FTDI Basic Breakout 5V)を使ってのサーボモータのシリアル駆動は問題ありません。 (http://micono.cocolog-nifty.com/blog/2011/04/arduino11-17d5.html と同じ処理と思ってください。) 同様な処理を、PC-Arduinoで駆動させようと思っていますが、 void loop() { int c; if (Serial.available() > 0){ c = Serial.read(); ・・・・ こちらでは、Cの値がint型の為かうまくいきません。(キャストも試しましたが・・) そもそも1バイトデータの受信Serial.read()が、int型(2バイト)なのか判りません。 方法はありますでしょうか。

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

    現在、シリアル通信をする(受信のみ)プログラムを作成しています。 接続先は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

  • シリアル通信のデータ欠けについて

    シリアル通信のデータ欠けについて教えてください。 WindowsXP上でシリアル通信「115200bps、8、None(ODD、EVEN)、1」の設定で、1ms毎に12バイトの送受信を行っているのですが、1分ほど受信すると、データ欠けが発生します。 受信プログラムはこの問題が発覚してから、受信したデータを変数にバッファリングし、保存ボタンを押してから、ログファイルへ保存するシンプルなプログラムを作成し、確認しています。 「切り分けた内容」 1、57600bpsでも発生する 2、VB6、VisualStudio2008 C#で作成したツール及びフリーソフト(SerialDebugger)でも、データ欠けが発生する 3、RS232Cラインモニタ(キャロちゃん)で確認すると、データ欠けは発生していないので、受信側の問題と判断しています。 4、送信間隔を50msと遅くしても発生する 5、RS232C及び、USB変換したものどちらでも発生する 6、9600bpsでは、発生しない(同じデータ数での判断) 7、ケーブル長は1mほど ちなみに通信時間に余裕が無い為、チェックサムやハンドシェイクなどの機能は、入れられません。 一般的にWindowsでシリアルの高速受信を行うと、データ欠けが発生するのが当たり前なのでしょうか?

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

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

  • シリアル通信の原理について

    シリアル通信の調歩同期式は、「伝送を開始する際にまずスタートビットを送り、続いて一文字分のデータ(7~8ビット)、パリティビット、最後にストップビットを送る。」と多くのウェブサイトで解説されていると思います。 またビットレートも1200bps/2400bps/4800bps/9600bps・・・など複数あると思います。 上記仕様については理解しているのですが、これらを実現する具体的な仕組みが分かりません。 具体的には、 1.受信側は送信側のビットレートをどのように知るのでしょうか? 2.同様にデータが7ビットと8ビットのどちらであるかをどうやって判断するのでしょうか? 3.受信側は送られてきたデータのビットを1バイト毎にレジスタやメモリに格納すると思うのですが、1つのプログラムにつきどこからどこまでが該当のデータであるかをどうやって判断するのでしょうか?(送られてくる全体のデータサイズをどうやって知るのでしょうか?) ググっても上記の具体的な解説が見つからず、理解できずにおります。 ご回答どうぞよろしくお願いします。

  • C#で仮想COMポートのシリアル通信

    Windows C#などを用いてマイコンボードとUARTで通信するアプリを作成しています. 従来は20bit程のデータを38400bpsで50回/sec程度受信して、グラフ表示していました. 今回新たに1000回/sec程受信したいと考えています. 高速シリアルで検索すると以下のような商品が見つかり、ハード的には高速で通信できるようでした. https://strawberry-linux.com/catalog/items?code=50028 C#ではserialPort_DataReceivedイベントでバッファーのデータを配列に取り込み、\r\nを受信した時点で処理-->グラフ表示を実行しています. 上記のプログラムでは50回/secでもデータの取りこぼしがあります. 高速でシリアル通信を行う場合はどのように追プログラムを作成することが定石なのでしょうか?ドライバの開発などを行う必要があるのでしょうか?

  • VB2005 で複数チャンネルのシリアル通信処理

    初めて投稿します、VB2005への初心者です。 複数ポートでシリアル通信を同時に送受信を行おうといているのですが 旨く出来ません。 comm1をOPENして受信を行うとcomm2の受信が行えなくなります。 逆にcomm2から行っても最初にOPENしたcomm1側の受信処理が行えなくなってしまいます。 複数のcommを使用しての処理はどのようにしているのかご教授お願いします。

  • 高速シリアル通信での大容量のデータ転送について(mscomm)

    現在高速シリアル通信のプログラムを作成しています。なかなか検索で いろいろと探しているのですがデータ容量が増えるとどうしてもサンプル プログラムで同じ結果になってしまいます。 どういう現象かといいますと10000バイトぐらいのデータを転送するとどう してもデータ上のかけ落ちが発生します。 ボーレート:38400 or 19200bps データビット:8Bit パリティ:なし ストップビット:1Bit フロー制御:XonXoffRTSCTSあり データはバイナリィ転送です。 ==>送信側のプログラムでは以下通りです。   'バイナリデータファイルを読み込み For i& = LBound(bytBuf) To UBound(bytBuf) bytedata(LineCnt) = bytBuf(i&) If (LineCnt < 255) Then '255バイトずつ分割して送信 bytedata(LineCnt) = bytBuf(i&) Else 'タイマー処理(wait制御) MSComm1.Output = bytedata LineCnt = 0 bytedata(LineCnt) = bytBuf(i&) End If LineCnt = LineCnt + 1 Next i& 'WAIT掛けたり分割してデータを転送したり一括でデータを転送したり 行っています。 ==>受信側では以下の通りとなっております。 Select Case MSComm1.CommEvent    Case comEvReceive '受信データの取得 Buffer = MSComm1.Input 'あとはバイトデータを結合させて                    'おります。 データの送信や受信について教えていただきたいのですが特に受信側で 私が思うのでは送信データが早すぎて受信側が追いついていない状態 と思うのですが・・・ なにかいい方法や参考になるホームページ等がありましたら伝授お願いします。

  • シリアル通信について

    質問です。 仕事でシリアルプリンタをMSCommで制御しています。 開発環境はVB6(SP5),XPです。 MSCommにて印字データを一度に沢山送ると情報落ち(?)した印字内容になってしまいます。多分プリンタ内のバッファ(みたいなもの)が一杯になるかして、プリンタの処理能力が限界なのかと勝手に思ったりもしています。 ちなみに10秒間隔くらいで送れば大丈夫です。 一方、シリアル通信の実験としてTera Termを使用しています。Tera Termだと一度に沢山のデータを送っても問題ないです。Tera Termはそこらへんを制御しているのでしょうか? また、MSCommにもそのようなことができるのでしょうか? よくわからない質問かもしれませんが、どんな些細なことでも結構ですのでご教授願います。

専門家に質問してみよう