日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android串口通信-AndroidStudio

發布時間:2023/12/18 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。