阅读:2300回复:14
如何实现usb设备给上位机发送消息?
向各位大侠请教一个困惑我好久的问题:我准备用d12+89c52做一个usb数据采集板,我想实现这样的功能:上位机给下位机发送命令让下位机采集指定长度的数据,等下位机采集完指定长度的数据时通知上位机数据已经准备好,让上位机发送读取数据命令来读取数据。大家都知道usb是主从式的通信协议,usb设备不能主动给主机发送命令。我该怎么做才能实现下位机给上位机发送“数据已经准备好”这个命令?仅仅在固件程序中能实现吗?
|
|
最新喜欢:![]()
|
沙发#
发布于:2004-10-01 14:39
强烈关注,我也想要知道(目前要用),大侠们请指教!!!
|
|
板凳#
发布于:2004-10-09 18:01
关注....
|
|
|
地板#
发布于:2004-10-09 20:27
难道没人出手相救吗?
我自己想用这两种方法中的一种: 1:写满缓冲区后设置一个标志位为1,host应用程序每隔一段时间访问这个标志位,如果是1就readfile()取走数据 2:用deviceiocontrol(),但不知具体怎么做,能否指点一下?谢谢!!!!!!!!!!!!!! |
|
地下室#
发布于:2004-10-09 21:35
lovetina,你好!我也是这样想的,但是我现在一直不知道咋确定上位机查询的时间间隔该如何确定?还有,我觉得你说的第二种方法好像和第一种方法一样呀!你的上位机HOST查询是通过啥命令查询的?我觉得第一种方法的查询也可以通过DeviceIoControl命令发送自定义请求来实现的呀!不知您是如何实现的?大家多探讨!!!!
|
|
|
5楼#
发布于:2004-10-10 16:56
我用的readfile函数,没用deviceiocontrol,对于第一种方法我想在应用程序中设个定时器,根据数据采集的速度,大致计算一下固件程序里面填满缓冲区的时间,这个时间作为定时器的触发间隔,然后访问固件里面的那个缓冲区满的标志,这样行吗?
|
|
6楼#
发布于:2004-10-10 21:10
lovetina,我就准备这样做。但是查询的时间间隔我现在还没想好该如何来确定,大不了将来调程序的时候慢慢调试逐步找到比较合适的值。还有就是你的查询是用啥命令来实现的,我总觉得应该是deviceiocontrol命令来发送请求查询的,不知你是如何查询的?
|
|
|
7楼#
发布于:2004-10-11 08:37
我那个查询的想法现在还没试过,还只是一个想法而已。不过我的查询间隔时间大致是可以确定的。我没用过deviceiocontrol,好像这个API的第二个参数要驱动的支持才能使用,我不知道该怎么用。能否参考一下你的代码? xionghaoyu@tom.com
|
|
8楼#
发布于:2004-10-11 17:32
USB的中断传输方式是不是能主动发给主控端信息?
|
|
|
9楼#
发布于:2004-10-11 17:39
我的QQ是23811353,交个朋友吧!!!
|
|
|
10楼#
发布于:2004-10-13 13:23
USB的中断传输方式是不是能主动发给主控端信息? USB所以的动作都是由host发起的,中断传输也不例外,应该是host定时查询的 |
|
11楼#
发布于:2004-10-14 14:27
你不想发数据就把中断关掉。想发了再开IN中断。
|
|
12楼#
发布于:2004-10-14 14:53
如果是控制传输和批量传输,主机也会定时查询吗?
|
|
|
13楼#
发布于:2004-10-14 16:30
主控制器不管有无数据传输,它都会按预定的时间间隔连续发出SOF令牌包,说中断传输是host定时查询就是这个意思。对于其他传输也是一样的,只是对不同的传输类型(中断、控制等)握手包的格式不同而已,当然device根据不同的握手包作出不同的响应,返回应答包。具体的还是看看USB协议吧。
|
|
14楼#
发布于:2004-10-16 16:39
可以注册一个通知或用wmi事件,在驱动程序中实现一个interrupt方式端口。驱动程序可采用在系统线程轮巡或在完成例程中保持一个读请求都可以。
|
|