オシロスコープからの画像データ(40kバイト程度のtifファイル)をPCのCOMポートから受信し
保存するプログラムを作成しているのですが、受信データを正しくPC上に保存できません。
具体的には下記のコードでtifファイルは作成されますが、容量が数kバイトで明らかに不足
しています。
MsgBoxを有効にして受信バッファサイズや書込み長さを確認しましたが、「OK」ボタンを押す
たびに下記の表示になります。COMポートのバッファサイズが4096バイトなので「dat.Length」
をすべて足し合わせると本来の受信データサイズになると思うのですが、PC上に作成された
ファイル容量から「dat」が常に上書きされているような気がします。
正しく保存するにはどのような修正が必要でしょうか?
【MsgBoxを有効にしたときの表示値(OKを押すたびに数値が変わる)】
「dat.Length」
183
4075
4072
4092
4088
4084
4085
4092
4059
4078
3910
0
0
・
・
・
「ByteToRead」
4060
1508
324
908
2334
1785
70
227
400
0
0
・
・
・
【作成したコード】
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))
'MessageBox.Show(dat.Length)
'MessageBox.Show(SerialPort1.BytesToRead)
File.WriteAllBytes("C:\test1.tif", dat)
SerialPort1.DiscardInBuffer()
End Sub
【環境】
OS:Win7
VB:2010
ポート設定:SerialPortクラス標準からポート番号以外は変更なし
No.1ベストアンサー
- 回答日時:
>PC上に作成された
>ファイル容量から「dat」が常に上書きされているような気がします。
http://msdn.microsoft.com/ja-jp/library/system.i …
に
「新しいファイルを作成し、指定したバイト配列をそのファイルに書き込んだ後、ファイルを閉じます。 既存のターゲット ファイルは上書きされます。」
と書かれているのですから、当然かと。
OpenWrite()辺りで開いて、ファイルの末尾にシーク、書き出し。
となるかと。
# 「VB バイナリファイル 書き込み」辺りで検索すれば見つかるんじゃないですかね?
# http://msdn.microsoft.com/ja-jp/library/szz5syt3 … とか。
即時回答ありがとうございました。アドバイス頂いた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
No.2
- 回答日時:
SerialPort1_DataReceivedイベントは、シリアルポートに最初の1バイト目が受信された時に発生する。
だから、SerialPort1.BytesToReadを取得した瞬間は、まだデータを受信中の可能性がある。
実際に読込んだバイト数は、SerialPort1.Read()の戻り値で確認できる。
アドバイスありがとうございました。イベントが発生するタイミングがとても重要という事が分かりました。
今後はデータ受信完了フラグの追加などでより完成度の高いものに仕上げて行きたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
入力ファイルをバイナリにする利点
-
可逆圧縮のファイル形式のファ...
-
削除したファイルの復旧、およ...
-
エクセルVBA 2千万行のCSVファ...
-
エラー:ストリームの終わりを...
-
画像の保存方法。
-
【MFC】CFileでSeekした位置か...
-
VBAを使って、一部バイナリデー...
-
C言語とシリアル通信の送受信...
-
MacからWinにファイルを添付す...
-
バイナリーデータの一部データ...
-
24ビットのWaveデータの中身に...
-
RS-232Cで接続したPC間のファイ...
-
Microsoft VBAで2GBを超えるフ...
-
HDDのバイナリイメージの取得方...
-
Javaでのエンディアン変換
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
入力ファイルをバイナリにする利点
-
エラー:ストリームの終わりを...
-
ページ読み込み時に自動的にsub...
-
エクセルVBA 2千万行のCSVファ...
-
EOF
-
【python】Excelファイルを読み...
-
Microsoft VBAで2GBを超えるフ...
-
MacからWinにファイルを添付す...
-
VBA バイナリ―から文字列にす...
-
テキストデータをSQLServerに取...
-
PHPのfgetcsvの処理容量について
-
HDDのバイナリイメージの取得方...
-
テキストデータをバイナリデー...
-
C言語でBMPファイルの内容を表...
-
【MFC】CFileでSeekした位置か...
-
C言語とシリアル通信の送受信...
-
バイナリファイルの検索について
-
VBでCSVファイルを読み込む方法...
おすすめ情報