SerialPort串口通信(二)

匿名 (未验证) 提交于 2019-12-02 23:42:01

简化版的串口通信,非常的简单,看了以后,会很简洁,很清晰,本人亲测,这个博客的例子完美运行

好吧,来看看如何使用SerialPort串口通信

1.首先我们来看一下,运行的效果图:

2.添加依赖,在app下的builder.gradle

   //gogle serialPort     implementation 'com.aill:AndroidSerialPort:1.0.8'

3.下发和接收数据:

 package com.example.administrator.testz;   import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.TextViewCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import com.aill.androidserialport.SerialPort; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;   /**  * Created by jiang on 2017/12/28.  */  public class SerialportTestAct extends AppCompatActivity implements View.OnClickListener {     private StringBuffer seriapPortMsg = new StringBuffer();     private final String TAG = "SerialportTestAct:";     private InputStream mInputStream;     private OutputStream mOutputStream;     private TextView log;     private EditText serMsg;     private Button sendMsg;     private SerialPort serialPort;     private final String SERIALPORT_NO3 = "/dev/ttyS1";//串口号3     private final int BAUDRATE = 115200;//波特率     private Context mContext;      //记住  我们的程序  不管客户端还是硬件端 发送和接收的指令统一使用十六进制(HEX)来表示     @Override     protected void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         mContext = this;         setContentView(R.layout.act_serialport);         log = (TextView) findViewById(R.id.log);         sendMsg = (Button) findViewById(R.id.sendMsg);         sendMsg.setOnClickListener(this);         serMsg = (EditText) findViewById(R.id.serMsg);         initSerialPort();  //初始化串口设置     }      @Override     public void onClick(View view) {         switch (view.getId()){             case R.id.sendMsg:                 //点击按钮向串口下发指令数据                 String msg = serMsg.getText().toString().trim();                 if(msg!=null&&!msg.equals("")){                     //string转16进制的数据,下发的数据必须为byte数组,长度会根据协议来定                     byte[] buff = fromHexString(msg);                     try {                         mOutputStream.write(buff,0,buff.length);                         Log.e(TAG, "下发完成");                     } catch (IOException e) {                         e.printStackTrace();                         Log.e(TAG, e.getMessage());                     }                 }         }     }      private void initSerialPort() {         try {             serialPort = new SerialPort(new File(SERIALPORT_NO3), BAUDRATE, 0);             mInputStream = serialPort.getInputStream();             mOutputStream = serialPort.getOutputStream();             //这个地方为什么要开线程? 因为这个线程是用于监听返回的数据的,必须开,一直开着             new Thread(new ReadSerialPortMsgThread()).start();         } catch (Exception e) {             e.printStackTrace();             Log.e(TAG, "打开串口失败");         }     }      //接收硬件通过串口回应的数据     private class ReadSerialPortMsgThread implements Runnable {         @Override         public void run() {             int size;             byte buff[] = new byte[1024];             while (true) {                 try {                     if (mInputStream == null) {                         return;                     }                     size = mInputStream.read(buff);                     Log.e(TAG, "接收到串口回调w == " + size);                     if (size > 0) {                         for (int i = 0; i < size; i++) {                             Log.e("TAG", "十进制=" + buff[i]);                             final String res = hexToDecimal(buff[i]);                             log.post(new Runnable() {                                 @Override                                 public void run() {                                    // editIn.append(text)                                     log.append("" + res);                                 }                             });                         }                     }                 } catch (Exception e) {                     e.printStackTrace();                 } finally {                     try {                         Thread.sleep(1000);                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }             }         }     }      //十进制转16进制     private String hexToDecimal(byte oneByte) {         String str = "";         int h = (oneByte >>> 4) & 0xF;         int l = oneByte & 0xF;         char ch = (char) ((h < 10) ? ('0' + h) : ('A' + h - 10));         char cl = (char) ((l < 10) ? ('0' + l) : ('A' + l - 10));         str = "";         str += ch;         str += cl;         return str;     }      /**      * 16进制字符串转换成字节数组。      * <p>      * param hex 16进制字符串      *这个协议是  还的重订      * @return 字节数组      */     private byte[] hexStringToByte(String hex) {         if (hex == null || hex.equals(""))             return null;         String[] arry = hex.split(" ");         byte[] data = new byte[arry.length];         try {             for (int i = 0; i < arry.length; i++) {                 //这个地方在定协议                 if (arry[i].length() > 2)                     return null;                 int d = Integer.parseInt(arry[i], 16);                 data[i] = (byte) (d & 0xff);             }          } catch (Exception e) {             return null;         }         return data;     }      public static byte[] fromHexString(String hexString) {         if (null == hexString || "".equals(hexString.trim())) {             return new byte[0];         }         byte[] bytes = new byte[hexString.length() / 2];         // 16进制字符串         String hex;         for (int i = 0; i < hexString.length() / 2; i++) {             // 每次截取2位             hex = hexString.substring(i * 2, i * 2 + 2);             // 16进制-->十进制             bytes[i] = (byte) Integer.parseInt(hex, 16);         }          return bytes;     } } 

4.贴一下布局吧,仅仅一个类,就解决串口数据通信的下发和接收问题,到这里基本就结束了

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical"     android:padding="30dp">      <TextView         android:layout_width="match_parent"         android:layout_height="30dp"         android:text="串口接收数据:"         android:textSize="20sp" />      <TextView         android:id="@+id/log"         android:layout_width="match_parent"         android:layout_height="80dp"         android:background="@color/colorAccent" />      <TextView         android:layout_width="match_parent"         android:layout_height="30dp"         android:layout_marginTop="30dp"         android:text="串口发送数据:"         android:textSize="20sp" />      <EditText         android:id="@+id/serMsg"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:hint="输入下发的值" />      <Button         android:id="@+id/sendMsg"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_marginTop="30dp"         android:text="发送串口信息" />  </LinearLayout> 

文章来源: https://blog.csdn.net/cf8833/article/details/91885884
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!