浅谈Android串口通讯SerialPort原理
作者:地心铁头娃 发布时间:2023-03-31 12:39:52
前言
通过前面这篇文章Android串口通讯SerialPort的使用详情已经基本掌握了串口的使用,那么不经想问自己,到底什么才是串口通讯呢?串口通讯(Serial Communication),设备与设备之间,通过输入线(RXD),输出线(TXD),地线(GND),按位进行传输数据的一种通讯方式。CPU 和串行设备间的编码转换器(转换器(converter)是指将一种信号转换成另一种信号的装置。信号是信息存在的形式或载体。在自动化仪表设备和自动控制系统中,常将一种信号转换成另一种与标准量或参考量比较后的信号,以便将两类仪表联接起来,因此,转换器常常是两个仪表(或装置)间的中间环节。)。当数据从 CPU 经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹;
一、名词解释
1.波特率:用来表示通信速度的参数,它表示每秒钟传送的 bit 的个数;
2.数据位:通信中数据位的参数;
3.停止位:表示单个包的最后一位,停止位不仅仅是表示传输的结束,并且提供上位机正时钟同步的机会;
4.校验位:串口通信中一种简单的检错方式(偶校验[2]、奇校验[1]、无校验[0]);
二、SerialPort的函数分析
谷歌为开发者提供了一个串口通讯的工具类SerialPort,其中SerialPort中有8个函数,其中有7个是公共方法提供给使用者调用;
1)public static void setSuPath(String suPath)用于设置 su 路径 默认的路径 /system/bin/su,(一般不会使用)
2)static String getSuPath()用于获取su路径(一般不会使用)
3)public InputStream getInputStream()获取输入流;通过此方法可以获取设备向上位机发送过来的数据。
4)public OutputStream getOutputStream()获取输出流;通过此方法可以向设备发送操作指令。
5)public native void close(); 关闭串口;通过此方法关闭串口。
6)public static Builder newBuilder(File device, int baudrate)
7)public static Builder newBuilder(String devicePath, int baudrate)用于构建串口对象。
8) private native FileDescriptor open(String absolutePath, int baudrate, int dataBits, int parity, int stopBits, int flags);用于开启串口通讯,私有的方法,开发者只需创建一个SerialPort对象,函数会自动调用。
三、SerialPort打开串口的流程
1.通过Runtime,获取当串口进程。
2.向Linux内核发送一个"chmod 666 "指令设置串口进程的权限。
3.通过JNI方法获取文件描述符对象。
4.通过文件描述符对象获取输入输出流。
四、疑惑
在上述的加载流程中,不禁有一个疑问,为什么SerialPort中的open()、close()函数都用native去修饰,不用不行么?
于是我从open()入手,open返回一个对象叫FileDescriptor(文件描述符),那么这个类有什么作用呢?
于是我打开了FileDescriptor,注释是这么描述的:文件描述符类的实例充当底层特定于机器的结构的不透明句柄,该结构表示打开的文件、打开的套接字或另一个字节源或汇。文件描述符的主要实际用途是创建一个FileInputStream或FileOutputStream来包含它。应用程序不应该创建自己的文件描述符。
结合《JNI编程指南》推荐使用场景
既然串口通讯使用到了JNI,那么也将继承JNI编程的缺点,APP的兼容性将会变差。
五、总结
虽然串口通讯使用到进程、Linux指令、JNI...,但抛开现象看本质,最终目标还是获得一个输入输出流去进行读写操作。
来源:https://blog.csdn.net/qq_42111674/article/details/123737732
猜你喜欢
- 本文实例讲述了Java类加载器和类加载机制。分享给大家供大家参考,具体如下:一 点睛1 类加载器负责将.class文件(可能在磁盘上,也可能
- Allatori混淆技术介绍Allatori是一个Java 混淆器,它属于第二代混淆器,因此它能够全方位地保护你的知识产权。 Allator
- 1. 在原有工程目录右键-> new ->Module->:2. 选择library:3. 一路next,最后finish
- using System;using System.Collections.Generic;using System.Text;using
- annotation就是注解的意思,在我们使用的 * 时,可以通过业务层添加的某个注解,对业务方法进行拦截,之前我们在进行统一方法拦截时使用
- PreparedStatement介绍可以通过调用 Connection 对象的 prepareStatement(String sql)
- 一、创建地形1、GameObject ->3D Object-> Terrain,创建带有地形属性的平面2、Terrain-〉最
- 在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块,在开发的时候我们连接本地的数据
- 本文详细讲述了JAR命令的用法,对于大家学习和总结jar命令的使用有一定的帮助作用。具体如下:JAR包是Java中所特有一种压缩文档,其实大
- 协议做如下规定:规定数据协议:序列号 长度 状态字 数据长度 数据1 &n
- 没有用Java写过程序,做为一个Java新手,在写第一个Hello,world程序之前,先在Ubuntu中搭建Java开发环境。一、JDK安
- in查询 <foreach>循环问题当我在做in查询的时候,发现在网上有很多种写法:接口public List<CaseR
- using System;using System.Collections.Generic;using System.Linq;
- 前言在做项目的时候,如果项目是前后分离的,后端一定要和前端或者是移动端对接接口,那么问题来了,接口是不是要自己写给他们看,一般的会采用Exc
- 本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下package com.test.swing;import
- 背景:写一个用户登录拦截,在网上找了一圈没找到好用的,于是自己试验了一下,总结出来,分享给大家。1.自定义登录 * LoginInterce
- 1、获取视频缩略图有两个方法(1)通过内容提供器来获取(2)人为创建缩略图(1)缺点就是必须更新媒体库才能看到最新的视频的缩略图[java]
- 如何更改 C# Record 构造函数的行为Record[1] 是 C# 9 中的一个新功能。Record是从Structs[2]借用的特殊
- 1. 可空类型修饰符 ?// 引用类型能用空引用来表示一个不存在的值,但是值类型不能。例如:string str = null;int i
- Spring提供的工具类,主要用于框架内部使用,这个类提供了一些简单的方法,并且提供了易于使用的方法在分割字符串,如CSV字符串,以及集合和