したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

RS232Cでバイナリファイルの終わりの検出について

1タカミ:2008/10/24(金) 07:26:22
初めまして、タカミと申します。
2台のコンピューターでバイナリデータの通信プログラムを作成しています。
データの送受信は出来たのですが、受信データの終わりを検出することが出来ません。
何か良い方法は無いでしょうか。
環境は VS2005 C# WIndows xp です。
宜しくお願いします。

2igoten:2008/10/24(金) 11:30:34
おお! 記念すべき初めての質問ですね、丁寧に説明しちゃおうかな。

バイナリデータの終わりの検出ですね。
幾つかの考え方があります。
1、通信時間を見て判断する。
2、データ長のヘッダーを付ける。
3、エンドマークを付ける。
4、ピンチェンジを利用する。

1、DataRecievedの中でタイマーを設定し有る時間に次のデータが
来ない場合は、さっきのデータが最後のデータだったんだなと判断する方法です。
送る方で連続でデータを送らない制御が必要になります。
タイマーは500mSec(0.5秒)位に設定すればよいでしょう。
この方法が一番簡単です。

2、あらかじめ送るデータ長がわかっている場合は、4バイト程度の固定のヘッダーに
長さを書き込んで送る方法が有ります。
受信側はこのヘッダーを読み込んでデータの終わりを判断します。
この方法が一番お奨めです。
データの長さを先ず送り、100mSec位してデータを送ると、受信側は
データのByte配列の大きさをあらかじめ設定できますので、受信処理が簡単になります。


3、バイナリデータにエンドマーク!と驚かれるかもしれませんが、出来ます。
「¥¥」などのエスケープキャラクタを思い出して下さい。
2バイト又は4倍とのエンドマークを付けます。
データにエンドマークと同じデータが出現した場合はエスケープで同じマークを重ねます。
受信側ではエンドマークを監視する必要が有ります。
2バイトですと同じデータの出現確立が1/65536になります。
エンドマークは0x0とか0xFF等は止めたほうがいいです。

4、DTRやCTSをデータの終わりでOn/Offする方法が有ります。
DTRの場合について説明しますと、送信側は送信が終わったら、
DTRをOffします、受信側はDSRHoldingを見ていて、データの終わりを
判断します。
送信側は再度データを送る前にDTRをONします。
送信側でDTRをOffする時はデータ送信後100mSec位開けると良いでしょう。

3タカミ:2008/10/25(土) 15:59:20
丁寧な説明ありがとうございます。
2番目の方法に挑戦してみます。
わからないことが有ったらまたお願いします。

4ナカガワ:2008/11/30(日) 01:19:42
バイナリファイルをコピーしたいのですがファイルの終わりの検出方法がわかりません。
例えばバイナリエディタやDOS窓のCOPYコマンド等はどうしているのでしょうね?
ご存じならご教示ください。

5<削除>:<削除>
<削除>

6igoten:2008/12/01(月) 08:21:28
基本的にRS-232Cの場合はデータは垂れ流しで、バイナリファイルでの終わりの
検出は出来ません。
エディターやCopyコマンドはあらかじめFileのサイズが判っていますので、終わりの
検出は出来ます。

受送信とも自作の場合お奨めの方法は4バイトのデータ長のヘッダーを付ける方法です。
へーダーと言っても送る側は先ず4バイトのデータを送り、続いてファイルデータを送れば良いのです。
受信側は最初の4バイトは長さのデータと解釈して、受信すれば良い事になります。

7igoten:2008/12/01(月) 13:48:35
とりあえずタイマーを使用したサンプルです。
ヘッダー方式を推奨してタイマーのサンプルとは少し変ですが.....
受信は0.2秒以上の送信が来なければ自動的に現在のファイルを閉じます。
再び来れば新しいファイルを自動的に作成して書き込みます。
送信側はファイルとファイルの送信時間間隔を0.2秒以上にします。

送信側
http://www.geocities.jp/hatanero/lzh/rs232cfilesendc.lzh
受信側
http://www.geocities.jp/hatanero/lzh/rs232cfilereadc.lzh

8ナカガワ:2008/12/02(火) 22:17:38
C#のサンプルありがとうございます。
Cの feof(),ferror()にこだわって無駄な時間を費やしていました。
ファイルサイズを見て決める。時間を空ける。
なるほど。。。それしかありませんか。。。
感謝!

10<削除>:<削除>
<削除>

11こじら:2010/03/05(金) 02:01:39
どうもです。
私も同じRS232Cでバイナリデータの最後も検出に悪戦苦闘しています。
No2で、答えておられる3番の方法でエンドマーク(2byte)で終了にトライ
しています。
 作成しているGUIのボタンを押したとき、機器にコマンドを送り、それに
対しデータが送信され、この送信が全て完了してから表示を行うといった
仕様なのですが
、ボタンを押して、データを数バイト受信するのですが、全データを取るまで
に データを分割受信しているのか、受信割込みを何度か発生するような感じで、
うまく受信できず、エンドマークを検出することができません。
 途中でハングするか、予期せぬ値が表示されて終了します。

①全データ(エンドマーク)取得後まで表示処理に移らないようにするには
 どのようにすればよいのか
②SerialPort.Read(inByte, 0、ByteToRead)としたとき
   inByte.LengthとByteToReadの数値の意味と、関係を教えて頂きたいです。
  (上記の仕様でReadした時MessageBoxで数値を表示すると、全データを
   取得するまでに、発生するReadData割り込み(?)の度にインクリメント
   されています。バッファのアドレスポインタでも示しているのでしょうか)
③また、②のinByte.LengthとByteToReadは、GUIのボタンを押す度にも
    インクリメントされていく。
    私のイメージでは、ボタンを押すたびに、クリアされ、データを取得
    (バッファもクリア、0からスタート)と考えていたので。
    データ数や、配列は起動時に作成された値で固定なのでしょうか。
    受信のたびにクリアされるものと思っていたので。
④最後に 上記とは全く別なのですが、受信したバイナリをASCII文字
 に変更したいのですがこれもできれば教えて頂けないでしょうか。
すみませんが、宜しくお願いします。

12igoten:2010/03/05(金) 08:16:30
1、受信するデータの長さは固定ですか?
固定ならSerialPort1.ReceivedBytesThresholdをその長さに
設定しておくと設定したバイト毎にDataReceivedイベントが発生します。
固定出ない場合は、DataReceivedイベントがいつかかるかは未定ですので
受け取ったデータの中にエンドマークがあるか否かその都度チェックします。

2、第一引数はデータをストアーするバッファです。
  第二引数は上のバッファのどこから書き込むかのオフセットです。
  第三引数はその時受け取ったデータの数です。

3、inByte.Lengthは読み込んだデータをストアするバッファの長さです。
  ByteToReadはSerialPort1.ReceivedBytesThresholdに何も設定していない
  状態ですと、その時受け取ったデータの数でマシンに依存します。
  
4、VB.NETでしたよね。
  TextBox1.Text = Chr(65)  Aを表示

13こじら:2010/03/06(土) 12:18:15
ありがとうございます。
1については固定ではないので、エンドマークを使います。

教えて頂いた内容でトライしてみます。有難うございました。

16<削除>:<削除>
<削除>

20スーパーコピー:2018/08/25(土) 04:53:43
スーパーコピー
*当店の信用の第一
*商品の品質第一
*在庫情報随時更新!
*新品種類がそろっています。
*品質がよい、価格が低い、実物写真!
*100%品質保証 !
*全品送料無料

21スーパーコピー おすすめ店:2019/04/14(日) 03:12:26
スーパーは専売店をコピーします
日本の最高級のスーパーマーケットはブランド時計超特便宜通信販売専売店をコピーして、品質よくコピーを表して、2019最も新作、国際ブランドの腕時計はコピーして、業界は唯一ただ2全くありません.世界の1流の高い品質のブランドは時計をコピーして、当店のスーパーは時計専売店をコピーして、以下の世界の1流のブランドを販売して時計をコピーします:ロレックスはコピーして、ウブロはコピーして、オメガはコピーして、シャネルはコピーします...なぜかというと最高な品質のスーパーマーケットはN級の品物をコピーして新作を表して最も商品に新しく着いて、第1を使いを信じて、安心してください、全国の運賃が無料です!
新旧(の程度)の顧客がお願いするのを歓迎します


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板