android裝置使用usb串口傳輸資料,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 @Override12 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串口