Android通过JNI操作串口《三》

来源:互联网 发布:c语言基础编程题 编辑:程序博客网 时间:2024/05/20 09:43

4.    JAVA层封装本地方法

package com.notioni.uart.manager;

 

 

 

import com.notioni.uart.manager.TtyNativeControl.ReceiveCallback;

/*

 *单例模式

 */

publicclass UARTCTLManager {

 

   private TtyNativeControlmTtyControl;

   privatebooleanmIsOpen =false;

   privatestatic UARTCTLManagermManager;

   private UARTCTLManager(){

      mTtyControl =new TtyNativeControl();

   }

   publicstatic UARTCTLManager getInstance(){

      if(mManager == null){

          mManager =new UARTCTLManager();

      }

      returnmManager;

   }

   /*

    * 打开驱动

    */

   publicint openDevice(){

      int o =mTtyControl.openTty();

      o=1;

      if(o == 1){

          mIsOpen =true;

      }

      return o;

   }

   /*

    * 关闭驱动

    */

   publicint closeDevice(){

      int c =mTtyControl.closeTty();

      if(c == 1){

          mIsOpen =false;

      }

      return c;

   }

   /*

    * 判断驱动是否打开

    */

   publicboolean isOpenDevice(){

      returnmIsOpen;

   }

   /*

    * 发送数据

    */

   publicint sendDataToDevice(byte[] data){

      returnmTtyControl.sendMsgToTty(data);

   }

   /*

    * 注入接收数据回调方法

    */

   publicvoid receiveDataFromDevice(ReceiveCallback callback){

      mTtyControl.receiveMsgFromTty(callback);

   }

   /**

    * 设置串口数据位,校验位,速率,停止位

    * @param databits   数据位     取值78

    * @param event     校验类型   取值N ,E, O,,S

    * @param speed     速率      取值 2400,4800,9600,115200

    * @param stopBit    停止位     取值1或者 2

    */

   publicint configDevice(int databits,char event,int speed,int stopBit){

      if(!mIsOpen){

          return -1;

      }

      int re =mTtyControl.configTty(databits, event, speed, stopBit);

      return re;

   }

   

   /**

    * 设置串口通信模式,打印串口信息

    * @param mode是否使用原始模式(Raw Mode)方式来通讯  取值0,1,2 说明:0=nothing,1=Raw mode,2=no raw mode

    * @param showLog打印出串口信息Log                取值1,0

    * @return

    */

   publicint setMode(int mode ,int showLog){

      returnmTtyControl.setMode(mode, showLog);

   }

   

   /**

    *

    * 接收数据回调接口,接收驱动送到的数据要实现这个回调接口

    */

   publicinterface ReceiveDataCallBackextends ReceiveCallback{

      

   }

}

 

5.    JAVA调用 Activity

package com.notioni.uart;

 

 

import com.notioni.uart.manager.TtyNativeControl;

import com.notioni.uart.manager.UARTCTLManager;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

 

publicclass UARTCTLActivityextends Activityimplements View.OnClickListener{

   privatestaticfinal StringTAG ="UARTCTLActivity";

   private UARTCTLManagermUartctlManager;

   private ButtonmOpenOrCloseBtn;

   private ButtonmSendBtn;

   private EditTextmSendText;

   private TextViewmReceiveText;

   

   private ReceiveDatamReceiveData;

   /** Called when the activity is first created. */

   @Override

   publicvoid onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       

       mUartctlManager = UARTCTLManager.getInstance();

       mReceiveData =new ReceiveData();

       

       mOpenOrCloseBtn = (Button)findViewById(R.id.openOrcloseBtn);

       mSendBtn = (Button)findViewById(R.id.sendBtn);

       mSendText = (EditText)findViewById(R.id.sendMsg);

       mReceiveText = (TextView)findViewById(R.id.receiveMsg);

       

       mOpenOrCloseBtn.setOnClickListener(this);

       mSendBtn.setOnClickListener(this);

   }

   

   @Override

   protectedvoid onResume() {

   super.onResume();

   }

   

   @Override

   publicvoid onClick(View v) {

   switch(v.getId()){

   case R.id.openOrcloseBtn://打开或关闭驱动

       Log.i(TAG,"isOpen:"+mUartctlManager.isOpenDevice());

       if(mUartctlManager.isOpenDevice()){

           mUartctlManager.closeDevice();

           mOpenOrCloseBtn.setText(R.string.open);

       }else{

           int i =mUartctlManager.openDevice();

           Log.i(TAG,"openDevice result:"+i);

           mOpenOrCloseBtn.setText(R.string.close);

           mUartctlManager.setMode(1, 1);//查看串口配置信息

       }

       break;

   case R.id.sendBtn:

       openDevice();

       int re =mUartctlManager.sendDataToDevice(getSendText());

       Log.i(TAG,"send result:"+re);

       break;

   }

   }

   /*

    * 打开驱动

    */

   privatevoid openDevice(){

   if(!mUartctlManager.isOpenDevice()){

       mUartctlManager.openDevice();

       mUartctlManager.receiveDataFromDevice(mReceiveData);

   }

   }

   /*

    * 关闭驱动

    */

   publicvoid closeDevice(){

   if(mUartctlManager.isOpenDevice()){

       mUartctlManager.closeDevice();

   }

   }

   

   /*

    * 取出待发送的数据

    */

   privatebyte[] getSendText(){

    String st = mSendText.getText().toString()+"\r";

   if(st ==null ||"".equals(st)){

       returnnull;

   }

   return st.getBytes();

   }

   

   

   /*

    * 接收数据

    */

   class ReceiveDataimplements UARTCTLManager.ReceiveDataCallBack{

      @Override

      publicvoid onReceiveData(byte[] data, TtyNativeControl tty) {

          if(mReceiveText != null && data !=null){

             Log.w(TAG,"[onReceiveData] data:"+data.toString());

             mReceiveText.setText(data.toString());

          }

      }

   

   }

   

   @Override

   publicboolean onCreateOptionsMenu(Menu menu) {

   menu.add(1,1,0,R.string.config);

   returnsuper.onCreateOptionsMenu(menu);

   }

   @Override

   publicboolean onOptionsItemSelected(MenuItem item) {

   super.onOptionsItemSelected(item);

   if(item.getItemId() == 1){

       Intent intent = new Intent();

       intent.setClass(this, ConfigActivity.class);

       startActivity(intent);

   }

   returntrue;

   }

   @Override

   protectedvoid onPause() {

   super.onPause();

//     closeDevice();

   }

   @Override

   protectedvoid onDestroy() {

   closeDevice();

   super.onDestroy();

   }

}

6.    JAVA配置串口属性

package com.notioni.uart;

 

import com.notioni.uart.manager.UARTCTLManager;

 

import android.os.Bundle;

import android.preference.ListPreference;

import android.preference.Preference;

import android.preference.PreferenceActivity;

import android.preference.PreferenceScreen;

import android.util.Log;

import android.widget.Toast;

 

publicclass ConfigActivityextends PreferenceActivityimplements Preference.OnPreferenceChangeListener{

   privatestaticfinal StringTAG ="ConfigActivity";

   

   privatestaticfinal StringKEY_DATABITS ="tty_databits";

   privatestaticfinal StringKEY_EVENT ="tty_event";

   privatestaticfinal StringKEY_SPEED ="tty_speed";

   privatestaticfinal StringKEY_STOPBITS ="tty_stopbits";

   

   ListPreference dataBitsPrefer ;

   ListPreference eventPrefer ;

   ListPreference speedPrefer ;

   ListPreference stopBitsPrefer ;

   

   Object dataBitsValues =null;

   Object eventValues =null;

   Object speedValues =null;

   Object stopbitsValues =null;

   @Override

   protectedvoid onCreate(Bundle savedInstanceState) {

      //TODO Auto-generated method stub

      super.onCreate(savedInstanceState);

      addPreferencesFromResource(R.xml.config_options);

      PreferenceScreen prefSet = getPreferenceScreen();

      dataBitsPrefer = (ListPreference)prefSet.findPreference(KEY_DATABITS);

      eventPrefer = (ListPreference)prefSet.findPreference(KEY_EVENT);

      speedPrefer = (ListPreference)prefSet.findPreference(KEY_SPEED);

      stopBitsPrefer = (ListPreference)prefSet.findPreference(KEY_STOPBITS);

      

      dataBitsPrefer.setValueIndex(0);

      eventPrefer.setValueIndex(0);

      speedPrefer.setValueIndex(0);

      stopBitsPrefer.setValueIndex(0);

      

      dataBitsPrefer.setOnPreferenceChangeListener(this);

      eventPrefer.setOnPreferenceChangeListener(this);

      speedPrefer.setOnPreferenceChangeListener(this);

      stopBitsPrefer.setOnPreferenceChangeListener(this);

   }

   

 

   @Override

   publicboolean onPreferenceChange(Preference preference, Object newValue) {

      

      if(preference ==dataBitsPrefer){

          dataBitsValues = newValue;

      }elseif(preference ==eventPrefer){

          eventValues = newValue;

      }elseif(preference ==speedPrefer){

          speedValues = newValue;

      }elseif(preference ==stopBitsPrefer){

          stopbitsValues = newValue;

      }

      Log.i(TAG,"newValue:"+newValue);

      returnfalse;

   }

   @Override

   protectedvoid onPause() {

      super.onPause();

      

      UARTCTLManager mUartctlManager = UARTCTLManager.getInstance();

      int databits=7,speed=9600,stopbits=1;//设置默认值

      char event='N';//设置默认值

      if(dataBitsValues != null){

          databits = Integer.parseInt(dataBitsValues.toString());

      }

      if(eventValues != null){

          event = eventValues.toString().charAt(0);

      }

      if(speedValues != null){

          speed = Integer.parseInt(speedValues.toString());

      }

      if(stopbitsValues != null){

          stopbits = Integer.parseInt(stopbitsValues.toString());

      }

      if(!mUartctlManager.isOpenDevice()){

          mUartctlManager.openDevice();

      }

      Log.e(TAG,"databit="+databits+",event="+event+",speed="+speed+",stopbits="+stopbits);

      if(databits == -1 || speed == -1 || stopbits == -1 || event=='Q'){

          Toast.makeText(this,"有参数没有设置,不去配置串口!", Toast.LENGTH_LONG).show();

          return;

      }

      mUartctlManager.configDevice(databits, event, speed, stopbits);

      

      mUartctlManager.setMode(0, 1);//查看串口配置信息

      

//    Log.e(TAG, "databit="+databits+",event="+event+",speed="+speed+",stopbits="+stopbits);

   }

}
0 0