传输数据 USB
Posted
技术标签:
【中文标题】传输数据 USB【英文标题】:Transferring data USB 【发布时间】:2012-05-12 20:44:04 【问题描述】:我正在尝试通过 USB 发送和接收数据,我的设备,Acer Iconia A500 拥有连接到设备所需的一切,一切正常,但当我尝试发送和接收数据时,它没有' t 表现如预期。这是我的代码
for( ; ; ) //this is the main loop for transferring
String get = "$getPos";
byte[] getBytes = get.getBytes();
conn.bulkTransfer( epOUT, getBytes, getBytes.length, 500 );
try
Thread.sleep( 500 );
byte[] buffer = new byte[4096];
conn.bulkTransfer( epIN, buffer, 4096, 500 );
StringBuilder byStr = new StringBuilder();
for( int i = 0; i < buffer.length; i++ )
if( buffer[i] != 0 )
byStr.append( buffer[i] + ", " );
l( byStr );
catch( InterruptedException e )
e.printStackTrace();
if( mStop )
mStopped = true;
return;
l( "sent " + counter );
counter++;
counter = (byte)( counter % 16 );
它的意思是返回一个大约 80 个字符长的字节数组,但它只返回两个字节,即 1 和 96,如果 USB 设备端出现错误,它仍然会返回多于两个。我的代码甚至接近正确吗?我基于 serverbox 的 USB 转串口文章。
【问题讨论】:
【参考方案1】:我试图以错误的波特率发送数据。
这是有效的代码。将其发布给所有使用 FTDI 设备并需要帮助的人。
private Runnable mLoop = new Runnable()
@Override
public void run()
UsbDevice dev = sDevice;
if (dev == null)
return;
UsbManager usbm = (UsbManager) getSystemService(USB_SERVICE);
UsbDeviceConnection conn = usbm.openDevice(dev);
l("Interface Count: " + dev.getInterfaceCount());
l("Using "
+ String.format("%04X:%04X", sDevice.getVendorId(),
sDevice.getProductId()));
if (!conn.claimInterface(dev.getInterface(0), true))
return;
conn.controlTransfer(0x40, 0, 0, 0, null, 0, 0);// reset
// mConnection.controlTransfer(0×40,
// 0, 1, 0, null, 0,
// 0);//clear Rx
conn.controlTransfer(0x40, 0, 2, 0, null, 0, 0);// clear Tx
conn.controlTransfer(0x40, 0x02, 0x0000, 0, null, 0, 0);// flow
// control
// none
conn.controlTransfer(0x40, 0x03, 0x0034, 0, null, 0, 0);// baudrate
// 57600
conn.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0);// data bit
// 8, parity
// none,
// stop bit
// 1, tx off
UsbEndpoint epIN = null;
UsbEndpoint epOUT = null;
byte counter = 0;
UsbInterface usbIf = dev.getInterface(0);
for (int i = 0; i < usbIf.getEndpointCount(); i++)
l("EP: "
+ String.format("0x%02X", usbIf.getEndpoint(i)
.getAddress()));
if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
l("Bulk Endpoint");
if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
epIN = usbIf.getEndpoint(i);
else
epOUT = usbIf.getEndpoint(i);
else
l("Not Bulk");
for (;;) // this is the main loop for transferring
try
Thread.sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
String get = "$fDump G" + "\n";
l("Sending: " + get);
byte[] by = get.getBytes();
// This is where it sends
l("out " + conn.bulkTransfer(epOUT, by, by.length, 500));
// This is where it is meant to receive
byte[] buffer = new byte[4096];
StringBuilder str = new StringBuilder();
if (conn.bulkTransfer(epIN, buffer, 4096, 500) >= 0)
for (int i = 2; i < 4096; i++)
if (buffer[i] != 0)
str.append((char) buffer[i]);
else
l(str);
break;
// this shows the complete string
l(str);
if (mStop)
mStopped = true;
return;
l("sent " + counter);
counter++;
counter = (byte) (counter % 16);
;
【讨论】:
没问题。我已经有一段时间没有这样做了。 你能包含你的导入语句吗?以上是关于传输数据 USB的主要内容,如果未能解决你的问题,请参考以下文章