如何使用usb-serial-for-android从连接到Android的CDC设备读取数据?

问题描述 投票:0回答:1

我正在使用此library从Feather 32u4设备发送和接收数据。打开端口后,Feather会发送一些固定数据,然后回显发送给它的内容。

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

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);

   }

enter image description here

android usbserial adafruit
1个回答
0
投票

长度为0,如果在2000毫秒的超时时间内未收到任何内容。

对于像32u4这样的CDC设备,通常必须按照here设置DTR线>

© www.soinside.com 2019 - 2024. All rights reserved.