您的位置:首页 > 移动开发 > Android开发

Android通过JNI操作串口《三》

2014-04-08 18:16 316 查看
4.
J***A
层封装本地方法
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
数据位
取值
位7或8

* @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.
J***A
调用 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.
J***A
配置串口属性
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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: