■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#628-1
MSCommの受信結果をバイト型で受信する方法について
始めまして。
現在、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の値を直接配列に保存しようとしたのですが、
同様にコンパイルエラーとなってしまいます。

初心者のため、どこが間違っているのかわかりませんので
どなたかご指摘ください。
#629-1
RE#628:MSCommの受信結果をバイト型で受信する方法について
> 始めまして。
> 現在、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バイト長のデータを受信するのか
どうかになります。

> 
> 初心者のため、どこが間違っているのかわかりませんので
> どなたかご指摘ください。
#631-1
RE#629:MSCommの受信結果をバイト型で受信する方法について
>
> 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
#632-1
RE#631:MSCommの受信結果をバイト型で受信する方法について
受信するデータはいつも固定長ではなく、可変長であるということですか?

折角、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の環境が無いマシンしかない状況なので・・・(^^;)
スミマセン。
#635-0
RE#632:MSCommの受信結果をバイト型で受信する方法について
> 受信するデータはいつも固定長ではなく、可変長であるということですか?
はい、そのとおりです
> 
> 折角、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
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)