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; } }