【android开发】android装置使用usb串口传输数据

6
回复
2143
查看
[复制链接]

758

主题

1465

帖子

1858

安币

手工艺人

发表于 2017-8-31 14:36:00 | 显示全部楼层 |阅读模式
本帖最后由 一人无 于 2017-8-31 14:37 编辑

android设备使用usb串口传输数据

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

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


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

[Java] 查看源文件 复制代码
1 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
2 List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
3 if (availableDrivers.isEmpty()) {
4   return;
5 }


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

[Java] 查看源文件 复制代码
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 }


接下来就可以读数据了

[Java] 查看源文件 复制代码
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 }


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

[Java] 查看源文件 复制代码
 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串口


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

85

主题

9851

帖子

2191

安币

Android大神

Rank: 6Rank: 6

发表于 2017-8-31 14:36:07 | 显示全部楼层
感谢大神~

27

主题

9735

帖子

1856

安币

Android大神

Rank: 6Rank: 6

发表于 2017-8-31 14:36:08 | 显示全部楼层
感谢分享,楼主V5~

92

主题

9629

帖子

1958

安币

Android大神

Rank: 6Rank: 6

发表于 2017-8-31 14:36:14 | 显示全部楼层
感谢分享,楼主V5~

14

主题

1万

帖子

3891

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2017-8-31 14:36:17 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

0

主题

9887

帖子

1690

安币

Android大神

IT

Rank: 6Rank: 6

发表于 2017-8-31 14:36:18 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

11

主题

9459

帖子

-22

安币

QQ游客

推广达人

发表于 2017-8-31 14:36:38 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )