Android 串口通信

作为一款基于Android 的工控主板,很多时候网络通讯是不够的。万一客户机械臂只能提供串口呢?

本篇简单介绍Android的串口通信(基于chrome的一个开源串口包 android_serialport_api)。

Android串口通信

1.1 Step1 导入 android_serialport_api


android_serialport_api/SerialPort

2.2 Step2 在jniLibs/aemeabi 文件夹下导入android_serialport_api的动态链接库 libserial_port.so

使用了JNI技术,使得Java可以调用c语言写成的库

3.3 Step3 use it


package com.example.chenjy.serialport;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android_serialport_api.SerialPort;


public class MainBlogActivity extends AppCompatActivity {

	// 串口实例
    private SerialPort mSerialPort;
	// 输出流
    private OutputStream mOutputStream;
	// 输入流
    private InputStream mInputStream;
	// 读取串口线程
    private ReadThread mReadThread;
	// 串口 
    private String sPort = "/dev/ttyUSB0";
	// 波特率
    private int iBaudRate = 115200;
    private String receiveString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        
        try {
            mSerialPort = new SerialPort(new File(sPort), iBaudRate, 0);	
            mOutputStream = mSerialPort.getOutputStream();
            mInputStream = mSerialPort.getInputStream();
            mReadThread = new ReadThread();
			// 启动读取串口线程
            mReadThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        

    }

    /**
     * 读串口数据
     */
    private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();
			// 如果线程没有被中断,不断从串口读取数据
            while (!isInterrupted()) {

                if (mInputStream != null) {
                    byte[] buffer = new byte[512];
                    int size = 0;
                    try {
					    // 如果没有读到数据,则阻塞 直到返回数据
                        size = mInputStream.read(buffer);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    if (size > 0) {
                        byte[] buffer2 = new byte[size];
                        for (int i = 0; i < size; i++) {
                            buffer2[i] = buffer[i];
                        }
                        receiveString = SerialDataUtils.ByteArrToHex(buffer2).trim();

                        System.out.println("---- receive ---- :"+receiveString);

                    }
                    try {
                        //延时50ms
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }
    }

    /**
     * 发串口数据
     */
    public void sendGetTemper() {
        try {
            
            // 测试用的3d打印机控制板 Gcode指令			
            String command = "M105\n";

            mOutputStream.write(command.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        //释放串口
        mSerialPort.close();
        super.onDestroy();
    }


}

Tips: 网络通信程序是基于阻塞式API的 - 当程序输入、输出操作以后,在这些操作返回之前会一直阻塞该进程。

outPut

源代码

posted @ 2018-09-17 14:50  可爱的黑精灵  阅读(1136)  评论(0编辑  收藏  举报