プロが教える店舗&オフィスのセキュリティ対策術

USB接続の仮想COMポート接続デバイス相手のプログラムをVB6.0で作成中です。
WindowsXP上では問題なく送受信できるのですが、Windows2000上では
問題が発生します。512byteのバイナリデータを受信したいのですが、途中でデバイス側の応答が止まってしまいます。
MSCOMMを使用していたので、それが良くないのかと思い、他のもの(CommOcx)を使用してみましたが結果は変わりませんでした。
Windows2000の場合には、なにか特別な処理が必要なのでしょうか?

A 回答 (2件)

ここでいう標準ポートというのは、Windows2000側の事ではなく、


ハード側にあるポートを云います。
今のノートPCにはCOMポートが無いため、
USBかPCカードによる仮想COMポートを使わなければ利用出来ません。
デスクトップなら今でもCOMポートは標準で搭載されているはずです。
一昔前まではノートPCであっても、
USBも無かったため、通信はもっぱらCOMポートだけでした。

ソースをざっと見る限り間違いは無いようですね。
ポート番号の確認はされましたか?
ハイパーターミナルなどが使えるなら、
それぞれで通信出来るか確認出来るかも知れません。
フリーの通信ソフトなどもあります。

この回答への補足

標準ポートの意味は理解できました。ありがとうございます。
PCにはCOMポートがついているのですが、通信相手はUSBインターフェースのみです。

ポート番号の確認はできており、数バイトの送受信は問題なくできています。
フリーの通信ソフトでバイナリデータ受信ができるものが見つかりましたので試してみたところ、当方のソフトウェア動作と同じく、XPでは512バイト受信し、2000では128バイト受信していました。XPで受信した512バイトデータの先頭128バイトと同一データであることも確認しました。2000の時には、デバイス側は128バイト送信後、応答がなくなってしまいます。PCがデータを受信したことを認識できていないものと思われます。
(デバイス側は128バイト送信し、PCが受信完了したことを確認後、次の128バイト送信、を4回繰り返し512バイト送信するという動作をします。)

他の方の作成されたソフトウェアでも同様の問題が発生するということで、私のVBのソフトが間違っているという可能性が低くなったとは思いますが、それはそれで、問題の解決が遠のいたということなのであまり喜ばしくありません。

当面は、VB側でOSを認識し、2000の時には該当の機能を使用しないことで回避したいと思います。引き続き調査し、問題の解決に努力します。

補足日時:2007/01/20 00:23
    • good
    • 1

Windows2000って、USB仮想COMポートをサポートしていなかったような気が・・・



USBのドライバーを最新にしてみたり、
Windowsをアップデートしても同じでしょうか?

それでも症状が同じなら、そのままじゃ無理かも知れませんね。
VBのソースがどう書かれているのか分からないので、何とも云えませんが。

私もXPでの仮想COMポート接続は試した事がありますが、
XPはUSBにも対応しているので問題はほとんど起きません。
トラブルが起きてもドライバ側が多いでしょう。

Windows2000の標準ポートで試してみるのが一番かと思います。

この回答への補足

回答ありがとうございます。
Windows2000がUSB仮想COMポートをサポートしていないとは知りませんでした。
そもそも、仕事でやっているわけでなく、自宅で趣味としてぽちぽち一人でやっているのであまり情報がありません。標準ポートというものも知りませんでしたので調べて試してみます。

USBのドライバーは最新です。そもそもバージョンがありません。
Windowsのアップデートはやってあります。2台のWindows2000で試して同症状でした。WindowsXPは1台試しました。

VBのソースと通信ログを以下に貼り付けておきます。

Mscomm1.InBufferSize:1024
.InputLen :0

Public Function GetData As Variant
'データを取得する
'成功時:512の配列を返す
'失敗時:エラーコードを返す
Dim Buffer As String
Dim aRet(511) As Byte
Dim Tmp
Dim l As Integer
Dim StartTime As String
Dim Sec As Integer
Dim i As Integer
Dim j As Integer

'通信設定
MainForm.MSComm1.InputMode = comInputModeBinary

Buffer = "g" 'データ送信要求コマンド
MainForm.MSComm1.Output = Buffer

OTFlag = False  'タイムオーバー(10秒)判定用
StartTime = Now

Do
If MainForm.MSComm1.InBufferCount > 0 Then
WriteLog "InBufferCount:" & MainForm.MSComm1.InBufferCount 'debug
Tmp = MainForm.MSComm1.Input
WriteLog "UBound(Tmp):" & UBound(Tmp) 'debug
For j = i To i + UBound(Tmp)
aRet(j) = Tmp(j - i)
Next
i = i + UBound(Tmp) + 1
End If

WriteLog "i:" & i & " j:" & j 'debug

DoEvents

Sec = DateDiff("s", StartTime, Now)
If Sec >= 10 Then
OTFlag = True
Exit Do   '10秒以上経過したらLOOPを抜ける
End If
Loop Until i >= 511

If OTFlag Then
GetData = TIME_OUT 'ErrCode(1)="TIME_OUT"
Exit Function '<-ここで出てしまう
End If

If l > 511 Then
GetData = RETURN_MISMATCH 'ErrCode(2)="RETURN_MISMATCH"
Exit Function
End If

GetData = aRet

End Function

XP相手のログ
2006/12/30 19:42:00InBufferCount:128
2006/12/30 19:42:00UBound(Tmp):511
2006/12/30 19:42:00i:512 j:512

2000相手のログ
2006/12/30 21:57:27InBufferCount:64
2006/12/30 21:57:27UBound(Tmp):63
2006/12/30 21:57:27i:64 j:64
2006/12/30 21:57:27InBufferCount:64
2006/12/30 21:57:27UBound(Tmp):63
2006/12/30 21:57:27i:128 j:128
2006/12/30 21:57:27i:128 j:128
2006/12/30 21:57:27i:128 j:128
2006/12/30 21:57:27i:128 j:128
2006/12/30 21:57:27i:128 j:128
以下、延々と同じ

補足日時:2007/01/13 00:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!