Android串口使用方法

2024-03-27 1264阅读

温馨提示:这篇文章已超过400天没有更新,请注意相关的内容是否还可用!

目录

前言

 一、环境介绍

二、设备介绍

二、方法一:

1.引入库       

2.编写代码

三、方法二:

1.引入库       

2.编写代码

四、完整代码:

五、源码:



前言

串口是一种用于android对硬件设备通信的一种协议,可以发送某种指令控制硬件设备,也可以接受传感器发送过来的数据,比如IC/ID卡,雷达,传感器等。下面介绍串口在android开发中的2使用方式


 一、环境介绍

  • Android

    系统版本:Android 7.1 Android 12 

    Android Studio Electric Eel | 2022.1.1

    jdk-18.0.2

    • PC

      Windows11 

      串口调试工具sscom(或者其他串口调试工具也可以)

      二、设备介绍

      Android串口使用方法

      Android串口使用方法

      二、方法一:

      使用ARMT自带的串口api   SerialPort.java

      1.引入库       

      在build.gradle 的dependencies中添加jar包

      //ARMT SDK

      implementation files('libs/armtsdkapi.jar')

      2.编写代码

      2.1初始化串口
      initSerialPort("/dev/ttyS4");
          /**
           * 初始化串口
           *
           * @param path 串口路径
           */
          private void initSerialPort(String path) {
              try {
                  uart3 = new SerialPort(path, 9600, 8, "n", 1);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              //获取输出流
              mFileOutputStream3 = (FileOutputStream) uart3.getOutputStream();
              //获取输入流
              mFileInputStream3 = (FileInputStream) uart3.getInputStream();
          }
      

      2.2编写接受数据

      /**
           * 开机线程接收串口数据
           * 收到数据后发送的Handler刷新
           */
          private void readData() {
              new Thread(() -> {
                  while (run_flag) {
                      int size3 = 0;
                      try {
                          size3 = mFileInputStream3.read(mRevBuffer3);
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                      if (size3 > 0) {
                          String str3 = new String(mRevBuffer3, 0, size3);
                          Log.i("串口", "receiveData() --> " + str3);
                          mHandler.sendMessage(mHandler.obtainMessage(1, str3));
                          Arrays.fill(mRevBuffer3, (byte) 0x0);
                      }
                  }
              }, "串口接收线程").start();
          }
      

      这里开启线程一直读数据,读到数据后通过Handler更新到Textview

      2.3发送数据

      /**
           * 发送串口数据
           */
          private void sendData() {
              try {
                  if (mFileOutputStream3 != null) {
                      mFileOutputStream3.write(mBuffer);
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      

      以上就是通过ARMT提供的方法使用串口, 完整代码在最底部

      三、方法二:

      使用第三方库SerialPortHelper

      1.引入库       

      在build.gradle 的dependencies中添加jar包

          //串口
          implementation 'com.github.maybesix:Android-XHLibrary:v1.0.0'

      添加maven 仓库

       repositories {
              maven { url 'https://jitpack.io' }
             
          }

      2.编写代码

      2.1初始化串口
      mHelper = initSerialPortHelper("/dev/ttyS4");
      

      这里初始化 SerialPortHelper,并且设置监听, 收到数据后通过Handler更新TextView

       private SerialPortHelper initSerialPortHelper(String port) {
              SerialPortHelper serialPort = new SerialPortHelper(port, 9600);
              serialPort.setSerialPortReceivedListener(new SerialPortHelper.OnSerialPortReceivedListener() {
                  @SuppressLint("SetTextI18n")
                  @Override
                  public void onSerialPortDataReceived(ComPortData comPortData) {
                      String dataStr = comPortData.getRecTime() + " 收到: " + new String(comPortData.getRecData());
                      mHandler.sendMessage(mHandler.obtainMessage(1, dataStr));
                  }
              });
              serialPort.open();
              return serialPort;
          }

      2.2发送数据

        private void sendDataHelper() {
              if (mHelper != null && mHelper.isOpen()) {
                  mHelper.sendTxtString("我是SerialPortHelper");
              }
          }
      

       2.3获取所有串口地址(通用方法)

      List allSerial = getAllSerial();
       /**
           * 获取所有串口
           *
           * @return
           */
          private List getAllSerial() {
              List serialPorts = new ArrayList();
              Pattern pattern = Pattern.compile("^ttyS|^ttyUSB|^ttyACM|^ttyAMA|^rfcomm|^tty[^/]*$");
              File devDirectory = new File("/dev");
              File[] files = devDirectory.listFiles();
              if (files != null) {
                  for (File file : files) {
                      String name = file.getName();
                      if (pattern.matcher(name).find()) {
                          serialPorts.add(file);
                          Log.e("串口", "扫描到的串口" + file);
                      }
                  }
              }
              return serialPorts;
          }
      

      四、完整代码:

      package com.armt.sdktest_armt.serialPort;
      import androidx.annotation.NonNull;
      import androidx.appcompat.app.AppCompatActivity;
      import android.annotation.SuppressLint;
      import android.os.Bundle;
      import android.os.Handler;
      import android.os.Looper;
      import android.os.Message;
      import android.util.Log;
      import android.view.View;
      import android.widget.Button;
      import android.widget.TextView;
      import com.armt.sdktest_armt.R;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      import java.util.regex.Pattern;
      import cn.com.armt.sdk.hardware.SerialPort;
      import top.maybesix.xhlibrary.serialport.ComPortData;
      import top.maybesix.xhlibrary.serialport.SerialPortHelper;
      public class SerialPortActivity extends AppCompatActivity {
          private byte[] mRevBuffer3 = new byte[100];
          private byte[] mBuffer = "12345".getBytes();//{1,2,3,4,5};
          private SerialPort uart3;
          private FileOutputStream mFileOutputStream3;
          private FileInputStream mFileInputStream3;
          private boolean run_flag = true;
          private Button send;
          private TextView content;
          private SerialPortHelper mHelper;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_serial_port);
              send = findViewById(R.id.send);
              content = findViewById(R.id.content);
              //获取全部串口
              List allSerial = getAllSerial();
              Log.e("串口", "所有串口:" + allSerial);
              //初始化串口,串口地址:"/dev/ttyS4"
              initSerialPort("/dev/ttyS4");
              //开启线程接收串口数据
              readData();
              //第二种使用串口的方式
              mHelper = initSerialPortHelper("/dev/ttyS4");
              //点击发送按钮
              send.setOnClickListener(v -> {
                  //点击模拟发送数据
                      sendData();
      //            sendDataHelper();
              });
          }
          /**
           * 获取所有串口
           *
           * @return
           */
          private List getAllSerial() {
              List serialPorts = new ArrayList();
              Pattern pattern = Pattern.compile("^ttyS|^ttyUSB|^ttyACM|^ttyAMA|^rfcomm|^tty[^/]*$");
              File devDirectory = new File("/dev");
              File[] files = devDirectory.listFiles();
              if (files != null) {
                  for (File file : files) {
                      String name = file.getName();
                      if (pattern.matcher(name).find()) {
                          serialPorts.add(file);
                          Log.e("串口", "扫描到的串口" + file);
                      }
                  }
              }
              return serialPorts;
          }
          /**
           * 初始化串口
           *
           * @param path 串口路径
           */
          private void initSerialPort(String path) {
              try {
                  uart3 = new SerialPort(path, 9600, 8, "n", 1);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              //获取输出流
              mFileOutputStream3 = (FileOutputStream) uart3.getOutputStream();
              //获取输入流
              mFileInputStream3 = (FileInputStream) uart3.getInputStream();
          }
          private Handler mHandler = new Handler(Looper.getMainLooper()) {
              @Override
              public void handleMessage(@NonNull Message msg) {
                  if (msg.what == 1) {
                      String data = (String) msg.obj;
                      content.append(data + "\n");
                  }
              }
          };
          /**
           * 发送串口数据
           */
          private void sendData() {
              try {
                  if (mFileOutputStream3 != null) {
                      mFileOutputStream3.write(mBuffer);
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          /**
           * 开机线程接收串口数据
           * 收到数据后发送的Handler刷新
           */
          private void readData() {
              new Thread(() -> {
                  while (run_flag) {
                      int size3 = 0;
                      try {
                          size3 = mFileInputStream3.read(mRevBuffer3);
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                      if (size3 > 0) {
                          String str3 = new String(mRevBuffer3, 0, size3);
                          Log.i("串口", "receiveData() --> " + str3);
                          mHandler.sendMessage(mHandler.obtainMessage(1, str3));
                          Arrays.fill(mRevBuffer3, (byte) 0x0);
                      }
                  }
              }, "串口接收线程").start();
          }
          /******************************第二种串口使用方式**********************************/
          private SerialPortHelper initSerialPortHelper(String port) {
              SerialPortHelper serialPort = new SerialPortHelper(port, 9600);
              serialPort.setSerialPortReceivedListener(new SerialPortHelper.OnSerialPortReceivedListener() {
                  @SuppressLint("SetTextI18n")
                  @Override
                  public void onSerialPortDataReceived(ComPortData comPortData) {
                      String dataStr = comPortData.getRecTime() + " 收到: " + new String(comPortData.getRecData());
                      mHandler.sendMessage(mHandler.obtainMessage(1, dataStr));
                  }
              });
              serialPort.open();
              return serialPort;
          }
          private void sendDataHelper() {
              if (mHelper != null && mHelper.isOpen()) {
                  mHelper.sendTxtString("我是SerialPortHelper");
              }
          }
          @Override
          protected void onDestroy() {
              super.onDestroy();
              try {
                  run_flag = false;
                  if (mFileOutputStream3 != null) mFileOutputStream3.close();
                  if (mFileInputStream3 != null) mFileInputStream3.close();
              } catch (IOException e) {
                  throw new RuntimeException(e);
              }
              if (mHelper != null) {
                  mHelper.close();
              }
          }
      }

       五、源码下载地址:

      完整源码


VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]