• 締切済み

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

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

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.1

もの(信号波形)を見ていないので推測でしかないですが、 実際には、パリティ無しの場合、Start(1)/Data(8)/Parity(0)/Stop(1) = 10Bit なので、 1900110 Byte x 10 Bit / 230400bps = 8240ms が、Idle Time =0 usの時の速度かと思われます。 実際には、9300msかかったとするとこの差は、通信割込(送信バッファ空)から送信処理にかかるオーバーヘッド分ということかと思います。 (この辺りは、オシロスコープでTXD Lineをモニターすると、はっきりと分かります。) 使っているUARTの仕様によりますが、送信バッファエンプティの割込みだとすると、8Bitのデータを受け渡し、シフトレジスタが8回回ったところで割り込みが発生する(と思われる)ので、パリティビットの有無によらず、送信処理は一定のオーバーヘッドで回っているのではないかと推測いたします。 これを送信完了(Stop Bit送信完了時)の割込みとすると、パリティビットの有無で1Bit分の差が出てくるのではないかと思われます。 送信割り込みを使っていない場合でも、挿神事になんらか送信完了のステータスを見ているはずです。 参考: http://www.softech.co.jp/mm_050907_firm.htm 先の通りオシロスコープで、各キャラクター間のIdle Timeの波形が、 (1)パリティ有り無しの違い、 (2)送信バッファーエンプティ/送信完了の割込みのどちらをモニターしているかの違い でどの要に変わるか見てみると、はっきりとするかと思います。 (波形は全部見る必要はないです。送信キャラクターを全部同じ、もしくはパターンが顕著に違う二文字の繰り返しにして、典型的な2~3バイトの送信分だけで上記は分かると思います。) 自信はないですが、試してみる価値はあります。

関連するQ&A

  • IrDAにパリティはないのですか?

    UART⇔IrDA変換ICを使用して赤外線通信をしています。 この時マイコンでパリティを付加して送信すると、受信側で文字化けを起こしてしまいます。(パリティ無しの場合は正常) IrDAの規格では8ビットパリティなしで、パリティ付きはないのでしょうか? お手数おかけしますが、どうぞ、よろしくお願いします。

  • パリティーチェック

    次のような問題に出くわし、webとか図書館で調べましたが、よく分かりません。どなたか教えていただけると助かります。 問題: 一つの符号を4ビットの2進コードで表し、3個の誤り訂正符号を付加して送信たところ、1110100と受信された。送信コードのフォーマットは、それぞれp3はb2b1b0のパリティ、p2はb3b1b0のパリティ、p1はb3b2b1のパリティでありいずれも奇数パリティとする。またビット誤りは1ビットのみとする。 答えは、b2が誤りであり、訂正したコードは「1110000」だそうですが、アナログ頭では分かりません。宜しくお願いいたします。

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

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

  • 偶数パリティチェック

    基本情報技術者試験の勉強中で偶数パリティチェックをやりました。 その中で疑問がでてきました。 例えば偶数パリティチェックを採用します。 1101というデータにパリティビットを加えた11011を送信して 00011と受信されたとします。 このとき受信データでは1は偶数個となり、誤りがないとなってしまうと思いました。 しかし実際には誤りがあります。 こういうときはどうするのでしょうか?

  • 通信速度について

    通信速度は、64kbpsのようにビット/秒で表されていますが、実際に送信するファイルは***KB、つまりバイトですよね。 これは、例えば64kbpsのISDN回線を使用して8KBのデータを送信した場合、同時に他の人がこの回線を使用していなければ1秒(ビットを8で割った数値がバイトでよかったでしたっけ?)で送信完了するということですか? 更に、同時に2人で同じデータのものを受信した場合は、回線の容量から受信速度が2倍になると考えてよいのですか? おおざっぱな考え方としてあってますか?

  • 調歩同期方式で、パリティビットなしの3単位符号の受信について

    ”100101001111”というビット列を左側から受け取ったとき、このビット列が表すデータを受信した順番に1文字ずつ2進数で表したものが、なぜ、「010,011」になるのかわかりません。 ここで1文字はパリティビットなしの3単位符号、調歩同期方式です。 スタートビットは”0”、ストップビットは”1”です。 パリティビットがないとあるので、送信のときつけられるのは、スタートビットとストップビットだけです。スタートビットが0なので、”100101001111”を左から見てみると、二個目に0があります。二個目がスタートビットなのでしょうか? すると3個目から5個目から、”010”になります。 次にくるのが、1と0ですから、それぞれストップビットとスタートビット。8個目から10個目が”011”。すると11個目がストップビットになるかと思うのですが、最後の12個目が1になるのが理解できません。 これは無視してもいいのか、パリティビットなどの何か意味がある1なのかどちらなのか分かりません。 もしパリティビットがあれば、ストップビットの前につきますが、パリティビットがないときは・・・・?? どなたかお教え願えませんでしょうか。 よろしくお願いいたします。

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

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

  • ビット?バイト?速度?頭がこんがらがってます。

    学校で出された宿題の通信速度の問題を解いていて、頭がこんがらかってしまいました(x_x) 計算の仕方を教えてください。 問題は、 3MBのデータをダウンロードするのに70秒かかりました。 このときの通信速度は?1kbps=1000bps、1MB=1024KBとする。 です。 答えは384kbpsらしいのですが、どうすればその答えになるのかわからないんです。 1MBは1024KBですよね? だから、3MBをKBに直すと、3×1024で3072KB。 3072KBをBに直すと、3072×1024で3145728B。 1Bは8ビットだから、3145728×8=25165824ビット。 70秒かかったのだから、1秒間に3595117.7ビット。 これをKビットに直すと、3595.1177Kビット・・・・ なんで384kbpsになるんだろう・・・ 根本的に、間違ってますか?(^_^;) わかりやすく計算方法を解説していただけたらありがたいです。

  • 再度、回路のプロにお聞きします。

    電子工作に興味を持ち、実際作ってみれば理解が早いかと思い、 おもいきって実用的?な難しいものに挑戦したく以下の回路を作ろうと しましたが、どう作ってよいかわかりません。 こんな知識不足で教えても無駄といわれるかもしれませんが、数年後には 理解できる可能性?もありますので、どうぞ教えてください。 *** 作りたいもの *** シリアル(RS232C)でデータ受信し、 あるタイミングで同じデータを送信する回路が作りたいです。 ※初心者で何もわかっていないので、作りやすい方法で結構です。 あるタイミングは、10秒後でも、ボード上のスイッチでも、任意のデータが送られてきた場合でも何でも構いません。というか、どれが作りやすいかも判断できません。(^^; 発信周波数:33MHz ボーレート:115200bps パリティ:なし ストップビット:1 バイトサイズ:8 どのような回路になるのでしょうか? 送られてきたデータを溜め込むRAMも必要になりますか、今回はとりあえず作ってみたいので、無くても良いです。(難しすぎると作れません(^^;) テストは、この回路に対して、クロスケーブルを使ってパソコンから送受信します。

  • 高速シリアル通信での大容量のデータ転送について(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 'あとはバイトデータを結合させて                    'おります。 データの送信や受信について教えていただきたいのですが特に受信側で 私が思うのでは送信データが早すぎて受信側が追いついていない状態 と思うのですが・・・ なにかいい方法や参考になるホームページ等がありましたら伝授お願いします。

専門家に質問してみよう