快速使用Android串口

Posted Steven Jon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速使用Android串口相关的知识,希望对你有一定的参考价值。

天下武功,唯快不破

有多快?只需要一招!引入第三方库就可以快速开发和使用android串口,毕竟我们站在了巨人的肩膀上。
第一步导包,也就只有这一步了

// 在项目根目录的build.gradle文件中添加:
allprojects 
    repositories 
        ...
        mavenCentral()
    

// 在项目Module下的build.gradle文件中添加:
dependencies 
    implementation 'io.github.xmaihh:serialport:2.1.1'

这个库基本可以满足所有Android 串口开发和使用。不管你对接的设备是私有协议还是标准的工业协议,无非就是数据位的不同,奇偶校验的不同或者停止位的不同,而这个库都可以支持,并且还支持流控。

到这里,基本就只剩API的调用来完成相应的业务要求了。

但是对于好多小白来说,并不知道什么是串口,不知道串口是如何跟外面设备通讯的。

什么是串口?
串口叫做串行接口,也称串行通信接口,也可以叫做COM口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。串行接口是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
对于Android来说,串口大概是长这样的

对于不同的厂家,其外形接口可能不一致,但是对于我们来说,并无大碍,因为不管它怎么变化,只是针对硬件接线的问题,相对我们做上层应用,没什么影响的。我们只需要关注数据的发送和收到数据如何解析就可以了。

串口的通讯方式

  • 单工模式:只支持数据在一个方向上传输;在同一时间只有一方能接收或发送信息,不能实现双向通信。一般用在只向一个方向传输数据的场合,比如跟打印机通讯。
  • 半双工模式:如果只有一条通讯线,那么它既可以发送数据也可以接收数据,但不能同时进行发送和接收。如果使用两条通讯线,数据可以在两个方向传输,但是在同一时间只可以有一方接受或发送信息,实际上是一种切换方向的单工通讯。比如RS485-2W通讯就是采用这种模式。
  • 全双工模式:数据可以同时往两个方向传输,相当于两个单工通讯的结合,它要求发送设备和接收设备都有独立的发送和接收能力,在同一时间可以同时进行发送和接收数据,实现双向通信,数据传输效率比较高。比如RS-232通讯就是采用这种模式。

串口通讯是一个字符一个字符地传输,每个字符一位一位地传输,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率。

好了,进入正题

到这里,我们需要注意一下,当我们需要跟外面设备进行通讯时,我们要考虑清楚,到底要使用那个COM口,每个COM口在Android系统上都有一个软驱动与之对应的。

下面这个小栗子用的是Android板上的485口(“dev/ttyS4”),波特率设为9600,无校验,数据位为8,停止位为1。


运行效果显示:用PC端模拟外接设备,Android 485口与它进行通讯测试。

serialport库,直接上代码

        //初始化SerialHelper对象,设定串口名称和波特率
        serialHelper = new SerialHelper(Const.SPORT_NAME, Const.BAUD_RATE) 
            @Override
            protected void onDataReceived(ComBean paramComBean) 
                //根据自己的业务自行处理接收的数据
                ......
            
        ;

        /*
         * 默认的BaseStickPackageHelper将接收的数据扩展成64位,一般用不到这么多位
         * 我这里重新设定一个自适应数据位数的
         */

        serialHelper.setStickPackageHelper(new AbsStickPackageHelper() 
            @Override
            public byte[] execute(InputStream is) 
                try 
                    int available = is.available();
                    if (available > 0) 
                        byte[] buffer = new byte[available];
                        int size = is.read(buffer);
                        if (size > 0) 
                            return buffer;
                        
                     else 
                        SystemClock.sleep(50);
                    

                 catch (IOException e) 
                    e.printStackTrace();
                
                return null;
            
        );

上面代码,在创建serialHelper之时,就已经传入了一个onDataReceived()方法,用来监听串口数据接收,但是如要打开串口才能开启监听。
SerialHelper创建完成,打开串口

serialHelper.open();

如果需要设置其他的属性,比如设置奇偶检验,需要在执行open()之前设定。

serialHelper.setPort(String sPort);      //设置串口
serialHelper.setBaudRate(int iBaud);     //设置波特率
serialHelper.setStopBits(int stopBits);  //设置停止位
serialHelper.setDataBits(int dataBits);  //设置数据位
serialHelper.setParity(int parity);      //设置校验位
serialHelper.setFlowCon(int flowcon);    //设置流控

发送数据

serialHelper.send(byte[] bOutArray); // 发送byte[]
serialHelper.sendHex(String sHex);  // 发送Hex
serialHelper.sendTxt(String sTxt);  // 发送ASCII

关闭串口

serialHelper.close();

上面小栗子的全部 源代码传送门。

如果你需要做粘包处理,可以参考下面大佬的教程,也是这个库的作者。
https://github.com/xmaihh/Android-Serialport

以上是关于快速使用Android串口的主要内容,如果未能解决你的问题,请参考以下文章

无线串口模块通信技术参数快速选型指南

Android串口开发与SerialPort工具封装

蓝牙转串口的硬件和Android手机的APK设计

Android studio蓝牙app的串口是啥

手机蓝牙转串口硬件和ANDROID的APK程序开发源代码

串口DMA传输简介