■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った): |
■ ページの共有: |
[ サイト内検索 ]
![]()
カスタム検索
|
#628-1MSCommの受信結果をバイト型で受信する方法について匿名6282004-04-23(金) 14:48
#629-1RE#628:MSCommの受信結果をバイト型で受信する方法について匿名6292004-04-23(金) 15:00
#631-1RE#629:MSCommの受信結果をバイト型で受信する方法について匿名6312004-04-23(金) 20:02
#632-1RE#631:MSCommの受信結果をバイト型で受信する方法について匿名6322004-04-24(土) 13:15
#635-0RE#632:MSCommの受信結果をバイト型で受信する方法について匿名6352004-04-25(日) 11:44
#629-1RE#628:MSCommの受信結果をバイト型で受信する方法について匿名6292004-04-23(金) 15:00
#631-1RE#629:MSCommの受信結果をバイト型で受信する方法について匿名6312004-04-23(金) 20:02
#632-1RE#631:MSCommの受信結果をバイト型で受信する方法について匿名6322004-04-24(土) 13:15
#635-0RE#632:MSCommの受信結果をバイト型で受信する方法について匿名6352004-04-25(日) 11:44
匿名6282004-04-23(金) 14:48
始めまして。 現在、COMポートを使用したプログラムを作成しています。 内容は、COMポートより受信したバイナリーデータをByte型の配列に 保存するというものです。 Private Sub Form_Lode() 'MSCommコントロールの初期化 MSComm.CommPort = 1 MSComm.Settings = "9600,n,8,1" MSComm.HandShakeing = comNone MSCOmm.RThreshold = 1 MSComm.SThreshold = 1 MSComm.InputMode = comInputModeBinary End sub Private Sub com_tx_click() Dim dat As Variant Dim r_dat(32) As Byte '受信データ用配列 '受信バッファーのクリア MSComm.InbufferCount = 0 i = 0 '1文字受信するまで無限ループ Do '受信データがあるか If MSomm.InBufferCount <> 0 Then '受信データの読込み dat = MSComm.Input '受信データを配列に保存する r_dat(i) = dat End if ウオッチウィンドウで確認すると、データはちゃんと受信できている のですが、配列に保存のところでコンパイルエラーが出てしまいます。 また、MSCommの値を直接配列に保存しようとしたのですが、 同様にコンパイルエラーとなってしまいます。 初心者のため、どこが間違っているのかわかりませんので どなたかご指摘ください。
匿名6292004-04-23(金) 15:00
> 始めまして。 > 現在、COMポートを使用したプログラムを作成しています。 > 内容は、COMポートより受信したバイナリーデータをByte型の配列に > 保存するというものです。 > > Private Sub Form_Lode() > 'MSCommコントロールの初期化 > MSComm.CommPort = 1 > MSComm.Settings = "9600,n,8,1" > MSComm.HandShakeing = comNone > MSCOmm.RThreshold = 1 > MSComm.SThreshold = 1 > MSComm.InputMode = comInputModeBinary > End sub > > Private Sub com_tx_click() > > Dim dat As Variant > Dim r_dat(32) As Byte '受信データ用配列 > > '受信バッファーのクリア > MSComm.InbufferCount = 0 > i = 0 > > '1文字受信するまで無限ループ > Do > '受信データがあるか > If MSomm.InBufferCount <> 0 Then > > '受信データの読込み > dat = MSComm.Input > > '受信データを配列に保存する > r_dat(i) = dat > > End if > > ウオッチウィンドウで確認すると、データはちゃんと受信できている > のですが、配列に保存のところでコンパイルエラーが出てしまいます。 > また、MSCommの値を直接配列に保存しようとしたのですが、 > 同様にコンパイルエラーとなってしまいます。 r_dat(i)の(i)がいらないように思えます。 但し、この場合、受信データが必ず33バイト長のデータを受信するのか どうかになります。 > > 初心者のため、どこが間違っているのかわかりませんので > どなたかご指摘ください。
匿名6312004-04-23(金) 20:02
> > r_dat(i)の(i)がいらないように思えます。 > 但し、この場合、受信データが必ず33バイト長のデータを受信するのか > どうかになります。 > 早速の回答ありがとうございました。 ご指摘の内容を参考にプログラムを変更し、固定長のデータは無事受信できる ようになりました。 (^^)V Private Sub com_tx_Click() Dim dat as Variant Dim r_dat() as Byte 'バイナリーデータの受信 MSComm.InputMode = comImputModeBinary '受信Buffer Clear MSComm.InBUfferCount = 0 '33バイトデータ受信処理 Do If MSComm.InBufferCount = 33 Then Exit Do End If Loop '受信データ読込み dat = MSComm.Input '受信データ保存 r_dat= dat End Sub こんな感じです。 ところで、改めて質問なのですが、 受信データのデータ長がわからない場合、CRを受信するまで受 信したデータを配列に保存するにはどのようにプログラムを組 めば良いのでしょうか。 Doループを以下のように書換えると、1バイトずつのデータ受信 できるのですが、データを配列に保存する方法がいまいちよく 分かりません。 Prvbate Sub com_tx_Click() Dim dat as Variant Dim r_dat() as Byte 'バイナリーデータの受信 MSComm.InputMode = comImputModeBinary '受信Buffer Clear MSComm.InBUfferCount = 0 Do If MSComm.InBUfferCount <> 0 Then dat = MSComm.Input End If Loop End Sub もうすこしで、できそうな気はしているのですが・・・ どなたかご教示ください m(_ _)m
匿名6322004-04-24(土) 13:15
受信するデータはいつも固定長ではなく、可変長であるということですか? 折角、MSCommには受信バッファがあるので、1バイト毎にデータを取り込む 必要があるでしょうか?。 これはデータの内容によりますけど、幾つか溜まってから取得する方法もあ ります。 今回受信したデータがCRコードかでLoopを回避するようにして、Indexを示す Dim i, j As Integerを追加。 Dim r_dat() As Byte を 毎回取得するdatの配列数分、ReDim Preserve を使って、r_dat()を配列を伸ばす。 r_dat(i),dat(j)と考えて、jは毎回1バイトずつなら=0でしょう。配列数 と考えると1。 1バイト受信する毎に、r_dat()をRedim Preserveで、r_dat(0)(1)(2)・・ ・・(n)と伸ばし、伸ばした配列r_dat(i)=dat(j)と受信したデータが配列に 格納できればOK(^^) 文章で申し訳ないが、今VBの環境が無いマシンしかない状況なので・・・(^^;) スミマセン。
匿名6352004-04-25(日) 11:44
> 受信するデータはいつも固定長ではなく、可変長であるということですか? はい、そのとおりです > > 折角、MSCommには受信バッファがあるので、1バイト毎にデータを取り込む > 必要があるでしょうか?。 > これはデータの内容によりますけど、幾つか溜まってから取得する方法もあ > ります。 > > 今回受信したデータがCRコードかでLoopを回避するようにして、Indexを示す > Dim i, j As Integerを追加。 > Dim r_dat() As Byte を 毎回取得するdatの配列数分、ReDim Preserve > を使って、r_dat()を配列を伸ばす。 > r_dat(i),dat(j)と考えて、jは毎回1バイトずつなら=0でしょう。配列数 > と考えると1。 > 1バイト受信する毎に、r_dat()をRedim Preserveで、r_dat(0)(1)(2)・・ > ・・(n)と伸ばし、伸ばした配列r_dat(i)=dat(j)と受信したデータが配列に > 格納できればOK(^^) > ReDim Preserve 知りませんでした。まだまだ、勉強不足です (^^; > 文章で申し訳ないが、今VBの環境が無いマシンしかない状況なので・・・(^^;) > スミマセン。 > とんでもない、的確なアドバイスありがとうございます。m(_ _)m アドバイスを参考にプログラム考えてみました。 もっと、変更したほうがよい点があればご指摘ください。 ' ' RS232 送受信 テストプログラム ' 可変長のデータを受信し、[CR]受信で受信処理を終了する ' Private Sub com_tx_Click() Dim dat As Variant Dim r_dat() As Byte Dim i As Integer 'COMポート初期化 MSComm.InputMode = comInputModeBinary 'バイナリーデータの受信 'ポートを開く mainForm.MSComm.PortOpen = True '送信Buffer Clear MSComm.OutBufferCount = 0 '受信Buffer Clear MSComm.InBufferCount = 0 'インデックスの初期化 i = 0 'CRを受信するまで、データの受信を継続する Do If MSComm.InBufferCount <> 0 Then 'darの配列サイズを変更する ReDim Preserve r_dat(i) '受信データり読み取り dat = MSComm.Input '受信データを配列に保存 r_dat(i) = dat(0) '受信データは [CR] か If dat(0) = CByte(&HD) Then '受信処理終了 Exit Do End If 'インデックス・インクリメント i = i + 1 End If Loop '受信データを送信 MSComm.Output = r_dat mainForm.MSComm.PortOpen = False End Sub
このページと関連する記事:
#16598-0バイナリデータの受信2000-02-22(火) 11:57#21388-0MScommコントロールでのデータ受信の条件2001-06-18(月) 14:43
#40043-0バイナリ送信時に1バイト余分に送信されるのですが...2001-03-08(木) 17:38
#38544-0バイナリーDATAの処理方法2001-02-08(木) 21:55
#2012-1シリアルポート(mscomm) &H81〜&H9Fなどが送信できない2004-05-10(月) 17:00
#27779-0Mscommからの2進数データを16進に変換したい。。。2000-08-10(木) 22:25
#46719-0MSCommを使ったバイナリデータの転送2001-09-10(月) 15:13
#29741-0データの受信について2000-09-11(月) 12:48
#41162-0Winsockを使ってバイナリデータを受信2001-04-02(月) 16:17
#471-1受信した内容が異なっている2003-08-20(水) 14:10
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。