关于android Usb的问题

考拉一枚 2015-12-18 07:25:29
我有160*128*2个字节的数据从硬件通过USB传到安卓平板,最终这160*128*2个数据无法完全接受到?这是什么问题 有前辈遇到过吗?求解
...全文
297 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_37106594 2017-02-27
  • 打赏
  • 举报
回复
请问怎么实现软件与硬件交互?
hli27 2015-12-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_24947841 的回复:
[quote=引用 2 楼 hli27 的回复:] 好好看看是不是解析出了问题 按理不可能接受不到
能详细说说么?硬件那边我不太清楚的,只知道约定好的命令,然后我用第三方库按照命令能得到完整的数据,但直接用andrroiid提供的API不行[/quote] 把你接收数据的代码贴出来看看
考拉一枚 2015-12-21
  • 打赏
  • 举报
回复
有大神来看看么 求解
hli27 2015-12-21
  • 打赏
  • 举报
回复
引用 9 楼 qq_24947841的回复:
现在的问题就是:我要实现的是硬件图像的实时显示,通过jni调用第三方库耗时比较严重,而android提供的api又无法支持较大数据,而且我查它源码发现也是用Jni的 不知道换个第三方库效果会不会好些
sorry 不能帮你了 学android不久
考拉一枚 2015-12-21
  • 打赏
  • 举报
回复
现在的问题就是:我要实现的是硬件图像的实时显示,通过jni调用第三方库耗时比较严重,而android提供的api又无法支持较大数据,而且我查它源码发现也是用Jni的 不知道换个第三方库效果会不会好些
考拉一枚 2015-12-21
  • 打赏
  • 举报
回复
我把接口端点信息都log出来了 发现没有问题,但是数据就是丢失了 查到有人说bulk传输有大小限制16K 看了下的确是这样
考拉一枚 2015-12-21
  • 打赏
  • 举报
回复
引用 6 楼 hli27 的回复:
[quote=引用 3 楼 qq_24947841 的回复:] [quote=引用 2 楼 hli27 的回复:] 好好看看是不是解析出了问题 按理不可能接受不到
能详细说说么?硬件那边我不太清楚的,只知道约定好的命令,然后我用第三方库按照命令能得到完整的数据,但直接用andrroiid提供的API不行[/quote] 把你接收数据的代码贴出来看看 [/quote]
//寻找指定USB设备
	private void findDevice(){
		mUsbManager=(UsbManager) getSystemService(Context.USB_SERVICE);
		if(mUsbManager==null){
			Toast.makeText(this, "创建USBManager失败", Toast.LENGTH_SHORT).show();
			return;
		}
		HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
		if(deviceList.isEmpty()){
			Toast.makeText(this, "请连接USB设备", Toast.LENGTH_SHORT).show();
		}
		else{
			Iterator<UsbDevice> it = deviceList.values().iterator();
			while(it.hasNext()){
				UsbDevice device = it.next();
				delay(10);
				if(device.getVendorId()==VendorID&&device.getProductId()==ProductID){
					mUsbDevice=device;
					Toast.makeText(this, "找到摄像头", Toast.LENGTH_SHORT).show();
					break;
				}
			}
			if(mUsbDevice==null){
				Toast.makeText(this, "未找到摄像头,请连接USB设备", Toast.LENGTH_SHORT).show();
			}
		}
	}
	
	//寻找设备接口和输入输出端点
	private void findInterfaceAndEndpoint(){
		if(mUsbDevice==null){
			return;
		}
		Log.d("接口信息", "接口数:"+mUsbDevice.getInterfaceCount());
		
		mInterface=mUsbDevice.getInterface(0);     //经测试该摄像头只有一个借口
		if(mInterface==null){
			Toast.makeText(this, "未找到接口", Toast.LENGTH_SHORT).show();
			return;
		}
		Log.d("端点信息", "端点数:"+mInterface.getEndpointCount());
		for(int i=0;i<mInterface.getEndpointCount();i++){
			UsbEndpoint ep = mInterface.getEndpoint(i);
			if(ep.getType()==UsbConstants.USB_ENDPOINT_XFER_CONTROL){
				epControl=ep;
			}
			else if(ep.getType()==UsbConstants.USB_ENDPOINT_XFER_BULK){
				if(ep.getDirection()==UsbConstants.USB_DIR_OUT){
					epOut=ep;
					Log.d("输出端点", "index:"+i+" "+"端点号"+ep.getEndpointNumber());
				}
				if(ep.getDirection()==UsbConstants.USB_DIR_IN){
					epIn=ep;
					Log.d("输入端点", "index:"+i+" "+"端点号"+ep.getEndpointNumber()+" 包大小"+ep.getMaxPacketSize());
				}
			}
		}
	}
	
	//连接设备,获取操作权限
	private String connectDevice(){
		if(!(epOut==null||epIn==null)){
			if(mUsbManager.hasPermission(mUsbDevice)){
				mUsbDeviceConnection=mUsbManager.openDevice(mUsbDevice);
				if(mUsbDeviceConnection==null){
					Toast.makeText(this, "未成功连接设备", Toast.LENGTH_SHORT).show();
					return "USB_INIT_FAILURE";
				}
				if(mUsbDeviceConnection.claimInterface(mInterface, true)){
//					Toast.makeText(this, "设备连接成功", Toast.LENGTH_SHORT).show();
					int a = mUsbDeviceConnection.controlTransfer(0x40, 0xB2, 0, 0, null, 0, 0);
					int b = mUsbDeviceConnection.controlTransfer(0x40, 0xB4, 0, 0, null, 0, 0);
					if(a<0||b<0){
						Toast.makeText(this, "控制传输失败",Toast.LENGTH_SHORT).show();
						return "USB_INIT_FAILURE";
					}
				}
				else{
					mUsbDeviceConnection.close();
					return "USB_INIT_FAILURE";
				}
			}
		}
		return "USB_INIT_SUCCESS";
	}
	
	/*//控制传输,设备初始化,清空设备段缓存
	private void deviceControlTransfer(){
		mUsbDeviceConnection.controlTransfer(0x40, 0xB2, 0, 0, null, 0, 0);
		mUsbDeviceConnection.controlTransfer(0x40, 0xB4, 0, 0, null, 0, 0);
	}*/
	
	//获取图像数据
	private void getUsbData(){
		int a = mUsbDeviceConnection.controlTransfer(0x40, 0xB4, 0, 0, null, 0, 0);
		int b = mUsbDeviceConnection.controlTransfer(0x40, 0xB5, 0, 0, null, 0, 0);
		if(a<0||b<0){
			Toast.makeText(this, "控制传输失败", Toast.LENGTH_SHORT).show();
		}
		int len = mUsbDeviceConnection.bulkTransfer(epIn, buffer,buffer.length, 0);
		Log.d("接收数据信息","长度:"+len);
	}
考拉一枚 2015-12-20
  • 打赏
  • 举报
回复
有大神帮忙么
考拉一枚 2015-12-20
  • 打赏
  • 举报
回复
引用 2 楼 hli27 的回复:
好好看看是不是解析出了问题 按理不可能接受不到
能详细说说么?硬件那边我不太清楚的,只知道约定好的命令,然后我用第三方库按照命令能得到完整的数据,但直接用andrroiid提供的API不行
hli27 2015-12-19
  • 打赏
  • 举报
回复
好好看看是不是解析出了问题 按理不可能接受不到
考拉一枚 2015-12-18
  • 打赏
  • 举报
回复
有人在吗?求指点

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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