Uart API

Chinese, Simplified

简介


android/linux而言,串口设备可以看作一个特殊文件,访问串口跟访问一般文件有点类似,创建对应的outstream/inpustream,然后读写即可。特殊的地方在于串口需要配置诸如波特率等参数,java没有对应的接口,所以还须借助于jni来完成



参考例子


下面是一个可用于我们系统的开源的代码可供参考(android-serialport-api)

1.     code:

android-serialport-api-master.zip

 

2.     APK:

SerialPort_1.1.apk.zip


移植步骤

(不同的android studio版本会有差异, 特别是step 3和step 5只适合比较老的版本,

建议联系support@temolin.com获取最新参考代码,最新的参考代码,uart相关接口以aar/so形式提供,用户不需要写jni.

用户移植只需要参考libs/, jnilibs/,  build.gradle等几个地方的内容即可。 )


*** 以下内容只适合老版本,请忽略 ***


下面介绍在自己的app上移植上述串口代码的步骤,以android studio2.2开发环境为例;

1.  SerialPort.java拷贝到java目录下,图见步骤2.  然后,修改文件开头定义的package 名,原来是

     package android_serialport_api;

     可以改为自己的package名字,如

     package com.temolin;

SerialPort.java.zip


2. jni目录代码拷贝到跟java并列的目录底下,如图:

                                             图片 1.png

SerialPort.copen/close函数接口名字要修改(jni调用的要求),前缀必须是SerialPort.java类的全限定名,对于上述例子,open/close函数名分别是:

Java_com_temolin_SerialPort_open

      Java_com_temolin_SerialPort_close

(也可以在linux/unix环境下运行gen_SerialPort_h.sh来生成SerialPort.h,里面有接口函数的名字。不熟悉linux/unix命令行建议还是直接修改比较好)

jni.zip


3. 修改grade.properies文件(如果该文件没有,创建一个,在project根目录,跟app同级),增加一行:

    android.useDeprecatedNdk=true


4. 下载android NDK包,并在android studioProject Structure里设置ndk的路径,如图:


图片 2.png


5. 修改app下的build.gradle文件,增加ndk ldlibs,如图:

图片 3.png



至此,编译整个工程,应该可以通过。

产品需求SerialPort类的使用

1.     串口初始化,参考代码如下:

 private SerialPort mSerialPort = null;
 protected OutputStream mOutputStream;
 protected InputStream mInputStream;
 /*AmLink平台有3个串口可用,对应的设备文件路径分别是
    /dev/ttyMT0
    /dev/ttyMT2
    /dev/ttyMT3
 */
 String portPath = "/dev/ttyMT0";
 /*波特率:115200,flag:0*/
 mSerialPort = new SerialPort(new File(portPath), 115200, 0);  
 mOutputStream = mSerialPort.getOutputStream();
 mInputStream = mSerialPort.getInputStream();

2.     串口输出,主要通过mOutputStream,参考代码:

   /*输出10个字符‘A’*/
  byte[] mBuffer;
  mBuffer = new byte[10];
  Arrays.fill(mBuffer, (byte) 'A');
  try {
       mOutputStream.write(mBuffer);
  } catch (IOException e) {
       e.printStackTrace();
  }

3.     串口输入,主要通过mInputStream,参考代码:

  byte[] buffer = new byte[64];
  size = mInputStream.read(buffer);
  if (size > 0) {
      //处理接收到的数据(在buffer里)
  }

      接收数据一般建议单起一个线程来完成,如:

private class ReadThread extends Thread {
 
        @Override
        public void run() {
            super.run();
            while(!isInterrupted()) {
                int size;
                try {
                    byte[] buffer = new byte[64];
                    if (mInputStream == null) return;
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                            //process data here !
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
}

 

 

 

 

The End.


文档中心

以上内容是否对您有帮助?