Android串口通信-AndroidStudio
用到谷歌開源serialPort api?
下載鏈接:serialPort-api
以下項目用的so庫是谷歌原庫,沒有做修改
?
新建項目:
1、先把下載的api中這些文件拷進項目的相應位置?
SerialPort類是咱們Android可以調用的類,
jni目錄下放著c源碼和h頭文件,
jniLibs下面放的就是so庫。
注意:因為用的谷歌原生so庫,所以SerialPort類的包名一定要是android_serialport_api,如果想修改這個包名,就需要重新生成對應的so庫
?
這是SerialPort類,里面的open和close方法在報錯,這個不用管。
2、在build.gradle中添加如下代碼:?
?
sourceSets {
? ? ? ? ? ? main { jni.srcDirs = [] }
? ? ? ? }123
3、這樣就可以串口通信了?
這是串口操作類:
?
package utils;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android_serialport_api.SerialPort;
/**
?* Created by WangChaowei on 2017/12/7.
?*/
public class SerialPortUtils {
? ? private final String TAG = "SerialPortUtils";
? ? private String path = "/dev/ttyS1";
? ? private int baudrate = 9600;
? ? public boolean serialPortStatus = false; //是否打開串口標志
? ? public String data_;
? ? public boolean threadStatus; //線程狀態,為了安全終止線程
? ? public SerialPort serialPort = null;
? ? public InputStream inputStream = null;
? ? public OutputStream outputStream = null;
? ? public ChangeTool changeTool = new ChangeTool();
? ? /**
? ? ?* 打開串口
? ? ?* @return serialPort串口對象
? ? ?*/
? ? public SerialPort openSerialPort(){
? ? ? ? try {
? ? ? ? ? ? ? ? serialPort = new SerialPort(new File(path),baudrate,0);
? ? ? ? ? ? ? ? this.serialPortStatus = true;
? ? ? ? ? ? ? ? threadStatus = false; //線程狀態
? ? ? ? ? ? ? ? //獲取打開的串口中的輸入輸出流,以便于串口數據的收發
? ? ? ? ? ? ? ? inputStream = serialPort.getInputStream();
? ? ? ? ? ? ? ? outputStream = serialPort.getOutputStream();
? ? ? ? ? ? ? ? new ReadThread().start(); //開始線程監控是否有數據要接收
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? Log.e(TAG, "openSerialPort: 打開串口異常:" + e.toString());
? ? ? ? ? ? return serialPort;
? ? ? ? }
? ? ? ? Log.d(TAG, "openSerialPort: 打開串口");
? ? ? ? return serialPort;
? ? }
? ? /**
? ? ?* 關閉串口
? ? ?*/
? ? public void closeSerialPort(){
? ? ? ? try {
? ? ? ? ? ? inputStream.close();
? ? ? ? ? ? outputStream.close();
? ? ? ? ? ? this.serialPortStatus = false;
? ? ? ? ? ? this.threadStatus = true; //線程狀態
? ? ? ? ? ? serialPort.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? Log.e(TAG, "closeSerialPort: 關閉串口異常:"+e.toString());
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? Log.d(TAG, "closeSerialPort: 關閉串口成功");
? ? }
? ? /**
? ? ?* 發送串口指令(字符串)
? ? ?* @param data String數據指令
? ? ?*/
? ? public void sendSerialPort(String data){
? ? ? ? Log.d(TAG, "sendSerialPort: 發送數據");
? ? ? ? try {
? ? ? ? ? ? byte[] sendData = data.getBytes(); //string轉byte[]
? ? ? ? ? ? this.data_ = new String(sendData); //byte[]轉string
? ? ? ? ? ? if (sendData.length > 0) {
? ? ? ? ? ? ? ? outputStream.write(sendData);
? ? ? ? ? ? ? ? outputStream.write('\n');
? ? ? ? ? ? ? ? //outputStream.write('\r'+'\n');
? ? ? ? ? ? ? ? outputStream.flush();
? ? ? ? ? ? ? ? Log.d(TAG, "sendSerialPort: 串口數據發送成功");
? ? ? ? ? ? }
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? Log.e(TAG, "sendSerialPort: 串口數據發送失敗:"+e.toString());
? ? ? ? }
? ? }
? ? /**
? ? ?* 單開一線程,來讀數據
? ? ?*/
? ? private class ReadThread extends Thread{
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? super.run();
? ? ? ? ? ? //判斷進程是否在運行,更安全的結束進程
? ? ? ? ? ? while (!threadStatus){
? ? ? ? ? ? ? ? Log.d(TAG, "進入線程run");
? ? ? ? ? ? ? ? //64 ? 1024
? ? ? ? ? ? ? ? byte[] buffer = new byte[64];
? ? ? ? ? ? ? ? int size; //讀取數據的大小
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? size = inputStream.read(buffer);
? ? ? ? ? ? ? ? ? ? if (size > 0){
? ? ? ? ? ? ? ? ? ? ? ? Log.d(TAG, "run: 接收到了數據:" + changeTool.ByteArrToHex(buffer));
? ? ? ? ? ? ? ? ? ? ? ? Log.d(TAG, "run: 接收到了數據大小:" + String.valueOf(size));
? ? ? ? ? ? ? ? ? ? ? ? onDataReceiveListener.onDataReceive(buffer,size);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? Log.e(TAG, "run: 數據讀取異常:" +e.toString());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //這是寫了一監聽器來監聽接收數據
? ? public OnDataReceiveListener onDataReceiveListener = null;
? ? public static interface OnDataReceiveListener {
? ? ? ? public void onDataReceive(byte[] buffer, int size);
? ? }
? ? public void setOnDataReceiveListener(OnDataReceiveListener dataReceiveListener) {
? ? ? ? onDataReceiveListener = dataReceiveListener;
? ? }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
4、activity中只貼串口數據監聽事件
?
? ? ? ? //串口數據監聽事件
? ? ? ? serialPortUtils.setOnDataReceiveListener(new SerialPortUtils.OnDataReceiveListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onDataReceive(byte[] buffer, int size) {
? ? ? ? ? ? ? ? Log.d(TAG, "進入數據監聽事件中。。。" + new String(buffer));
? ? ? ? ? ? ? ? //
? ? ? ? ? ? ? ? //在線程中直接操作UI會報異常:ViewRootImpl$CalledFromWrongThreadException
? ? ? ? ? ? ? ? //解決方法:handler
? ? ? ? ? ? ? ? //
? ? ? ? ? ? ? ? mBuffer = buffer;
? ? ? ? ? ? ? ? handler.post(runnable);
? ? ? ? ? ? }
? ? ? ? ? ? //開線程更新UI
? ? ? ? ? ? Runnable runnable = new Runnable() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? ? ? textView_status.setText("size:"+ String.valueOf(mBuffer.length)+"數據監聽:"+ new String(mBuffer));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
? ? ? ? });
?
總結
以上是生活随笔為你收集整理的Android串口通信-AndroidStudio的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发的之基本控件和详解四种
- 下一篇: 多线程编程指南