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);
}
}
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);
}
}
相关文章推荐
- Android通过JNI操作串口
- Android通过JNI操作串口《一》
- Android通过JNI操作串口《二》
- Android通过JNI操作串口《四》
- Android通过JNI操作串口
- Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块
- [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
- [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
- win7与android设备通过蓝牙串口的连接方法
- [Android]通过JNI实现卸载自身App后台发送Http请求~
- Android串口操作-基于tiny4412
- 在Android中通过jni方式使用编译好的FFmpeg库-Android中使用FFmpeg媒体库
- 通过JNI调用android驱动
- AndroidJNI 通过C++调用JAVA
- Android java层与jni之间字符串数据传递需进行编码解码操作
- Android 真机,微信打开 H5,切换到 webview,能通过 webdriver 方法操作页面元素,然后链接到新的 H5 页面后,无法操作元素,appium 服务器没有收到 response,
- Android 通过Jni调用Native
- cocos2d-x中通过jni调用android方法
- Android中的JNI数组操作教程
- Android 通过JNI实现守护进程,使Service服务不被杀死