- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB2010 COMポートからのバイナリ受信)
VB2010でCOMポートからバイナリデータを受信する方法
このQ&Aのポイント
- VB2010でCOMポートから受け取ったバイナリデータ(40kバイト程度のtifファイル)を保存するプログラムを作成しています。
- 受信データを正しくPC上に保存する方法について教えてください。
- 作成したコードでは容量が不足してしまい、受信データサイズが正しく保存されません。修正方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>PC上に作成された >ファイル容量から「dat」が常に上書きされているような気がします。 http://msdn.microsoft.com/ja-jp/library/system.io.file.writeallbytes%28v=vs.100%29.aspx に 「新しいファイルを作成し、指定したバイト配列をそのファイルに書き込んだ後、ファイルを閉じます。 既存のターゲット ファイルは上書きされます。」 と書かれているのですから、当然かと。 OpenWrite()辺りで開いて、ファイルの末尾にシーク、書き出し。 となるかと。 # 「VB バイナリファイル 書き込み」辺りで検索すれば見つかるんじゃないですかね? # http://msdn.microsoft.com/ja-jp/library/szz5syt3%28v=vs.100%29.aspx とか。
その他の回答 (1)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
回答No.2
SerialPort1_DataReceivedイベントは、シリアルポートに最初の1バイト目が受信された時に発生する。 だから、SerialPort1.BytesToReadを取得した瞬間は、まだデータを受信中の可能性がある。 実際に読込んだバイト数は、SerialPort1.Read()の戻り値で確認できる。
質問者
お礼
アドバイスありがとうございました。イベントが発生するタイミングがとても重要という事が分かりました。 今後はデータ受信完了フラグの追加などでより完成度の高いものに仕上げて行きたいと思います。
お礼
即時回答ありがとうございました。アドバイス頂いたMSDNサイト「VBでバイナリファイルに書き込む方法」の"My.Computer.FileSystem.WriteAllBytes"で無事保存できました。 念のため以下に修正コードを記載させていただきます。この質問にたどり着いた皆様の役に立てれば幸いです。 My.Computer.FileSystem.WriteAllBytes Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived ' シリアルポートからデータ受信 Dim dat As Byte() = New Byte(SerialPort1.BytesToRead - 1) {} SerialPort1.Read(dat, 0, dat.GetLength(0)) ' シリアルポートからデータ受信 My.Computer.FileSystem.WriteAllBytes("C:\test1.tif", dat, True) End Sub