打印

usb hid中,如何判断上位机已打开本设备?

[复制链接]
7919|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
root_007|  楼主 | 2012-3-6 17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
虚拟串口中可以用DTR来判断,但虚拟串口易受干扰,打算用HID来试试,但不知道有没有像DTR一样的办法来判断上位机是否已打开HID设备?
沙发
root_007|  楼主 | 2012-3-7 08:58 | 只看该作者
真是难题啊,竟然就没人知道。

使用特权

评论回复
板凳
香水城| | 2012-3-7 22:48 | 只看该作者
你说的上位机已打开HID设备是什么概念? 枚举成功算不算已打开HID设备?

使用特权

评论回复
地板
root_007|  楼主 | 2012-3-8 11:02 | 只看该作者
版主光临啦,我这个问题只怕除了版主也没人能知道了,属冷门应用。

枚举成功不算打开,要PC端程序调用CreateFile成功后才算打开。
虚拟串口,上位机CreateFile后,下位机中的DTR=1(demo中没有这个功能,需要自己修改),就能知道上位机已打开虚拟串口了,HID似乎没有这样的标志位。

使用特权

评论回复
5
香水城| | 2012-3-8 17:29 | 只看该作者
呵呵,还真没有听说有这个功能。

LZ要知道这个功能有什么用呢? 可以在CreatFile之后送一个命令来实现这个要求吗?

使用特权

评论回复
6
yifanfeng| | 2012-3-9 13:00 | 只看该作者
已用USB Analyzer求证过了,只要HID设备被正确枚举,CreateFile 就可以成功,并且CreateFile不会在总线上带来任何Transaction。

使用特权

评论回复
7
root_007|  楼主 | 2012-3-14 14:26 | 只看该作者
看来无解,该如何给分啊?没看到给分的链接

使用特权

评论回复
8
香水城| | 2012-3-14 14:27 | 只看该作者
看来无解,该如何给分啊?没看到给分的链接
root_007 发表于 2012-3-14 14:26


LZ还没有回答我在5楼的问题和建议呢。

使用特权

评论回复
9
lixun00| | 2012-3-14 15:30 | 只看该作者
就算知道了,也可能应用程序非法关闭,但没有释放设备接口。

还是要通信协议保证

使用特权

评论回复
10
root_007|  楼主 | 2012-3-21 12:43 | 只看该作者
本帖最后由 root_007 于 2012-3-21 12:45 编辑

8# 香水城

CreateFile后发消息是可以的,但关闭就没办法知道了,因为上位机有可能会异常关闭,没办法及时发关闭消息给下位机,打算试试超时方式。
虚拟串口在驱动中实现了这个机制,就算上位机异常退出,下位机也能知道PC机关闭了串口。

使用特权

评论回复
11
root_007|  楼主 | 2012-3-21 12:47 | 只看该作者
就算知道了,也可能应用程序非法关闭,但没有释放设备接口。

还是要通信协议保证
lixun00 发表于 2012-3-14 15:30


虚拟串口,就算应用程序非常关闭,系统也会释放设备接口,下位机也能知道PC机已关闭串口,但HID还没找到办法。

使用特权

评论回复
12
香水城| | 2012-3-21 13:33 | 只看该作者
LZ还是说说你想做什么吧,应该有其他办法解决你的问题。

现在你只说了希望使用的手段,但没有说希望实现的目标。

使用特权

评论回复
13
lxyppc| | 2012-3-21 14:14 | 只看该作者
楼主,你这个需求太小众了
程序非常关闭,系统会释放资源,HID驱动程序会释放USB总线上的带宽
表现出的形式就是连在设备上的USB数据线上周期性的Ping包会消失,要区别于SOF信号
这个需要用示波器确定一下,我不太确定

接下来是设备方面,STM32收到这个Ping会根据相应标志去自动处理,他不会告诉你这个Ping是否来了
他只能保证Ping来了你的数据准备好了,它就发出去
如果你要用这个来检测,实质上和用心跳超时检测是一样的

还一种方法,就是写HID的Filter Driver,可以保证你的应用程序是否正常退出,都能通知下面的设备。
感觉楼主和我之前做的一个东西很像,也是要求关闭一个HID设备时发消息。
最后是在Kernel态中解决的

使用特权

评论回复
14
root_007|  楼主 | 2012-3-22 11:41 | 只看该作者
本帖最后由 root_007 于 2012-3-22 11:46 编辑
LZ还是说说你想做什么吧,应该有其他办法解决你的问题。

现在你只说了希望使用的手段,但没有说希望实现的目标。
香水城 发表于 2012-3-21 13:33


简单说,就是上位机运行时,mcu只起一个转接使用,通过mcu的usart转发数据。
pc关机或上位机异常中断时,mcu就起上位机的作用(mcu中跑的程序与pc上位机程序功能差不多),把usart2发回来的数据保存到一个外部flash上,上位机打开时再传到上位机上。

虚拟串口中,可判断DTR。

使用特权

评论回复
15
root_007|  楼主 | 2012-3-22 11:44 | 只看该作者
感觉楼主和我之前做的一个东西很像,也是要求关闭一个HID设备时发消息。

太对啦,就是让MCU知道上位机是否已打开本HID设备。CreateFile后可以发个消息通知打开,但关闭消息若是上位机异常关闭,下位机就不知道了。

不知道你说的在Kernel态中解决,是否指自己编写HID驱动?那对我这半吊子来说,实在太难了点。

使用特权

评论回复
16
香水城| | 2012-3-22 21:39 | 只看该作者
简单说,就是上位机运行时,mcu只起一个转接使用,通过mcu的usart转发数据。
pc关机或上位机异常中断时,mcu就起上位机的作用(mcu中跑的程序与pc上位机程序功能差不多),把usart2发回来的数据保存到一个外部flash ...
root_007 发表于 2012-3-22 11:41


如果是这个功能,根本不需要知道上位机什么时候打开或关闭HID设备,只需要下位机接收数据并保存到缓冲区,当上位机需要数据时,下位机就会收到IN Token,这时下位机只需从缓冲区的另一端取出数据,并发送到上位机即可。

总之,下位机控制UART的一端只管接收数据并保存到缓冲区就可以了。而下位机控制USB的一端只管从缓冲区取数据并向上位机发送数据就可以了。

使用特权

评论回复
17
lxyppc| | 2012-3-23 09:00 | 只看该作者
不知道你说的在Kernel态中解决,是否指自己编写HID驱动?那对我这半吊子来说,实在太难了点。
[/url]

是的,当时我们写了一个HID的过滤驱动
但驱动在64位系统上需要认证,这个比较麻烦
我觉得可以监视进程退出,这个应该不用写驱动

既然你想通过USB口来完成串口的功能,为何不做成USB转串口的设备

使用特权

评论回复
18
root_007|  楼主 | 2012-3-23 09:40 | 只看该作者
是的,当时我们写了一个HID的过滤驱动
但驱动在64位系统上需要认证,这个比较麻烦
我觉得可以监视进程退出,这个应该不用写驱动

既然你想通过USB口来完成串口的功能,为何不做成USB转串口的设备 ...
lxyppc 发表于 2012-3-23 09:00


其实开始就是用虚拟串口的,所有软硬件都完成了,公司内部测试都没问题,结果把工程机投入实际环境中一测试,才发现问题大大的,虚拟串口太经不起干扰,工作非常不稳定,同一板子,现在换成HID,已经可以完全无视干扰,微软的CDC驱动,问题大大的,实在不适合做产品。现在唯一的问题就是这个判断上位机是否打开HID的问题,你说的监视进程退出,这个倒也是个办法,结合心跳包,应该也勉强够用了,非常感谢兄弟。

使用特权

评论回复
19
root_007|  楼主 | 2012-3-23 09:44 | 只看该作者
如果是这个功能,根本不需要知道上位机什么时候打开或关闭HID设备,只需要下位机接收数据并保存到缓冲区,当上位机需要数据时,下位机就会收到IN Token,这时下位机只需从缓冲区的另一端取出数据,并发送到上位机 ...
香水城 发表于 2012-3-22 21:39


现在用的HID就是有2046缓存的,依VCP改的,不过我的离线数据可能会有几M几十M,而且还需要解码,一定要判断上位机状态才行。目前看来HID协议本身不提供这个功能,只能通过变通的办法了,非常感谢版主关注这个话题。

使用特权

评论回复
20
香水城| | 2012-3-25 13:03 | 只看该作者
现在用的HID就是有2046缓存的,依VCP改的,不过我的离线数据可能会有几M几十M,而且还需要解码,一定要判断上位机状态才行。目前看来HID协议本身不提供这个功能,只能通过变通的办法了,非常感谢版主关注这个话题 ...
root_007 发表于 2012-3-23 09:44


判断上位机状态的目的是什么?是为了接收离线数据,还是为了发送收到的离线数据?显然是后者!即不管上位机状态如何都要接收离线数据,那么假如HID主机通过CreateFile打开了通道,但由于某种原因在较长时间内没有从HID设备端取数据,你该怎么办?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

20

帖子

0

粉丝