如何使用适用于Android的usb串行接口从连接到Android的CDC设备读取数据?

如何使用适用于Android的usb串行接口从连接到Android的CDC设备读取数据?,android,usbserial,adafruit,Android,Usbserial,Adafruit,我用它从Feather 32u4设备发送和接收数据。当端口打开时,羽毛发送一些固定数据,然后回显发送给它的内容 我在理解read和write方法在库中的工作方式时遇到问题。我很确定我正确地使用了write,但我不知道read。使用read时返回的长度始终为0,并且我使用的是正确的波特率。我只是不太确定该怎么用。我仍在尝试找出事件驱动的选项 private void DoTheThing () { String textMessage = ""; UsbManager

我用它从Feather 32u4设备发送和接收数据。当端口打开时,羽毛发送一些固定数据,然后回显发送给它的内容

我在理解
read
write
方法在库中的工作方式时遇到问题。我很确定我正确地使用了
write
,但我不知道
read
。使用
read
时返回的长度始终为0,并且我使用的是正确的波特率。我只是不太确定该怎么用。我仍在尝试找出事件驱动的选项

private void DoTheThing () {

      String textMessage = "";

      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);



      // Find available drivers for Feather board.
      ProbeTable customTable = new ProbeTable();
      customTable.addProduct(0x239a, 0x800c, CdcAcmSerialDriver.class);
      UsbSerialProber prober = new UsbSerialProber(customTable);
      List<UsbSerialDriver> drivers = prober.findAllDrivers(manager);
      if (drivers.isEmpty()) {
         textMessage += "Could not find any drivers.\n";
         m_textView.setText(textMessage);
         return;
      }

      textMessage += "Driver found\n";
      m_textView.setText(textMessage);

      UsbDeviceConnection connection = null;
      UsbSerialDriver driver = drivers.get(0);
      PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(INTENT_ACTION_GRANT_USB), 0);
      manager.requestPermission(driver.getDevice(), usbPermissionIntent);
      try {
         connection = manager.openDevice(driver.getDevice());
      } catch (Exception e) {
         textMessage += e + "\n";
         m_textView.setText(textMessage);
      }
      if (connection == null) {
         // add UsbManager.requestPermission(driver.getDevice(), ..) handling here
         textMessage += "Could not open device.\n";
         m_textView.setText(textMessage);
         return;
      }

      textMessage += "Device opened\n";
      m_textView.setText(textMessage);

      UsbSerialPort port = driver.getPorts().get(0);
      // Most devices have just one port (port 0)
      try {
         port.open(connection);
         port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
      } catch (IOException e) {
         textMessage += e + "\n";
         m_textView.setText(textMessage);
         return;
      }

      textMessage += "Connection established\n";
      m_textView.setText(textMessage);

      // Get received data on connection.
      int length = -2;
      byte[] receivedData = new byte[64];
      try {
         length = port.read(receivedData, 2000);
      } catch (Exception e) {
         textMessage += "Oops: " + e + "\n";
         m_textView.setText(textMessage);
      }

      String data = new String(receivedData);
      textMessage += "Data recieved: " + length + " " + data + "\n";
      m_textView.setText(textMessage);


      // Send canned data.
      length = -2;
      try {
         length = port.write("a".getBytes(), 2000);
      } catch (Exception e) {
         textMessage += "Oops: " + e + "\n";
         m_textView.setText(textMessage);
      }

      textMessage += "Data sent " + length + "\n";
      m_textView.setText(textMessage);

      // Get received data.
      length = -2;
      receivedData = new byte[64];
      try {
         length = port.read(receivedData, 2000);
      } catch (Exception e) {
         textMessage += "Oops: " + e + "\n";
         m_textView.setText(textMessage);
      }

      data = new String(receivedData);
      textMessage += "Data recieved: " + length + " " + data;
      m_textView.setText(textMessage);

   }
private void DoTheThing(){
字符串textMessage=“”;
UsbManager manager=(UsbManager)getSystemService(Context.USB_服务);
//查找羽毛板的可用驱动程序。
ProbeTable customTable=新的ProbeTable();
addProduct(0x239a,0x800c,CdcAcmSerialDriver.class);
UsbSerialProber prober=新的UsbSerialProber(自定义表);
列出驱动程序=prober.findAllDrivers(管理器);
if(drivers.isEmpty()){
textMessage+=“找不到任何驱动程序。\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“找到驱动程序\n”;
m_textView.setText(textMessage);
UsbDeviceConnection连接=null;
UsbSerialDriver driver=drivers.get(0);
pendingent usbPermissionIntent=pendingent.getBroadcast(this,0,newintent(Intent\u ACTION\u GRANT\u USB),0);
requestPermission(driver.getDevice(),usbPermissionIntent);
试一试{
connection=manager.openDevice(driver.getDevice());
}捕获(例外e){
textMessage+=e+“\n”;
m_textView.setText(textMessage);
}
if(连接==null){
//在此处添加UsbManager.requestPermission(driver.getDevice(),…)处理
textMessage+=“无法打开设备。\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“设备已打开\n”;
m_textView.setText(textMessage);
UsbSerialPort port=driver.getPorts().get(0);
//大多数设备只有一个端口(端口0)
试一试{
端口。打开(连接);
端口设置参数(115200,8,UsbSerialPort.STOPPITS_1,UsbSerialPort.奇偶校验_无);
}捕获(IOE异常){
textMessage+=e+“\n”;
m_textView.setText(textMessage);
返回;
}
textMessage+=“已建立连接\n”;
m_textView.setText(textMessage);
//获取连接上接收到的数据。
整数长度=-2;
字节[]接收数据=新字节[64];
试一试{
长度=端口读取(receivedData,2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
字符串数据=新字符串(接收数据);
textMessage+=“接收到的数据:“+length+”“+Data+”\n”;
m_textView.setText(textMessage);
//发送屏蔽数据。
长度=-2;
试一试{
长度=port.write(“a”.getBytes(),2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
text消息+=“已发送数据”+长度+“\n”;
m_textView.setText(textMessage);
//获取接收到的数据。
长度=-2;
receivedData=新字节[64];
试一试{
长度=端口读取(receivedData,2000);
}捕获(例外e){
textMessage+=“Oops:+e+”\n”;
m_textView.setText(textMessage);
}
数据=新字符串(接收数据);
textMessage+=“接收到的数据:”+长度+“”+数据;
m_textView.setText(textMessage);
}

编辑

当我在我的端口上将DTR标志设置为true时,发生了严重崩溃

  m_port = driver.getPorts().get(0);

  // Most devices have just one port (port 0)
  try {
     m_port.setDTR(true);   //  <-- hard crash
     m_port.open(connection);
     m_port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
  } catch (IOException e) {
     m_textMessage += e + "\n";
     m_textView.setText(m_textMessage);
     return;
  }
m_port=driver.getPorts().get(0);
//大多数设备只有一个端口(端口0)
试一试{

m_port.setDTR(true);//在2000毫秒超时内未收到任何内容时,长度为0


对于像32u4这样的CDC设备,当在2000毫秒超时内没有收到任何信息时,通常必须将DTR线路设置为所述长度为0


对于像32u4这样的CDC设备,您通常必须如上所述设置DTR线路。当我设置该标志时,我会遇到硬崩溃。请参阅OP edit.Derp。
setDTR
需要在端口打开后出现。当我设置该标志时,我会遇到硬崩溃。请参阅OP edit.Derp。
setDTR
需要在端口打开后出现。