我是靠谱客的博主 有魅力彩虹,最近开发中收集的这篇文章主要介绍Android简化版串口通讯Demo程序,一定能跑起来!,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

好吧,来看看如何使用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>

————————————————
版权声明:本文为CSDN博主「cf8833」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cf8833/article/details/91885884

最后

以上就是有魅力彩虹为你收集整理的Android简化版串口通讯Demo程序,一定能跑起来!的全部内容,希望文章能够帮你解决Android简化版串口通讯Demo程序,一定能跑起来!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部