我想使用该bulkTransfer功能在相机和Android平板电脑设备之间交换数据/命令.我写了这个Activity,但该方法bulkTransfer返回-1(错误状态).为什么会返回错误?
public class MainActivity extends Activity {
private TextView text;
private int TIMEOUT = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.txt);
usbTest();
}
private void usbTest() {
UsbDevice device = (UsbDevice) getIntent().getParcelableExtra(
UsbManager.EXTRA_DEVICE);
if (device == null)
text.setText("device null");
else
text.setText("device not null");
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
text.setText(text.getText() + "\nDevices connected: "
+ deviceList.values().size());
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
device …Run Code Online (Sandbox Code Playgroud) 我团队的其他成员将为我的应用程序提供一个简单的非标准USB麦克风,但在完成之前我将不得不模仿它,以进行集成测试.
如果有很多可用的选项,我宁愿使用.NET/Matlab/Python解决方案.
我正在尝试从基于FTDI 2232H芯片的自定义设备接收数据.
我使用的是简单的异步FIFO模式,输入数据速率为3.2MB /秒.
一切都与我的电脑上的测试代码完美配合,但我在Toshiba Thrive上接收数据时遇到了问题.
TDI的Android驱动程序失败了,所以我使用Java进行编码.
我可以完美地接收95%以上的数据,但每隔一段时间数据就会"溅"出来,并且我会获得相同的4-5K数据的一部分两到三次,然后回到良好的数据.
我对Thrive或Android的速度不是太快,因为我以前的数据是双倍(6.4MB /秒),而且它也有95%左右.(所以一半的速度应该没问题.)
似乎在Android中发生的缓冲(或双缓冲)中存在某种错误.(它不是FTDI 2232H中的缓冲区,因为重复数据大于芯片的4K内部缓冲区.)
设置代码很简单,而且它几乎可以完美地工作.
发生数据抓取的循环非常简单:
while(!fStop)
if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN)
{
len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0);
System.arraycopy(inBuff, 0, bigBuff, totalLen, len);
totalLen+=len;
}
Run Code Online (Sandbox Code Playgroud)
如果您认为这是arraycopy的时间延迟 - 即使我评论该行,我仍然会丢失数据.
IN_BUFF_LEN是16384(即使我增加了inBuff的大小,bulkTransfer也不会返回更多).
bigBuff是几兆字节.
作为第二个问题 - 有没有人知道如何传递一个指向bulkTransfer的指针,它将直接填充bigBuff--在一个偏移处(不是从位置'0'开始?
既然Android API支持直接使用USB设备(从3.1开始),我很好奇是否有任何工作要为一些更受欢迎的类兼容设备(如音频或HID)创建"软模式"驱动程序.
换句话说,是否有任何开源项目将特定类设备的更有用的通信包含在可以添加到Android项目的Java类中?
出于我的目的,我对USB音频特别感兴趣,但似乎从Linux内核模块源派生的社区构建的一组类可能对许多项目有益.我的希望是其他人已经想到了同样的事情并且已经开始工作了.任何指向这个方向的人都会非常感激.
我偶然发现了一些资源:
我想在Linux中为Amarok编写一个Python脚本,以自动将stackoverflow播客复制到我的播放器.当我插入播放器时,它会挂载驱动器,复制任何待处理的播客,然后弹出播放器.我该如何收听"插入"事件?我已经查看过了,但找不到一个好的例子.
我正在尝试修复一个伪装成虚拟COM端口的无响应USB设备.手动重新插入工作,但最多可能有12个这样的单位.是否有API命令来执行unplug/replug循环的程序化等效操作?
这个问题主要与电子相关,但它也有编程方面.
我们办公室的墙上有一盏红绿灯.当人们进入办公室时,他们可以立即从交通信号灯中判断昨晚的自动构建和测试是否顺利进行:绿色表示所有测试均通过,黄色表示某些测试失败,红色表示某些构建失败.
现在,交通信号灯上悬挂着三根电缆上的三个开关,有人每天早上都需要手动切换这些电缆.我正在寻找一种通过PC自动完成此过程的简便方法.
我可以写软件.我有一些焊接经验.我知道数字设计理论,但我从未构建过物理设备.我的手上没有太多时间.
如何以最少的努力(和投资)从PC控制三个110V灯泡(或任何设备)?
答案中提到的类似项目:

(来源:magnetiq.com)

(来源:magnetiq.com)

(来源:magnetiq.com)
我在developer.android.com上完成了USB主机的描述和示例,以检测连接和分离的USB设备.
如果我在清单文件中使用intent-filter在连接设备时启动我的应用程序,它可以正常工作:插入,设备被检测到,android要求启动应用程序的权限,设备信息显示在表格中.
我正在开发的应用程序不应仅在连接/分离设备时启动/完成(例如,数据管理目的).此外,如果应用程序已在运行,我也不希望弹出对话框.因此,如果连接了设备,我决定不直接启动活动,而是注册一个BroadcastReceiver,如果某个设备处于分离状态,那么(稍后)应该通知活动.这个接收器很好地识别分离动作,但不识别附着动作.
我错过了权限或数据属性或类似的东西吗?本教程和示例没有说明其他必要属性.
这是清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="de.visira.smartfdr"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="12" />
<uses-feature android:name="android.hardware.usb.host" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".usb.Detector">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
android:resource="@xml/device_filter" />
</receiver>
</application>
Run Code Online (Sandbox Code Playgroud)
和接收器:
public class FDRDetector extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, "Action: " + action, 3).show();
// pops up only if action == DETACHED
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么相同的intent-filter工作,如果我在一个活动上使用它们,但是如果它们应用于接收器则不行?即使我在代码中设置了接收器和过滤器,也无法识别附件. …
使用Android时,我丢失了传入USB数据流的数据,在Windows中读取相同的设备/流时我不会丢失这些数据.(我知道Android不是一个实时操作系统,但Windows也不是,而Windows在跟上数据方面没有问题.)
我使用具有内置4K缓冲区的FTDI 2232H芯片以大约3.5MB /秒的速度传输数据.libusb中的bulk_transfer调用一次可以请求16K,因此Android需要每4ms左右收集一次USB缓冲区的内容.
我试过:用Java和C语言编写,将线程(和/或进程)优先级提高到它的最高,同步和异步例程,我甚至为每个USB读取传递一个单独的缓冲区,所以我甚至不需要复制连续读取之间的数据.(在传输过程中没有垃圾收集.)我只需要缓冲20MB的数据,所以这都是RAM.
尽管如此,Android还是"没有绕过"USB数据,有时在读取之间等待长达12ms,导致一堆数据丢失.
有没有人有任何想法?DMA?对内核有某种"实时"请求?