VB6用定时器查询的方式实现与USB设备通讯慢,如何解决?

哟哟咕咕 2012-08-17 05:05:34
Public Sub WriteReport()
result = WriteFile(HidDevice, SendBuffer(0), 65, 0, 0)
End Sub



Public Sub tmrDelay_Timer()
Timeout = True
SetHosMsg.tmrDelay = False
End Sub

Public Sub ReadReport()
result = ReadFile(HidDevice, ReadBuffer(0), 65, 0, 0)
End Sub

Public Sub VBtoUSB()
Call WriteReport '发送

Timeout = False
SetHosMsg.tmrDelay.Interval = 5
SetHosMsg.tmrDelay.Enabled = True
Do
DoEvents
Loop While Timeout = True

Call ReadReport '接收
End Sub


借鉴了别人的程序,调用了API来实现与下位机USB通讯。
我现在是用VB中tmr定时器,以1ms的速度(VB6定时间最小1ms)去查询USB设备,但是调试到一条指令下发至返回有64ms!!!!!!一直找不到哪里花去了这么多时间。注:USB设备是STM32F103,以PLL/1.5的速度来描述USB速度,可以说肯定可以保证VB6中1ms的速度。
...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2012-08-20
  • 打赏
  • 举报
回复

是 HID 设备?

不需要都用延时。

如果接收返回错误,可能是下位机来不及应答,此时再延时后重复接收。

另外,我一般是用下面一组 API:

Public Declare Function ConnectToUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal vid As Integer, ByVal pid As Integer, ByVal version As Integer) As Long
Public Declare Sub CloseUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long)

Public Declare Function SetFeatureToUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long, ByRef buff As Byte, ByVal datalength As Long) As Long
Public Declare Function GetFeatureFromUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long, ByRef buff As Byte, ByVal datalength As Long) As Long

Public Declare Function GetFeatureLength Lib "HS32U2_HID.dll" (ByVal hDev As Long) As Long

SetFeature 相当于 WriteReport;GetFeature 相当于 ReadReport。
of123 2012-08-20
  • 打赏
  • 举报
回复

是 HID 设备?

不需要都用延时。

如果接收返回错误,可能是下位机来不及应答,此时再延时后重复接收。

另外,我一般是用下面一组 API:

Public Declare Function ConnectToUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal vid As Integer, ByVal pid As Integer, ByVal version As Integer) As Long
Public Declare Sub CloseUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long)

Public Declare Function SetFeatureToUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long, ByRef buff As Byte, ByVal datalength As Long) As Long
Public Declare Function GetFeatureFromUSBHIDDevice Lib "HS32U2_HID.dll" (ByVal hDev As Long, ByRef buff As Byte, ByVal datalength As Long) As Long

Public Declare Function GetFeatureLength Lib "HS32U2_HID.dll" (ByVal hDev As Long) As Long

SetFeature 相当于 WriteReport;GetFeature 相当于 ReadReport。
哟哟咕咕 2012-08-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
这个得研究一二。
[/Quote]

要研究呀?就是很少人这来实现与USB设备(下位机)通讯?

有什么其它方法可以实现不?简单地说就是:USB设备(下位机)收到数据住PC的USB(上位机)发送数据。
贝隆 2012-08-17
  • 打赏
  • 举报
回复
这个得研究一二。
哟哟咕咕 2012-08-17
  • 打赏
  • 举报
回复
Public Sub ConnectRMC()              '查找及打开设备
Dim HidGuid As GUID
Dim DeviceInfoSet As Long
Dim MemberIndex As Long
Dim result As Long
Dim Needed As Long
Dim DetailData As Long
Dim PreparsedData As Long
Dim DetailDataBuffer() As Byte
Dim DevicePathName As String

Dim LastDevice As Boolean
Dim MyDeviceDetected As Boolean

LastDevice = False
MyDeviceDetected = False

result = HidD_GetHidGuid(HidGuid)
DeviceInfoSet = SetupDiGetClassDevs(HidGuid, 0, 0, (DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE))
'DataString = GetDataString(DeviceInfoSet, 32)

MemberIndex = 0

For MemberIndex = 0 To 10
MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData)
result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, HidGuid, MemberIndex, MyDeviceInterfaceData)

If result = 0 Then LastDevice = True

If result <> 0 Then
MyDeviceInfoData.cbSize = Len(MyDeviceInfoData)
result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, 0, 0, Needed, 0)
DetailData = Needed

MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData)
ReDim DetailDataBuffer(Needed)

Call RtlMoveMemory(DetailDataBuffer(0), MyDeviceInterfaceDetailData, 4)

result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, VarPtr(DetailDataBuffer(0)), DetailData, Needed, 0)

DevicePathName = CStr(DetailDataBuffer())
DevicePathName = StrConv(DevicePathName, vbUnicode)
DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4)

HidDevice = CreateFile(DevicePathName, GENERIC_READ Or GENERIC_WRITE, (FILE_SHARE_READ Or FILE_SHARE_WRITE), 0, OPEN_EXISTING, 0, 0) '打开设备DevicePathName 是由 SetupDiGetDeviceInterfaceDetail返回的

If HidDevice <> INVALID_HANDLE_VALUE Then
DeviceAttributes.Size = LenB(DeviceAttributes)
result = HidD_GetAttributes(HidDevice, DeviceAttributes) '获取设备VendorID和ProductID
result = CloseHandle(HidDevice)
If result <> 0 And DeviceAttributes.VendorID = MyVendorID And DeviceAttributes.ProductID = MyProductID And DeviceAttributes.VersionNumber = MyVersionNumber Then
HidDevice = CreateFile(DevicePathName, GENERIC_READ Or GENERIC_WRITE, (FILE_SHARE_READ Or FILE_SHARE_WRITE), 0, OPEN_EXISTING, 0, 0)
If HidDevice <> INVALID_HANDLE_VALUE Then
MyDeviceDetected = True
Exit For
'Else
'MsgBox ("再次打开失败")
End If
Else
'MsgBox ("管理平台与设备无法匹配")
End If
Else
'MsgBox ("打开设备失败")
End If
End If
Next MemberIndex

If MyDeviceDetected = True Then
FindTheHid = True
'MsgBox ("设备连接正常")
Exit Sub
Else
FindTheHid = False
'MsgBox ("无法找到设备")
End If
End Sub


这是打开USB设备,及调用的一些API,没发现哪里有设备USB速度问题,怎么会跑这么慢呢?
STM32F105R8T6+TJA1050 CAN接口开发板软硬件设计资料包括PDF原理图+软件例程源码+技术文档资料: 1、配套实验程序 2、使用说明 必读 4、原理图 5、ST-Link资料包 6、CAN总线相关学习资料 7、USB转串口线驱动程序 STM32-105_CN.pdf ADC-PA0采集电压转发到串口1显示.rar CRC校验例程.rar STM32_CAN500K USART_LED.zip STM32_IO操作_LED.rar STM32_USART_LED_CAN500K.rar STM32_串口232通信USART.rar SysTick(系统滴答定时器)操作.rar TIM定时器操作LED翻转.rar 按键S1(查询方式)对应LED翻转.rar CAN232MB CAN总线协议转换器用户手册.pdf CAN232MB配置流程-曙光单片机.pdf CAN_bus仪表的通讯模块设计.pdf can_intro.pdf CAN总线控制器MCP2515的原理及应用.pdf CAN总线的语音合成模块研制技术.pdf CTM1050.pdf CTM8251.USR.Ddb MCP2515在CAN总线系统智能节点的应用.pdf MCP2515的使用.pdf SPI介绍.pdf SPI总线在51系列单片机系统中的实现.pdf TJA1050.doc 一种车用CAN总线网络测试系统的研究.pdf 单片机软件模拟SPI接口的解决方案(1).pdf 单片机软件模拟SPI接口的解决方案.pdf 周立功CAN232MB.pdf 基于ARM和CAN总线的分布式数据采集系统设计.pdf 基于ARM和CAN总线的电气信号采集节点的设计.pdf 基于ARM的CAN总线电力远程抄表系统的研究.nh 基于CAN总线和ARM的汽车液晶仪表的设计与研究.kdh 基于CAN总线和以太网的嵌入式系统设计与研究.nh 基于MCP2515的多路CAN总线接口及驱动程序设计.pdf 基于MSP430的模拟SPI串口通信的实现.pdf 基于SJA1000应用设计电路.Sch 基于SJA1000的CAN节点设计v1.0.pdf 基于VB的CAN总线测试软件设计[1].pdf 基于两级网络的综采面液压支架监测系统的研究.kdh 基于嵌入式系统和CAN总线技术的自动售货机控制系统开发.nh 基于无线传感器和CAN总线的直接式轮胎压力监测系统.pdf 基于现场总线的工作面液压支架监控系统的研究.kdh 基于软件模拟的SPI端口CAN控制卡的软硬件设计.pdf

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧