首先让我说我是Android开发的新手,所以对于第一个应用来说USB可能有点复杂,但这是我想要首先编写应用程序的唯一理由。
我想通过USB与Garmin GPS通信。我过去已经通过PC取得了成功,但它是通过Garmin提供的驱动程序完成的。
据我所知,Android没有这样的驱动程序,所以我需要直接写入USB。
Garmin发布此文档:
http://www8.garmin.com/support/pdf/USBAddendum.pdf
基本上它说你必须大量传输: 00 00 00 00 05 00 00 00 00 00 00 00
告诉设备准备转移。当我这样做时,我的bulktransfer失败了-1。如果我的超时为0,那么bulktransfer永远不会返回。我假设因为gps没有回应。
我在下面提供了我的代码。代码检测GPS并打开它。但第一次批量转移从未完成。我确定我要发送到批量端点。谁能让我开始?
public class MainActivity extends Activity {
private static final String TAG = "TestGarmin";
private UsbManager mUsbManager;
private UsbDevice mDevice;
private UsbDeviceConnection mConnection;
private UsbEndpoint mEndpointIntr;
private UsbEndpoint mEndpointBulkOut;
private UsbEndpoint mEndpointBulkIn;
private static int TIMEOUT = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
String s = UsbManager.ACTION_USB_DEVICE_ATTACHED;
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action))
setDevice(device);
}
private void setDevice(UsbDevice device) {
Log.d(TAG, "setDevice " + device);
if (device.getInterfaceCount() != 1) {
Log.e(TAG, "could not find interface");
return;
}
UsbInterface intf = device.getInterface(0);
// device should have three endpoints
if (intf.getEndpointCount() != 3) {
Log.e(TAG, "could not find endpoint");
return;
}
// endpoint 0 should be of type interrupt
UsbEndpoint ep0 = intf.getEndpoint(0);
if (ep0.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
Log.e(TAG, "endpoint 0 is not interrupt type");
return;
}
if (ep0.getDirection() != UsbConstants.USB_DIR_IN) {
Log.e(TAG, "endpoint 0 is not an input endpoint");
return;
}
mEndpointIntr = ep0;
// endpoint 1 should be of type bulk
UsbEndpoint ep1 = intf.getEndpoint(1);
if (ep1.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.e(TAG, "endpoint 1 is not bulk type");
return;
}
if (ep1.getDirection() != UsbConstants.USB_DIR_OUT) {
Log.e(TAG, "endpoint 1 is not an output endpoint");
return;
}
mEndpointBulkOut = ep1;
// endpoint 2 should be of type bulk
UsbEndpoint ep2 = intf.getEndpoint(2);
if (ep2.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.e(TAG, "endpoint 2 is not bulk type");
return;
}
if (ep2.getDirection() != UsbConstants.USB_DIR_IN) {
Log.e(TAG, "endpoint 2 is not an output endpoint");
return;
}
mEndpointBulkOut = ep2;
mDevice = device;
if (device != null) {
UsbDeviceConnection connection = mUsbManager.openDevice(device);
if (connection != null && connection.claimInterface(intf, true)) {
Log.d(TAG, "open SUCCESS");
mConnection = connection;
byte[] init = {0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//14 00 00 00 FE 00 00 00 00 00 00 00
int x = connection.bulkTransfer(mEndpointBulkOut,init, init.length, 100);
Log.e(TAG, "BulTransfer returned " + x);
} else {
Log.d(TAG, "open FAIL");
mConnection = null;
}
}
}
}
答案 0 :(得分:2)
我混淆端点是一个问题。这是更正的代码,现在我遇到了回复的问题,但我可能会创建另一个帖子。
public class MainActivity extends Activity {
private static final String TAG = "TestGarmin";
private UsbManager mUsbManager;
private UsbDevice mDevice;
private UsbDeviceConnection mConnection;
private UsbEndpoint mEndpointIntr;
private UsbEndpoint mEndpointBulkOut;
private UsbEndpoint mEndpointBulkIn;
private static int TIMEOUT = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
String s = UsbManager.ACTION_USB_DEVICE_ATTACHED;
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action))
setDevice(device);
}
private void setDevice(UsbDevice device) {
Log.d(TAG, "setDevice " + device);
if (device.getInterfaceCount() != 1) {
Log.e(TAG, "could not find interface");
return;
}
UsbInterface intf = device.getInterface(0);
// device should have three endpoints
if (intf.getEndpointCount() != 3) {
Log.e(TAG, "could not find endpoint");
return;
}
// endpoint 0 should be of type interrupt
UsbEndpoint ep0 = intf.getEndpoint(0);
if (ep0.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
Log.e(TAG, "endpoint 0 is not interrupt type");
return;
}
if (ep0.getDirection() != UsbConstants.USB_DIR_IN) {
Log.e(TAG, "endpoint 0 is not an input endpoint");
return;
}
mEndpointIntr = ep0;
/********* Endpoint 0 Bulk Out ************/
// endpoint 1 should be of type bulk
UsbEndpoint ep1 = intf.getEndpoint(1);
if (ep1.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.e(TAG, "endpoint 1 is not bulk type");
return;
}
if (ep1.getDirection() != UsbConstants.USB_DIR_OUT) {
Log.e(TAG, "endpoint 1 is not an output endpoint");
return;
}
mEndpointBulkOut = ep1;
/************* Endpoint 3 Bulk in *************/
// endpoint 2 should be of type bulk
UsbEndpoint ep2 = intf.getEndpoint(2);
if (ep2.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.e(TAG, "endpoint 2 is not bulk type");
return;
}
if (ep2.getDirection() != UsbConstants.USB_DIR_IN) {
Log.e(TAG, "endpoint 2 is not an input endpoint");
return;
}
mEndpointBulkIn = ep2;
mDevice = device;
if (device != null) {
UsbDeviceConnection connection = mUsbManager.openDevice(device);
if (connection != null && connection.claimInterface(intf, true)) {
Log.d(TAG, "open SUCCESS");
mConnection = connection;
byte[] init = {0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//14 00 00 00 FE 00 00 00 00 00 00 00
int x = connection.bulkTransfer(mEndpointBulkOut,init, init.length, 100);
Log.e(TAG, "BulTransfer returned " + x);
} else {
Log.d(TAG, "open FAIL");
mConnection = null;
}
}
}
}