最近我做一个项目,需要用到电脑和USB
设备进行通信。按照网上找到的教程,安装好VISA对USB设备的驱动,如图1所示。按照教程来说,只需要visa打开、写入、读取和关闭四个函数就够了。但是连接好后,运行的时候,读取就会报错。VISA: (Hex 0xBFFF003A)
由于设置无效(导致属性被设置为不一致状态),将无法开始该操作。
图1 驱动已正确安装
图2 原报错的程序
图3 弹出的错误窗口
在学习了解USB的协议和基本设置之后,知道此设备是HID类型,并且输入和输出都是中断传输。这些信息的查询方法有很多,介绍一种简单易行的。如图4所示,打开NI-VISA Driver Wizard 软件,就是当初用来设置驱动的那个。选择USB之后,这个界面右边的文本框中有USB设备的信息。其中,bInterfaceClass,代表设备的类型。设备类型的详细内容如如5所示。我使用的设备是0x03,对应的是人机接口类(HID)。
图4 查看bInterfaceClass信息
图5 USB接口类别
之后,查看bmAttributes为0x03,如图6所示。代表中断传输。本文仅使用于完全一样的设置,其他的设备出现的问题就不清楚了。
图6 查看bmAttributes
HID设备,仅支持控制传输和中断传输。需要主机发送命令后,USB设备返回信息,这样才能完成读取。
在打开
visa测试面板之后,在Configuration中的view attributes窗口中,如图7.在Bulk in Pipe Statues中,显示不存在。这个就是visa读取报错的原因。而USB设备向上传输的是Interrupt In Pipe ,对应端点是0x81。也就是,需要利用USB的中断才能进行读取了。
图7 错误的原因
在
labview的visa选板中,高级visa>>事件处理,选择visa启用事件和visa等待事件。如图8所示。
图8 visa启用事件和visa等待事件
接着,在visa选板》高级visa》总线与接口配置》visa USB中,选择visa获取u***设备中断数据。如图9所示。
图9 选择 VISA获取USB中断数据
连接好的程序如图10所示。要注意必须在visa写入之后才可以读取u***中断返回的数据。不写入或是写入的数据错误导致无返回值,就会产生超时错误 VISA: (Hex 0xBFFF0015) 完成操作前超时已过期。可以将超时的时间设置的长一些,看一下是不是此处的问题。如果还是在超时这里有问题,拔插一下USB,再试试吧。
图10 基本程序
连接VISA获取USB中断数据时,可能会有接线端冲突,要在 visa等待事件 定义类型,如图11所示。
图11 设定类型