分享

Android通过JNI操作串口《三》

 昵称13517980 2013-09-06

 

4.     JAVA层封装本地方法

package com.notioni.uart.manager;

 

 

 

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

/*

 * 单例模式

 */

public class UARTCTLManager {

 

    private TtyNativeControl mTtyControl;

    private boolean mIsOpen = false;

    private static UARTCTLManager mManager;

    private UARTCTLManager(){

       mTtyControl = new TtyNativeControl();

    }

    public static UARTCTLManager getInstance(){

       if(mManager == null){

           mManager = new UARTCTLManager();

       }

       return mManager;

    }

    /*

     * 打开驱动

     */

    public int openDevice(){

       int o = mTtyControl.openTty();

       o=1;

       if(o == 1){

           mIsOpen = true;

       }

       return o;

    }

    /*

     * 关闭驱动

     */

    public int closeDevice(){

       int c = mTtyControl.closeTty();

       if(c == 1){

           mIsOpen = false;

       }

       return c;

    }

    /*

     * 判断驱动是否打开

     */

    public boolean isOpenDevice(){

       return mIsOpen;

    }

    /*

     * 发送数据

     */

    public int sendDataToDevice(byte[] data){

       return mTtyControl.sendMsgToTty(data);

    }

    /*

     * 注入接收数据回调方法

     */

    public void 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

     */

    public int 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

     */

    public int setMode(int mode ,int showLog){

       return mTtyControl.setMode(mode, showLog);

    }

   

    /**

     *

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

     */

    public interface ReceiveDataCallBack extends 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;

 

public class UARTCTLActivity extends Activity implements View.OnClickListener{

    private static final String TAG = "UARTCTLActivity";

    private UARTCTLManager mUartctlManager;

    private Button mOpenOrCloseBtn;

    private Button mSendBtn;

    private EditText mSendText;

    private TextView mReceiveText;

   

    private ReceiveData mReceiveData;

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

    @Override

    public void 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

    protected void onResume() {

    super.onResume();

    }

   

    @Override

    public void 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;

    }

    }

    /*

     * 打开驱动

     */

    private void openDevice(){

    if(!mUartctlManager.isOpenDevice()){

        mUartctlManager.openDevice();

        mUartctlManager.receiveDataFromDevice(mReceiveData);

    }

    }

    /*

     * 关闭驱动

     */

    public void closeDevice(){

    if(mUartctlManager.isOpenDevice()){

        mUartctlManager.closeDevice();

    }

    }

   

    /*

     * 取出待发送的数据

     */

    private byte[] getSendText(){

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

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

        return null;

    }

    return st.getBytes();

    }

   

   

    /*

     * 接收数据

     */

    class ReceiveData implements UARTCTLManager.ReceiveDataCallBack{

       @Override

       public void onReceiveData(byte[] data, TtyNativeControl tty) {

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

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

              mReceiveText.setText(data.toString());

           }

       }

   

    }

   

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

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

    return super.onCreateOptionsMenu(menu);

    }

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

    super.onOptionsItemSelected(item);

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

        Intent intent = new Intent();

        intent.setClass(this, ConfigActivity.class);

        startActivity(intent);

    }

    return true;

    }

    @Override

    protected void onPause() {

    super.onPause();

//      closeDevice();

    }

    @Override

    protected void 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;

 

public class ConfigActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener{

    private static final String TAG = "ConfigActivity";

   

    private static final String KEY_DATABITS = "tty_databits";

    private static final String KEY_EVENT = "tty_event";

    private static final String KEY_SPEED = "tty_speed";

    private static final String KEY_STOPBITS = "tty_stopbits";

   

    ListPreference dataBitsPrefer ;

    ListPreference eventPrefer ;

    ListPreference speedPrefer ;

    ListPreference stopBitsPrefer ;

   

    Object dataBitsValues = null;

    Object eventValues = null;

    Object speedValues = null;

    Object stopbitsValues = null;

    @Override

    protected void 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

    public boolean onPreferenceChange(Preference preference, Object newValue) {

      

       if(preference == dataBitsPrefer){

           dataBitsValues = newValue;

       }else if(preference == eventPrefer){

           eventValues = newValue;

       }else if(preference == speedPrefer){

           speedValues = newValue;

       }else if(preference == stopBitsPrefer){

           stopbitsValues = newValue;

       }

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

       return false;

    }

    @Override

    protected void 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);

    }

}

 


未完下接 Android通过JNI操作串口《四》 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约