Android串口操作方法实例
1.首先下载一个libserial_port.so,新建目录libs/armeabi,将so文件放到该目录下。
2.定义串口类,在类的构建函数中修改权限,打开设备,创建输入流和输出流,通过native接口访问串口打开关闭函数
publicclassSerialPort{
/*DonotremoveorrenamethefieldmFd:itisusedbynativemethodclose();*/
publicSerialPort(Filedevice,intbaudrate,intflags)throwsSecurityException,IOException,InvalidParameterException{
//如果串口权限不够,改变权限
/*Checkaccesspermission*/
if(!device.canRead()||!device.canWrite()){
try{
/*Missingread/writepermission,tryingtochmodthefile*/
Processsu;
su=Runtime.getRuntime().exec("/system/bin/su");
Stringcmd="chmod666"+device.getAbsolutePath()+"\n"
+"exit\n";
su.getOutputStream().write(cmd.getBytes());
if((su.waitFor()!=0)||!device.canRead()
||!device.canWrite()){
thrownewSecurityException();
}
}catch(Exceptione){
e.printStackTrace();
thrownewSecurityException();
}
}
mFd=open(device.getAbsolutePath(),baudrate,flags);//打开串口
if(mFd==null){
Log.e(TAG,"nativeopenreturnsnull");
thrownewIOException();
}
mFileInputStream=newFileInputStream(mFd);//串口输入流
mFileOutputStream=newFileOutputStream(mFd);//串口输出流
}
//Gettersandsetters
publicInputStreamgetInputStream(){
returnmFileInputStream;
}
publicOutputStreamgetOutputStream(){
returnmFileOutputStream;
}
//JNI
privatenativestaticFileDescriptoropen(Stringpath,intbaudrate,intflags);//c文件中的串口open()函数
publicnativevoidclose();//c文件中的串口close()函数
static{
System.loadLibrary("serial_port");//加载串口库
}
}
}
3.定义抽象类ServerData
publicabstractclassServerData{
protectedSerialPortmSerialPort;
protectedOutputStreammOutputStream;
privateInputStreammInputStream;
privateReadThreadmReadThread;
privateclassReadThreadextendsThread{
@Override
//在线程中读取数据并处理数据
publicvoidrun(){
super.run();
byte[]buffer=newbyte[128];
intsize;
while(true){
try{
if(mInputStream==null)return;
size=mInputStream.read(buffer);//读取数据
if(size>0){
onDataReceived(buffer,size);//处理数据
}
}catch(IOExceptione){
e.printStackTrace();
return;
}
}
}
}
4.实例化串口类,输出流和输入流,实例化读取线程并开始执行该线程
[code]
publicServerData(Stringpath,intbaudrate){
try{
mSerialPort=newSerialPort(newFile(path),baudrate,0);
mOutputStream=mSerialPort.getOutputStream();
mInputStream=mSerialPort.getInputStream();
/*Createareceivingthread*/
mReadThread=newReadThread();
mReadThread.start();
}catch(SecurityExceptione){
}catch(IOExceptione){
}catch(InvalidParameterExceptione){
}
}
protectedabstractvoidonDataReceived(finalbyte[]buffer,finalintsize);
}
[/code]
5.然后再新建一个类,在新建的类中实现上面的抽象函数,并写一个函数返回读取到的数据。
packageView;
//导入R类,所在包不同,不能直接饮用,需要导入才可以使用
importandroid_serialport_api.sample.R;
/*EtcView类,Etc界面管理*/
publicclassSerialView{
privateActivitycontext=null;
privateSerialmEtcServer=null;
/*Etc界面构造函数*/
publicSerialView(Activitycontext){
this.context=context;
}
publicvoidEtcInitView(){
//这样才可以找到android_serialport_api.sample包下的id
TextViewmytext=(TextView)context.findViewById(R.id.mytext);
mEtcServer=newSerial("/dev/s3c2410_serial3",9600);
}
publicvoidEtcRefresh(){
//返回串口线程读取的数据
byte[]buffer=mEtcServer.getdata();
StringrecString=newString(buffer);//将byte[]的数组转换成字符串string
mytext.setText(recString);//设置字符文本
buffer=null;
}
}