複数のUSBデバイスを認識するには?

解決


くま  2009-10-16 00:06:31  No: 142640

はじめまして。
この度USB接続式の温度計を購入し、それを1台のPCに複数個接続して色々な場所での温度・湿度を計測したいと考えています。

温度計はUSBRHというものを用いていて、商品購入時にdllファイルが既についていて、それを用いてプログラミングが出来るという状態です。

http://www2.strawberry-linux.com/products/usbrh/index.php?%5B%5B%B4%D8%BF%F4%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%5D%5D

こちらにあるFindUSBという関数を用いて、
接続されているデバイス名を取得出来るということなのですが、
複数個接続をした場合、上手くデバイス名を温度取得関数に渡せずに、
片方のデバイスの温度のみが帰ってくるという形になってしまいます。

プログラムのここに関係する部分のみを書くと

dev = FindUSB(index)
        If dev = "" Then Exit Do
        Device = dev

と予め定義しておきTimer関数で

Private Sub Timer1_Timer()
    Dim temp As Double
    Dim rh As Double
    Dim re As Long
    
    
     dev = FindUSB(index)
    re = GetTempHumidTrue(Device, temp, rh)
    If re = 0 Then
        lblTemp(0).Caption = Format(temp, "##0.00℃")
        lblHumid(0).Caption = Format(rh, "##0.0%RH")
      
       dev = FindUSB(index)
       re = GetTempHumidTrue(Device, temp, rh)
      
      If re = 0 Then
          lblTemp(1).Caption = Format(temp, "##0.00℃")
          lblHumid(1).Caption = Format(rh, "##0.0%RH")
      Else
          lblTemp(1).Caption = "未検出"
          lblHumid(1).Caption = "未検出"
      End If
        
    Else
        lblTemp(0).Caption = "未検出"
        lblHumid(0).Caption = "未検出"
    End If
    
End Sub

と書いています。またモジュールで

Option Explicit

Public Declare Function GetVers Lib "USBMeter.dll" _
    Alias "_GetVers@4" (ByVal dev As String) As String

Public Declare Function FindUSB Lib "USBMeter.dll" _
    Alias "_FindUSB@4" (ByRef index As Long) As String
 
Public Declare Function GetTempHumid Lib "USBMeter.dll" _
    Alias "_GetTempHumid@12" (ByVal dev As String, ByRef temp As Double, ByRef humid As Double) As Long

と書いています。

どのようにしたら複数個接続用になるのか教えて頂けると幸いです。
よろしくお願いします。

最後にバージョンはVB6.0でOSはXPを用いています。


魔界の仮面弁士  2009-10-16 00:31:32  No: 142641

そのライブラリを使った事が無いので、憶測でしか答えられませんが:

> dev = FindUSB(index)
引数の index には、どのような値を指定していますか?

提示のページを見る限りでは、
  index = 0
  Do
    dev = FindUSB(index)
    If dev <> "" Then
      Debug.Print dev  '実際には、配列なりコレクションなりに蓄える
    Else
      Exit Do
    End If
  Loop
のようにして列挙できるような気がします。


くま  2009-10-16 02:56:49  No: 142642

>魔界の仮面弁士さん
indexは0に指定していたのですが、書いてある通り、
Debug.Print devを使ってデバイス名が渡っているか確認したところ、
上手く渡ってなかったのが、分かりました。
そこを直したら上手くいきました。
ありがとうございました。

>オショウさん

>リファレンスでAPIを確認する限り・・・

>そのプログラム間違ってませんか?

>dev = FindUSB(index) と、なっており、devにデバイス名が入るが
>re = GetTempHumidTrue(Device, temp, rh) では、Deviceとなって
>います。

>dev = FindUSB(index)
>re = GetTempHumidTrue(dev, temp, rh)

>なら解りますが・・・

>それくらいかナ〜・・・

>以上。

あっち消されるとアレなので、こっちに返信書かせてもらいますね。
Device = dev
と始めに定義してあったので、それをそのまま使ってるので、ややこしいんですけど、渡っていたみたいです。
そこが混乱してしまって上手く変数を変えて渡せなかったのが、原因みたいでした。
コメントありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加