• ベストアンサー

RS-232Cで接続したPC間のファイル転送

環境 [XP VB6.0] お世話になります。 RS-232Cのクロスケーブルで2台のPCを接続し、一方のPCにあるファイルをもう一方のPCに送信し、受信したファイルを保存するというプログラムを作成しないといけません。 現状、フォーム上でコモンダイアログによりファイルを選択し、選択したファイルが、フルパスでテキストボックスに表示されます。 送信ボタンをクリックするとファイルの送信処理を開始し、受信側は受け取ったファイルを保存するという流れを作りたいのです。 しばらく調べたのですが、なかなかクリティカルする回答を見つける事が出来なかったので質問させていただきます。 もうこのような転送手段は使わないと思いますが・・・。 MSCommコントロールを使用し、文字の送受信程度であればできたのですが、MSCommではファイル転送はできないのでしょうか? 送信側、受信側のプログラムをご教授いただければと思います。 つたない文章で申し訳ありません。 よろしくお願いします。

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

  • ベストアンサー
  • techa
  • ベストアンサー率60% (41/68)
回答No.3

>この記述で、バイナリモードで開いたファイルを >あたかもコピーしたかのような形で、別のファイルとして書き込む事が出来ますが、 >このbytBufAll()の内容を転送し、Putステートメントを受信側で行うと言う考え方で >間違いないでしょうか? 微妙にちがう気がします。 Putはファイルへの出力ステートメントですから、「受信側でおこなう」ものではありません。 つまり、Putに相当する全バイト送信関数を「送信側PC」で実装し、 加えて、これを受信してファイルに落とす受信関数を「受信側PC」に 実装する必要があります。 提示されているプログラムではbytBufAllの最大数が指定されていないので プログラム的にもまずいとおもいます。 あえてこれを利用するならLOFでファイルのサイズ分を得て Redimするのが定石かな。 そのあと、よみだされたbytBufAllを1バイトづつMSCommに送出するのを 繰り返せばよいとおもいます。 受信側にそれなりの速度があって、受信バッファももっているようなら 数十バイトづつおくるのもありかとおもいます。 ただ、受信側ではファイルの終端であることが認識できませんから 前述のように、ファイル終端をなんらかの形で伝えられていること が前提ですし、通信途絶などの不慮の状態を検出できるように プログラム構造を考えておくことが必須です。

majinkun
質問者

お礼

techa様 たびたびありがとうございます。 ひとまず、送信側のPGを作成し、受信側のPGを作成しているところです。 bytBufAll()の内容を受信し、ファイルに書き込んでも文字化等がおこり、うまく開けない状態ではあります。 もう少し試行錯誤してみて、どうしてもうまく行かない場合はまた質問を上げたいと思います。 お力を貸していただき本当にありがとうございました。

その他の回答 (2)

  • techa
  • ベストアンサー率60% (41/68)
回答No.2

まず、RS232Cでもバイナリファイルの転送は可能です。 ただ、考えなければならないことが増えるので、何かしらの方法が 必要とされるだけです。 RS232Cでの転送がキャラクタ転送となるときは、 表示キャラクタ以外の文字を制御文字として扱えるので、 データの終端などを正確に把握することが可能です。 これに対して、バイナリの場合は&h00~&hffまでのすべての コードが出現可能であって、データの区切りの認識ができなく なるからです。 これでは、受信側のPCはいつ伝送終了になったのか、把握するすべ がありませんね。 そこで伝送のプロトコルを定めることになるのですが、それには ANo1さんのように、全部テキスト化しておくるほうほうもわかりやすくて よいとおもいます。ただ、このようにおこなうと 実際のバイト数*(1バイトを表現する文字数)+α の時間がかかってしまいます。 あるいは、先に全体のバイト長をキャラクタでおくっておいて、その後は 一定バイト数をバイナリでおくる、というのも手ですね。 昔からある手法ではXMODEMやYMODEMなどの方法もあります。 しらべてみるのもいいでしょう。 いまどきなら、一旦BASE64でエンコードして全部テキスト化してしまい、 これをそのまま転送し、受信PCで再度デコードするというのもありかも しれません。 VBならこちらのほうがサンプルをみつけやすいようにおもいます。

majinkun
質問者

お礼

techa様 ご返答ありがとうございます。 さらに質問になりますが、 Dim bytBufAll() as byte Open FILENAME1 For Binary As #1 Get #1, , bytBufAll() 'ファイル全体を読み込む Open FILENAME2 For Binary As #2 put #2, , bytBufAll() 'ファイルを書き込む この記述で、バイナリモードで開いたファイルを あたかもコピーしたかのような形で、別のファイルとして書き込む事が出来ますが、このbytBufAll()の内容を転送し、Putステートメントを受信側で行うと言う考え方で間違いないでしょうか?

回答No.1

MSCommコントロールには直接ファイルを転送する機能はありません。 その機能はあなたが作ることになります。 (それがファイル転送のプロトコルとなります) ファイルを転送するには最低限 1.ファイル名を送る 2.ファイルの中身を送る。 の2段階の処理が必要です。 スマートでは無いけど簡単な方法を示します。(概念だけなのでテスト無し) 送信側 (1)ファイル名をテキストで送る。 (2)ファイルをバイナリモードで開く。 (3)1バイト読み込む。 (4)読み込んだデータをCstr関数で数値文字列にして送る。 (5)ファイルがEOFでなければ(3)に戻る。 (6)-1を送ってファイル終了を知らせる。 (7)ファイルを閉じる。 (8)終わり 受信側 (1)ファイル名を受け取る。 (2)受け取ったファイル名(パス部分は削除)でバイナリファイルを開く。 (3)データを1行受信する。 (4)データが-1なら(7)へいく。 (5)受信したデータをバイト変数に入れて、ファイルへ1バイト書込む。 (6) (3)へ戻る。 (7)ファイルを閉じる。 (8)終わり

majinkun
質問者

お礼

Hayashi_Trek様 早速のご回答ありがとうございます。 ファイルそのものは遅れないんですね・・・。 例えば、ワードデータとかエクセルデータはたまたビットマップデータ等、中身がテキストとは限らないファイル等のやり取りはできないのでしょうか?

関連するQ&A

  • 2台のPCでRS-232C接続でファイル転送

    PCの2台間でRS-232Cのクロスケーブルでファイルのやりとりを行うことというのはできるでしょうか? PCそれぞれにTeraTermをインストールしているのですが、これに”ファイル送信”というのがありますが、この機能で、それは可能でしょうか? 例えば、WORDのdocファイルを送信して、受信側でそれをファイルとして受信できると言うことは可能でしょうか? どうぞ、ご存じの方いらっしゃいましたらご教授頂きますよう、お願い致します。 なぜ、このようなことをするのかということを説明させて頂きたいのですが、 今までマイコンのUARTでの通信でRS-485等を用いてマイコン間の通信をするような端末があるのですが、この間をインターネット化したいと言うことで、WIZ110SRというRS-232C-TCP/IPコンバータ端末というのを使うことになったのですが、このコンバータはローカルLAN内とインターネット回線での通信で通信速度が安定しないのではという疑問がありまして、PC間でファイル転送などをしてちゃんと転送した結果が送信元のファイルと全く同一でエラーなどが起きていないかを確認したいと思っています。 どうぞ、ご協力お願い致します。

  • MSCommを用いたRS-232-Cデータ転送

    Visual Basic ver.6を用いてRS-232-Cデータ転送のプログラムを書いています。 転送には,MSComm controlを用いています。 コンピューター側から命令コードを測定器側に送信すると(例えば,MSComm1.OutPut = "F,3,300," & Chr(13)のように),測定器側からは次のようなテキストデータの転送が指定された回数だけ起こります: @C/R 数値データC/R 数値データC/R ・・・・ ・・・・ (指定回数繰り返す) そこで,質問ですが,このデータをMSComm1.Inputを介してきちんと取得する方法をお教えください。私がよく理解できいない部分は,「どのような形でbufferにデータが落ちているのか?」という部分と「繰り返し処理をどう記述するのか?」という部分です。多分後者は配列型変数を用いて「指定回数」だけ繰り返すことになると思いますが・・・・。 なお,データ転送の制御フォーマットはデータのみの転送で,STXもETXも使用していません。

  • RS-232Cでバイナリデータを受信する方法

    2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。 送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。 問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"ならばカウントを1つ下げ、それを表示するといったような処理をリアルタイムで行いたいのですが、どうしてもデータの取りこぼしが発生します。 また、データの意味合いとしては、必ず"AA"という1バイトのデータから始まり、それに1バイトから5バイトまでのデータが可変長で付いてきて次の"AA"までが1つの意味となります。 通信パラメータは9600、8ビット、ストップビット1、パリティなしで、その他の制御線は一切使用しないという条件です(要するにRxD、GND線のみの最低限の条件) 受信側のバッファは1024バイトで、MSComm1.RThreshold = 1でOnCommを発生させています。また、送信側のファイルの大きさは1kバイトほどです 正直なところ、このようなことが可能なのかどうかもわからない状況なのですが、現状ではデータを数バイト取りこぼしているだけのようなのでできないことはないのではないか?と考えています。 どなたか、参考文献、ホームページ、プログラム、考え方等を何でもかまいませんん!ぜひ、ご教授願います!!また、現在はVBにて開発中ですが、最悪、言語は問いません。よろしくお願いいたします。

  • PC9821から加工プログラムをRS23Cでプレナ

    PC9821から加工プログラムをRS23Cでプレナー機に送りたいのですが、急に送れなくなってしまいました。 プレナー機でいつもtermモードにしRS232Cで送受信できるようにからPC9821で送信しているのですが、下記添付写真の状態で1を押すとフリーズしてしまい、次の画面にいかなくなってしまいます。 本来は次の画面で受信か送信を選択でき、送るプログラムを選んで送信するのですが送受信を選択できる状態までいかなくなってしまいました。 原因と対策はどのようにすればいいでしょうか

  • Visual Basic6.0でRS232-Cを介して機械を動かす方法を教えてください

    Visual Basic6.0(VB6)で機械(二軸ステージコントローラ)を制御したいのです。 機械側には、「RS232-Cストレートケーブルを使用してください」と書いてあります。 RS232-Cで情報を送信するには、VB6の中のMSCommというコマンドを使えば良いということは分かりました。 ただ不明なのは、RS232-Cには、クロスケーブルとストレートケーブルがあるらしいのですが、その違いがよくわかりません。 ちなみに、パソコン側は9ピンで、機械側は25ピンです。 よろしくお願いします。

  • PC98で232c送信winndowで受信できない

    PC9801のDiskBasicでファイルをRS232C送信し,DOS/VのWinndow(OS 95 98 XPなど) のRS232CのCOM1で正常受信ができません。DOS/VのPC9821のDOSのN88Basic では,クロスケーブルを使用して受信できますが,ウィンドウでは,フリーソフト7,8種類使用 しましたが、同じようには受信ができません。  ウィンドウXPで、同期して受信らしき様子はあるのですが、内容が16進コードで  00とか80とかのコードでどう行っても,送信コードとは異なっています。  送信コードは DISKBASICのN88BASCプログラムで以下のようなものです   100 'ABC   110 LINE(100,100)-(150,100),COL  通信ケーブルは, クロスです。   DOS N88BASICと同じように受信ができないのでしょうか。何が悪いのか原因は?  教えてください。   昔の5インチのデータを移植資料としてウィンドウで保存したいのです。

  • RS-232C 2つのプログラム 受信 MSComm

    お世話になっております。 今現在VB6.0でMSCommを用いて通信系のプログラムを作成中です。 1台の重量計から、PCのCOM1にデータをと取り込んでいます。 取り込んだデータを解析するために、AというプログラムとBというプログラムを実行し、データがCOM1に受信されたら両方のプログラムにデータを受信させたいです。 しかし、COM1にデータが受信されるとどうしもAというプログラム側でのみ受信されてしまいます。プログラム的に不可能ではないと思うのですが。 そこで、重量計側のポートとCOM1,COM2をパラで繋いで2つに同じデータを受信させたいと考えております。1つのポートに対して、1つのPCを稼動させたいのです。 もし、このようなケーブルを知っておられる方いらっしゃいましたら、宜しくお願い致します。

  • ファイルサイズの転送

    javaのファイルサイズの転送で困っています。 最初にファイルサイズを転送し、あらかじめ受信サイズを知らせておきたいのですが。。。うまくいきません。 送信側では最初にファイルサイズ4バイト(intサイズ)送信し、サイズを書き込む。 受信側では4バイト読み込み、ファイルサイズ分のバッファを用意する。 どうすれば出来るでしょうか。おねがいします。

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

  • PCからNCフライスへのデータ転送ができない

    前回https://okwave.jp/qa/q9623570.htmlで質問させていただいた者ですが 別の不具合が発生したのでまた質問させてください。 当方職場で大隈豊和機械のNCフライスの「2R-NC」制御機械「OH-OSP-HMG」を 使用しており、 パソコンとNCフライスをシリアルクロスケーブルでつないでプログラムを転送しておりましたが 本日プログラムが一切転送できなくなりました。 詳しい状況は以下のとおりです。 ・NCフライスのパンチャリーダー用のRS232Cの端子とパソコンを  シリアルのクロスケーブルでUSBに変換して繋いでいます。 ・windows8でNCターミナルというフリーソフトを使い  プログラムを転送していました。 ・パソコン上ではデータの転送が終わってるように表示されるのですが  NCの制御装置の画面には何も変化が起きずそのまま動かなくなります。 ・先月あたりから、このような症状がたまに起きていたのですが  別のUSBポートに差し替えたりしたら治っていたのですが  本日試してみたら一切転送ができず、状況も改善しなくなってました。 ・逆にNCフライス内のデータPCに転送するのは問題無くできます。 パラメーター設定はhttps://okwave.jp/qa/q9456583.htmlこちらのページを参照して 設定いたしました。 ・普段の場合だと (1)NCターミナルでプログラムの記述されたテキストファイルを選択 (2)NCターミナル側で送信待機 (3)OH-OSP-HMGでデータ受信を開始 (4)少し間があってからパソコンからデータが送信開始 (5)OH-OSP-HMGの画面に「有意情報読み込み中」の表示 (6)終わるとライブラリにデータが転送されている。 という動作になるはずなのですが 現在の状態だと (1)NCターミナルでプログラムの記述されたテキストファイルを選択 (2)NCターミナル側で送信待機 (3)OH-OSP-HMGでデータ受信を開始 ここから普段と違って (4)受信操作した瞬間にパソコンが送信を開始 (5)パソコンはデータを転送を終えてもOH-OSP-HMGは受信待機状態のまま という状態になり、こうなると一切の操作を受け付けなくなります。 (この時点ではエラーはなにも出ていません) 仕方ないのでケーブルを抜いて 「2561 RS232C レディ 割り込み タイムアウト エラー」 「2128 RS232C 端末 ノットレディ エラー ’出力’」 という通信エラーが出て待機状態が解除するまで待つしかありません。 ・試してみたこと (1)USBを延長して使っているので、延長ケーブルを通さずに試したがだめでした。 (2)他のUSBポートに差し替えてみてもだめでした。 (3)NCの方を先に受信待機状態にして、送信要求信号を使用しない送信してみましたが、上記と同じでした。 (4)NCターミナルのreadmeファイルに「パリティををつける設定ができる機械はパリティを設定してください」という記述があったので OH-OSP-HMGのパラメーター設定を変えてパリティをつける設定にしてみましたが だめでした。 (5)デバイスマネージャーからシリアルポートの設定をいろいろ変えてみましたが  改善しませんでした。  (具体的には通信ボーレートをNCに合わせたり、フロー制御やパリティの制御もいろいろ試してみましたがだめでした。) ・もしかしたら関係あるかもしれないこと NCとつないだシリアルとパソコンの通信がとぎれとぎれになっているようで、 パソコンからUSB機器が抜かれたときのシステム音と取り付けられたときのシステム音が繰り返し何度も流れていましたが、 プログラム転送は問題なくできていたので気にしていませんでした。 ・他のNC転送ソフトの「ComncV3」でも試してみましたがやはりだめでした  その時の通信ログが添付画像です  ヘルプを参照すると通信ログにあるエラー1009は 「データ送信開始前に改行コードを送信中にエラーが発生しました。」とのことです (ちなみにNCターミナルの通信ログには「通信完了」となっておりました。) 推測でしかありませんがコントロールコードのDC制御がうまく行っていないのでは と考えます 症状が徐々に頻繁にでるようになっていたので、もしかしたら物理てきな故障ではないかと思い不安になっています。 こういう場合どうしたらいいでしょうか わかる方いましたら教えて下さい。

    • ベストアンサー
    • CAM