2012-11-07 61 views
1

我试图实现Android主机和USB设备之间的双向通信,当然我使用的是Google提供的USB Host API。 USB设备包含一个能够回应接收到的任何字符的固件。用户只需在EditText中插入一个字符并按下一个按钮即可发送该字符。下面是代码建立Android主机和USB设备之间的通信

public void sendData(View v){ 
    final String character = request.getText().toString() + "\n\r"; 
    log.setText(log.getText() + "\n" + "Sending..."); 
    if(character != null){   
     Thread t = new Thread(new Runnable() {    
       @Override 
       public void run() {      
        byte[] array = character.getBytes(); 
        Log.d("USB", "Sending Data..."); 
        mDeviceConnection.bulkTransfer(mEndpointOut, array, array.length, 100);     
        ByteBuffer output_buffer = ByteBuffer.allocate(array.length); 
        Log.d("USB", "Creating Buffer"); 
        UsbRequest req = new UsbRequest(); 
        req.initialize(mDeviceConnection, mEndpointIn); 
        req.queue(output_buffer, array.length);        
        if(mDeviceConnection.requestWait() == req){ 
         Log.d("USB", output_buffer.getChar(0) + "");        
         Message m = new Message(); 
         m.obj = output_buffer.array(); 
         handler.sendMessage(m); 
         output_buffer.clear();      
        } else{ 
         Log.d("USB", "No USBRequest received"); 
        } 
       } 
      }); 
     t.start(); 
    } 

} 

变量请求是的EditText,日志是一个TextView基准,所以我可以显示一些debbug信息。首先我使用bulkTransfer方法发送字符,然后使用USBRequest排队请求以读取端点上的数据,当然它会正确发送字符,但是当我显示收到的字符时,会显示一些奇怪的符号,如中文字符或者里面带有问号的菱形(几乎总是这是响应)。我想知道我用于这种交流的代码是否正确,如果是,那为什么我会收到那些奇怪的字符?

非常感谢你对你帮助

PD:对不起,我的英语水平。

回答

0

我对这个问题有点不清楚。但是我建议如果你正在使用一些minicom/putty类型的终端应用程序来显示显示,请正确设置波特率。 如果这不是问题,你可以澄清当你说收到字符 - 这是否意味着在Android主机设备上收到字符或它意味着USB设备?

+0

感谢您的回复,是的,收到的字符在Android主机上(我不确定问题是android-to-device还是device-to-android的通信),我会尝试设置适当的波特率并告诉你结果。 –

+0

你可以参考这个[链接的](http://stackoverflow.com/questions/12345953/andoid-usb-host-asynchronous-interrupt-transfer)的答案,可能会帮助你在实施 – Arpan

+0

谢谢Arpan,我检查了链接,但它仍然不起作用,它收到一些怪异的字符,我会继续搜索。 –

0

如果你发送字节数组,你也会得到字节数组。

所以使用方法get(index of byte)而不是使用getChar(index)