zoukankan      html  css  js  c++  java
  • android设备使用usb串口传输数据

      首先介绍两个开源项目一个是Google的开源项目:https://code.google.com/archive/p/android-serialport-api/

    另一个是我们这次介绍的开源项目:https://github.com/mik3y/usb-serial-for-android

      

     第一步:获取所有的已插入的串口驱动

    1 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    2 List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
    3 if (availableDrivers.isEmpty()) {
    4   return;
    5 }

     

    然后,我们选择第一个dirver ,连接设备

    1 UsbSerialDriver driver = availableDrivers.get(0);
    2 UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
    3 if (connection == null) {
    4   // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..)
    5   return;
    6 }

    接下来就可以读数据了

     1 // Read some data! Most have just one port (port 0).
     2 UsbSerialPort port = driver.getPorts().get(0);
     3 try {
     4   port.open(connection);
     5 //设置串口的波特率、数据位,停止位,校验位
     6   port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
     7 
     8   byte buffer[] = new byte[16];
     9   int numBytesRead = port.read(buffer, 1000);
    10   Log.d(TAG, "Read " + numBytesRead + " bytes.");
    11 } catch (IOException e) {
    12   // Deal with error.
    13 } finally {
    14   port.close();
    15 }

    当然,我们可以给串口添加个监听

     1  1 private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     2  2 private SerialInputOutputManager mSerialIoManager;
     3  3 
     4  4 private final SerialInputOutputManager.Listener mListener =
     5  5             new SerialInputOutputManager.Listener() {
     6  6                 @Override
     7  7                 public void onRunError(Exception e) {
     8  8                     Log.d(TAG, "Runner stopped.");
     9  9                 }
    10 10 
    11 11                 @Override
    12 12                 public void onNewData(final byte[] data) {
    13 13                    //TODO 新的数据
    14 14                 }
    15 15             };
    16 16 
    17 17 mSerialIoManager = new SerialInputOutputManager(sPort, mListener);//添加监听
    18 //在新的线程中监听串口的数据变化
    19 18 mExecutor.submit(mSerialIoManager);

    如果需要接受比较大的数据,有可能会遇到一个问题:数据缓存和接收时间不够,导致数据被覆盖或者丢失,我们就需要修改串口读取缓存了

    把 SerialInputOutputManager 中的 READ_WAIT_MILLIS 和 BUFSIZ 改成合适的大小就可以了

    写数据的操作就是调用port的方法

    port.write(bytes, 1000);

    其实这个开源项目已经为我们封装了很多驱动类,都在driver包下,我们直接拿来用就可以了

     有时间我针对Cp21xx驱动的usb串口讲一下如何区分多个usb串口

      

  • 相关阅读:
    trie树
    单调队列
    网络流24题——试题库问题
    费用流的简单应用
    Manacher算法
    KMP算法
    网络流之最小费用最大流
    网络流之二分图匹配【转】
    网络流之最大流
    矩阵快速幂优化菲波那切数列
  • 原文地址:https://www.cnblogs.com/rokey/p/6711042.html
Copyright © 2011-2022 走看看