抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > codesys中打开linux端的串口_干货分享——安卓串口通信

codesys中打开linux端的串口_干货分享——安卓串口通信

时间:2022-08-29 10:00:59

相关推荐

1 引言

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。串口通信(Serial Communications)是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。

2 串口参数

串口中有五个重要的参数:串口设备名称、波特率、奇偶校验位、数据位、停止位。设备名称:串口的名称。Linux下查看串口名称使用 ls -l /dev/ttyS*。波特率:传输速率的参数。波特率表示每秒钟传送的二进制位数。常用的有115200、9600。校验位:在串口通信中一种简单的检错方式,有四种检错方式:偶、奇、高和低,允许无校验位。数据位:通信中实际数据位的参数停止位:用于表示单个包的最后一位。

3 开发流程

由于串口通信过程处于硬件底层,使用串口通信需要在系统层次进行操作,谷歌官方为解决这种困难,使用JNI封装了SerialPort类来帮助开发者简化串口通信。

下载链接:serialPort-api。

3.1 导入SerialPort类

(1)在工程的java文件夹下创建android_serialport_api包,并将下载的SerialPort.java文件放在此包下。

(2)在java目录下创建jni目录,并将Android.mk、Application.mk、gen_SerialPort_h.sh、SerialPort.c、SerialPort.h放至此目录下。

(3)在java目录下创建jnilibs目录,将下载的armeabi、armeabi-v7a、x86拷贝至此目录。

4)在项目的bulid.gradle中添加以下代码:

sourceSets {main {jni.srcDirs = [] }}

SerialPort源代码:

package android_serialport_api;import android.util.Log;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class SerialPort {private static final String TAG = "SerialPort";public FileDescriptor mFd;//输入输出数据流private FileInputStream mFileInputStream;private FileOutputStream mFileOutputStream;public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {//检查访问权限,如果没有读写权限,进行文件操作,修改文件访问权限if (!device.canRead() || !device.canWrite()) {try {//通过挂载到linux的方式,修改文件的操作权限Process su = Runtime.getRuntime().exec("/system/xbin/su");String cmd = "chmod 777 " + device.getAbsolutePath() + "n" + "exitn";su.getOutputStream().write(cmd.getBytes());if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {Log.e("SerialPort", "SerialPort: 没有权限");throw new SecurityException();}} catch (Exception e) {e.printStackTrace();throw new SecurityException();}}//调用本地jni方法打开串口mFd = open(device.getAbsolutePath(), baudrate, flags);if (mFd == null) {//若mFd为空则打开失败 Log.e(TAG, "native open returns null");throw new IOException();}mFileInputStream = new FileInputStream(mFd);mFileOutputStream = new FileOutputStream(mFd);}//获取输入输出流public InputStream getInputStream() {return mFileInputStream;}public OutputStream getOutputStream() {return mFileOutputStream;}// JNI(调用java本地接口,实现串口的打开和关闭)// path参数为串口路径,对应linux系统下串口的描述// baudrate 设置的波特率private native static FileDescriptor open(String path, int baudrate, int flags);//本地jni方法关闭串口public native void close();//加载jni下的C文件库static {Log.d(TAG, "本地库加载中");System.loadLibrary("serial_port");}}

3.2 打开串口

打开串口操作在SerialPort的构造函数中完成,只需创建SerrialPort对象即可打开串口。

private String path = "/dev/ttyMT0";private int baudrate = 115200;serialPort = new SerialPort(new File(path),baudrate,0);if (serialPort == null){Log.e(TAG, "串口打开失败");}

3.3 发送数据

若要通过串口发送数据需要获取串口输出流,发送代码如下:

//获取输出数据流outputStream = serialPort.getOutputStream();//发送数据sendData,类型为字节数组outputStream.write(sendData);//刷新缓冲区outputStream.flush();

3.4 接收数据

从串口接收需要获取串口输入流,并且读取数据需要单独开启线程,代码如下:

inputStream = serialPort.getInputStream();/*** 单开一线程,来读数据*/private class ReadThread extends Thread{@Overridepublic void run() {super.run();//判断进程是否在运行,更安全的结束进程while (!threadStatus){byte[] buffer = new byte[1024];int size; //读取数据的大小try {size = inputStream.read(buffer);if (size > 0){Log.e(TAG, "读取的数据数目 = " + size);}} catch (IOException e) {Log.e(TAG, "run: 数据读取异常:" +e.toString());}}}}

3.5 关闭串口

关闭串口之前需要先关闭数据的输入输出流,在调用close方法关闭串口,代码如下:

inputStream.close();outputStream.close();serialPort.close();

4 结语

通过上述过程可以实现对于串口的通信过程,为便于串口操作,可以封装SerialPortUtils类来辅助操作窗口:

SerialPortUtils.java:

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;public class SerialPortUtils {private final String TAG = "SerialPortUtils";//串口路径private String path = "/dev/ttyMT0";//设置波特率private int baudrate = 115200;public boolean serialPortStatus = false; //是否打开串口标志public String data;public boolean threadStatus; //线程状态,为了安全终止线程public SerialPort serialPort = null;public InputStream inputStream = null;public OutputStream outputStream = null;/*** 打开串口* @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.e(TAG, "sendSerialPort: 发送数据");try {byte[] sendData = data.getBytes(); //string转byte[]this.data = new String(sendData); //byte[]转stringif (sendData.length > 0) {outputStream.write(sendData);outputStream.flush();Log.e(TAG, "sendSerialPort: 串口数据发送成功");}} catch (IOException e) {Log.e(TAG, "sendSerialPort: 串口数据发送失败:"+e.toString());}}/*** 单开一线程,来读数据*/private class ReadThread extends Thread{@Overridepublic void run() {super.run();//判断进程是否在运行,更安全的结束进程while (!threadStatus){Log.e(TAG, "进入线程run");//64 1024byte[] buffer = new byte[1024];int size; //读取数据的大小try {size = inputStream.read(buffer);Log.e(TAG, "size = " + size);if (size > 0){}} catch (IOException e) {Log.e(TAG, "run: 数据读取异常:" +e.toString());}}}}}

我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的架构技术PDF】可以私信我【666】免费获取,技术问题私信我【999】免费解答。

如果觉得《codesys中打开linux端的串口_干货分享——安卓串口通信》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。