简介
对android/linux而言,串口设备可以看作一个特殊文件,访问串口跟访问一般文件有点类似,创建对应的outstream/inpustream,然后读写即可。特殊的地方在于串口需要配置诸如波特率等参数,java没有对应的接口,所以还须借助于jni来完成
AmLink平台 m100有4个串口可用,m100c有2个,对应的设备文件路径分别是ttyMT0~ttyMT3.
参考例子
下面是一个可用于我们系统的开源的代码可供参考(android-serialport-api):
1. code (android比较官方的,但版本很老):
android-serialport-api-master.zip
2. APK:
3. 我们的Demo code :
简单介绍下SerialPort类的使用
1. 串口初始化,参考代码如下:
private SerialPort mSerialPort = null; protected OutputStream mOutputStream; protected InputStream mInputStream; /*AmLink平台 m100有4个串口可用,m100c有2个,对应的设备文件路径分别是 /dev/ttyMT0 /dev/ttyMT1 /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; } } } }
* 对于m100c/m101c 模块,只有2组独立串口,uart0和uart1,uart1对应的引脚模块开机不是串口模式,需要软件配置,根据具体的硬件需求,软件在用uart1前,需设置对应的引脚为串口模式。例如,如果用模块的127/50 引脚作为uart1的tx/rx ,需调用参考代码里的switchUartMode_Pin127_50函数。以此类推。
移植步骤
(不同的android studio版本会有差异, 特别是step 3和step 5只适合比较老的版本,
建议联系support@temolin.com获取最新参考代码,最新的参考代码,uart相关接口以aar/so形式提供,用户不需要写jni.
用户移植只需要参考libs/, jnilibs/, build.gradle等几个地方的内容即可。 )