
オシロスコープからの画像データ(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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
プログラミング初心者です。プ...
-
画素値取得について
-
JavaScriptの実行速度が遅い
-
VBA バイナリ―から文字列にす...
-
EXCEL VBAでテキストファイルの...
-
Microsoft VBAで2GBを超えるフ...
-
ページ読み込み時に自動的にsub...
-
エラー:ストリームの終わりを...
-
HDDのバイナリイメージの取得方...
-
ビットマップファイル生成(C言...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
自民党が「高齢者の医療費負担...
-
VBAで他のプログラムが起動して...
-
FTPでputすると空ファイルが出...
-
教えてください!vectorworksに...
-
Access クエリ実行が急に非常に...
-
GetPrivateProfileStringでini...
-
VB.NETで他のプロジェクトで作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
ページ読み込み時に自動的にsub...
-
EOF
-
エクセルVBA 2千万行のCSVファ...
-
入力ファイルをバイナリにする利点
-
【Teraterm】filewritelnについて
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
FTPでエクセルをPUTするとファ...
-
テキストデータをSQLServerに取...
-
C言語とシリアル通信の送受信...
-
ビットマップファイル生成(C言...
-
pcxファイルを開きたい(RGBデ...
-
FTPを使わないファイルアップロ...
-
MacからWinにファイルを添付す...
-
HDDのバイナリイメージの取得方...
おすすめ情報