APP使用Usb被占用独占模式问题记录

问题描述:

              app中用到外接usb 设备,但是其他应用也是用到了usb,那么就存在一个问题,当别的应用先通过授权的方式获取到usb 权限,并且申请了独占模式,别的应用就无法再通过usb 传输数据,即使你已经通过了usb 获取到权限,并且可以正常的获取到

UsbDevice 设备,并且通过openDevice获取到UsbDeviceConnection,也可以获取到设备id.但是就是无法读写数据.

这是我的正常操作:

UsbDevice device = (UsbDevice) intent.getParcelableExtra (UsbManager.EXTRA_DEVICE);
UsbManager usbManager= (UsbManager) getSystemService (Context.USB_SERVICE);
UsbDeviceConnection connection = usbManager.openDevice (device);

独占模式:

connection.claimInterface (device.getInterface (0),true);
connection.releaseInterface (device.getInterface (0));

当设置这两个参数后表示启动了独占模式,claimInterface 方法是告诉linux 断开这个端口的设备,releaseInterface 是启动这个端口独占模式.

 

可以参考android api 文档的解释:http://www.android-doc.com/reference/android/hardware/usb/UsbDeviceConnection.html#claimInterface(android.hardware.usb.UsbInterface,%20boolean)

解决问题:

在获取到UsbDeviceConnection 后通过设置

connection.claimInterface (device.getInterface (0),true);

connection.releaseInterface (device.getInterface (0));

独占模式,可以解决usb 被占用的问题,当然别的设备也可以通过这种方式,重新获取到设备.

 

 

 

 

Traceback (most recent call last): File "C:\Users\Administrator\Desktop\testall\EOL\EOL\TestCase_project.py", line 362, in <module> EOL.FMtest(5, Relyport) ~~~~~~~~~~^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\testall\EOL\EOL\EOL_project.py", line 2319, in FMtest self.SFE.SFEInit() ~~~~~~~~~~~~~~~~^^ File "C:\Users\Administrator\Desktop\testall\EOL\EOL\EOL_project.py", line 16, in SFEInit self.inst = self.rm.open_resource('TCPIP::193.18.1.10::INSTR') ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyvisa\highlevel.py", line 3292, in open_resource res.open(access_mode, open_timeout) ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyvisa\resources\resource.py", line 281, in open self.session, status = self._resource_manager.open_bare_resource( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ self._resource_name, access_mode, open_timeout ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "C:\Users\Administrator\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyvisa\highlevel.py", line 3217, in open_bare_resource return self.visalib.open(self.session, resource_name, access_mode, open_timeout) ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyvisa\ctwrapper\functions.py", line 1850, in open ret = library.viOpen( session, resource_name, access_mode, open_timeout, byref(out_session) ) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyvisa\ctwrapper\highlevel.py", line 226, in _return_handler return self.handle_return_value(session, ret_value) # type: ignore ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
最新发布
04-03
<think>好的,我现在需要帮助用户解决PyVISA中viOpen函数导致的Traceback错误。首先,我得回忆一下PyVISA的基本使用和常见的错误类型。用户提到了viOpen函数出错,这通常与资源管理器的初始化或设备连接有关。根据用户提供的引用,特别是引用[4]中的步骤,PyVISA的操作流程应该是先打开默认资源管理器,然后通过地址打开设备连接。 首先,用户可能在调用viOpen之前没有正确初始化资源管理器。根据引用[4],第一步是viOpenDefaultRM,也就是在PyVISA中通常是通过rm = pyvisa.ResourceManager()来创建资源管理器。如果这一步遗漏了,或者资源管理器没有正确初始化,后续的viOpen自然会失败。这时候应该检查代码中是否有正确创建ResourceManager实例。 然后,设备的地址是否正确。比如,USB、GPIB、TCPIP等接口的地址格式是否正确。例如,GPIB地址可能是'GPIB0::12::INSTR',而USB可能是'USB0::0x1234::0x5678::SN12345::INSTR'。用户需要确认地址字符串是否准确,可以使用rm.list_resources()来列出所有可用设备,确保设备被正确识别。 接下来,权限问题。特别是在Linux系统下,访问USB或GPIB设备可能需要特定的用户权限。用户可能需要将自身加入相应的用户组,或者修改udev规则,避免使用sudo运行程序。引用[2]提到头文件的问题,但在这里可能对应的是驱动或库的安装问题。比如,是否安装了NI-VISA或PyVISA的依赖库,如libusb。 此外,检查PyVISA的后端是否正确配置。PyVISA支持多种后端,比如ni-visa、pyvisa-py。如果用户没有安装NI-VISA,可能需要使用pyvisa-py作为后端,但需要单独安装。可以通过设置环境变量PYVISA_LIBRARY来指定后端,或者检查pyvisa.info()来确认当前使用的后端。 如果设备被其他进程占用,也会导致viOpen失败。这时候需要确保没有其他程序(如NI MAX、LabVIEW)正在使用设备。引用[4]中的VI_ERROR_RSRC_LOCKED错误就是资源被独占的情况,用户需要关闭其他可能占用设备的程序。 然后,检查VISA库的安装是否正确。如果使用的是NI-VISA,需要确认其安装路径是否被正确识别,特别是在Windows系统中,可能需要手动指定库路径。对于PyVISA-py后端,可能需要安装相关的驱动支持。 最后,查看具体的Traceback信息,错误消息通常会给出线索。例如,如果提示“VI_ERROR_INV_OBJECT”,可能意味着地址错误或设备未连接;如果是权限问题,可能会有访问被拒绝的信息。用户需要根据错误代码或消息进一步排查。 总结下来,解决步骤可能包括:确认资源管理器初始化、验证设备地址、检查权限和驱动、确保设备未被占用、验证后端配置,以及查看详细的错误信息。如果用户能提供具体的错误日志,可以更精准地定位问题。</think>### PyVISA打开资源错误的解决方法 当使用PyVISA的`viOpen`函数时出现Traceback错误,通常与**资源管理器初始化**、**设备地址格式**、**权限问题**或**驱动配置**相关。以下是逐步排查方法: --- #### 1. **检查资源管理器初始化** PyVISA操作需先通过`ResourceManager()`建立资源管理器。若未正确初始化,会导致后续操作失败。 ```python import pyvisa rm = pyvisa.ResourceManager() # 必须正确初始化 resources = rm.list_resources() # 列出所有可用设备地址 print("可用设备:", resources) ``` - **错误示例**:若跳过`ResourceManager()`直接调用`viOpen`,会触发`AttributeError`或`VI_ERROR_INV_SESSION`[^4]。 - **解决**:确保代码中包含资源管理器初始化。 --- #### 2. **验证设备地址格式** 设备地址需符合VISA标准格式(如GPIB、USB、TCP/IP地址)。 - **GPIB示例**:`'GPIB0::12::INSTR'` - **USB示例**:`'USB0::0x1234::0x5678::SN12345::INSTR'` - **验证方法**:使用`rm.list_resources()`查看实际地址。 --- #### 3. **检查设备权限(Linux/Mac系统)** 若在Linux/Mac下操作USB/GPIB设备,可能需要权限配置: ```bash # 查看设备权限(如/dev/usbtmc0) ls -l /dev/usbtmc* # 将用户加入仪器访问组(如tty、usb等) sudo usermod -aG tty $USER ``` - **错误现象**:`VI_ERROR_RSRC_LOCKED`或`Permission denied`[^4]。 --- #### 4. **确认VISA驱动安装** PyVISA依赖后端驱动(如NI-VISA或`pyvisa-py`): - **NI-VISA**:需从NI官网安装驱动。 - **pyvisa-py(纯Python后端)**:安装后需指定后端: ```python # 使用pyvisa-py后端 rm = pyvisa.ResourceManager('@py') ``` ```bash # 安装pyvisa-py pip install pyvisa-py ``` - **验证后端**:`print(pyvisa.info())`查看当前使用的库。 --- #### 5. **检查设备占用情况** 若设备被其他进程(如NI MAX、LabVIEW)占用,会导致`VI_ERROR_RSRC_LOCKED`: - **解决**:关闭占用程序,或重启设备。 --- #### 6. **查看完整Traceback信息** 根据错误类型进一步排查: - **`VI_ERROR_INV_OBJECT`**:设备地址错误或设备未连接。 - **`VI_ERROR_QUEUE_ERROR`**:异步操作冲突,尝试同步模式。 - **`VI_ERROR_INV_SESSION`**:资源管理器未正确初始化[^4]。 --- #### 示例代码修正 ```python import pyvisa try: rm = pyvisa.ResourceManager() device = rm.open_resource('GPIB0::12::INSTR') # 替换为实际地址 print(device.query('*IDN?')) # 测试通信 except pyvisa.Error as e: print("VISA错误:", e) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值