s5p4418 android 驱动 hal 应用之led 串口 rs485 can总线应用(a

本篇是继上篇的jni层后的app应用层。

由于app相对比较大,说起来也比较麻烦,这里就用一个串口来说明即可,实际上也就串口最具代表性,这个明白了,其他都不是问题。

串口涉及的java文件如下图红色圈所示:

具体的代码下面一一贴出来,捡重要的说明:

MainActivity.java:

package com.example.realarmapp;import realarm.can.RealarmCanActivity;import realarm.serial.RealarmUartActivity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {private Button btnLED, btnUART, btnRS485, btnCAN;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnLED = (Button) findViewById(R.id.btnLED);btnUART = (Button) findViewById(R.id.btnUART);btnRS485 = (Button) findViewById(R.id.btnRS485);btnCAN = (Button) findViewById(R.id.btnCAN);btnLED.setOnClickListener(this);btnUART.setOnClickListener(this);btnRS485.setOnClickListener(this);btnCAN.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(v.equals(btnLED)){Intent i = new Intent(MainActivity.this, RealarmLedActivity.class);startActivity(i);}else if(v.equals(btnUART)) {Intent i = new Intent(MainActivity.this, RealarmUartActivity.class);startActivity(i);}else if(v.equals(btnRS485)) {Intent i = new Intent(MainActivity.this, RealarmUartActivity.class);startActivity(i);}else if(v.equals(btnCAN)) {Intent i = new Intent(MainActivity.this, RealarmCanActivity.class);startActivity(i);}}}这个文件是主activity文件,没什么好说的,就是四个按钮执行不同的功能。

HardwareControl.java:

package realarm.hardware;

package realarm.hardware;import java.io.FileDescriptor;public class HardwareControl {public native int LedSetState(int ledNum,int ledState);public native static FileDescriptor OpenSerialPort(String path, int baudrate,int flags);public native static void CloseSerialPort();public native static void InitCan(int baudrate);public native static int OpenCan();public native static int CanWrite(int canId,String data);public native static CanFrame CanRead(CanFrame mcanFrame, int time);public native static void CloseCan();static {System.loadLibrary("RealarmHardwareJni");}}

该文件是声明native接口,并加载libRealarmHardwareJNI.so库。

MyApplication.java:

package realarm.serial;import java.io.File;import java.io.IOException;import java.security.InvalidParameterException;import realarm.serial.utils.SerialPort;import realarm.serial.utils.SerialPortFinder;import android.app.Application;import android.content.SharedPreferences;import realarm.hardware.HardwareControl;public class MyApplication extends Application {public SerialPortFinder mSerialPortFinder = new SerialPortFinder();private SerialPort mSerialPort = null;public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {if (mSerialPort == null) {/* Read serial port parameters */SharedPreferences sp = getSharedPreferences("android_serialport_api.sample_preferences", MODE_PRIVATE);String path = sp.getString("DEVICE", "/dev/ttyAMA4");int baudrate = Integer.decode(sp.getString("BAUDRATE", "115200"));/* Check parameters */if ( (path.length() == 0) || (baudrate == -1)) {throw new InvalidParameterException();}/* Open the serial port */mSerialPort = new SerialPort(new File(path), baudrate, 0);}return mSerialPort;}public SerialPort getSerialPort(String path, String baudrate, int flag) throws NumberFormatException, SecurityException, IOException{if (mSerialPort == null) {/* Open the serial port */mSerialPort = new SerialPort(new File(path), Integer.decode(baudrate), flag);}return mSerialPort;}public void closeSerialPort() {if (mSerialPort != null) {HardwareControl.CloseSerialPort();mSerialPort = null;}}}该文件实现串口的创建和关闭方法。SerialPort.java:package realarm.serial.utils;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.util.Log;import realarm.hardware.HardwareControl;public class SerialPort {private static final String TAG = "SerialPort";/* * Do not remove or rename the field mFd: it is used by native method * close(); */private FileDescriptor mFd;private FileInputStream mFileInputStream;private FileOutputStream mFileOutputStream;public SerialPort(File device, int baudrate, int flags)throws SecurityException, IOException {/* Check access permission */if (!device.canRead() || !device.canWrite()) {try {/* Missing read/write permission, trying to chmod the file */Process su;su = Runtime.getRuntime().exec("/system/xbin/su");String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"+ "exit\n";su.getOutputStream().write(cmd.getBytes());if ((su.waitFor() != 0) || !device.canRead()|| !device.canWrite()) {throw new SecurityException();}} catch (Exception e) {e.printStackTrace();throw new SecurityException();}}mFd = HardwareControl.OpenSerialPort(device.getAbsolutePath(), baudrate, flags);if (mFd == null) {Log.e(TAG, "native open returns null");throw new IOException();}mFileInputStream = new FileInputStream(mFd);mFileOutputStream = new FileOutputStream(mFd);}// Getters and setterspublic InputStream getInputStream() {return mFileInputStream;}public OutputStream getOutputStream() {return mFileOutputStream;}}该文件实现串口的打开、数据输入、数据输出的方法。何愁没有快乐的泉溪在歌唱,何愁没有快乐的鲜花绽放!

s5p4418 android 驱动 hal 应用之led 串口 rs485 can总线应用(a

相关文章:

你感兴趣的文章:

标签云: