浅谈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


猜你喜欢
- 本文实例讲述了C#控制图像旋转和翻转的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 一、常见的锁策略1.1 乐观锁乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正 式对数据是否产生并
- 一、进程线和程的概念线程: 一个线程是一个独立的执行流,每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时
- CLR要求每一个类型都最终从object类型派生,如下: class Typer {} === class Typer :object {}
- 环境变量这个概念不陌生, 就是操作系统的环境变量。系统变量就是java本身维护的变量。 通过 System.getProperty 的方式获
- 1.任何一门编程语言均有相关数据类型。C#也不例外,其基本数据类型有int,short,long,float,double,string等。
- 项目需求中有个功能模块需要用到时间选择控件,但是android系统自带的太丑了,只能自己优化下,结合WheelView实现滚轮选择日期,好像
- 一、基本概念:线程、进程1.1、进程与线程的具体介绍线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。若一个进程同
- Android 11文件管理权限申请Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDc
- 一、使用swing嵌套浏览器要实现的功能:通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出
- 问题之前一直使用Mybatis,最近尝试使用Mybatis-Plus,却在updateById登录成功后更新最近登录时间出现了问题,一般业务
- 前言当线程池的线程阻塞时,线程池会创建额外的线程,而创建、销毁和调度线程所需要相当昂贵的内存资源,另外,很多的开发人员看见自己程序的线程没有
- 1. 是否需要整合 ?不需要 : 单独使用Springmvc. 需要将原先Spring中的内容通通迁移到Springmvc中. 例如:数据源
- 如今代码圈很多做网络爬虫的例子,今天小编给大家分享的是如何用C#做网络爬虫。注意这次的分享只是分享思路,并不是一整个例子,因为如果要讲解一整
- 本文实例讲述了WinForm实现自定义右下角提示效果的方法。分享给大家供大家参考。具体实现方法如下:using System;using S
- 程序可分为三部分:头文件:包含结构声明和使用这些结构的函数的原型源代码文件:包含与结构有关的函数的代码源代码文件:包含调用与结构相关的函数代
- SwipeRefreshLayout是Android官方的下拉刷新控件,使用简单,界面美观,不熟悉的朋友可以随便搜索了解一下,这里就不废话了
- 在使用各类App的时候,尤其是在发布朋友圈、微博的时候,都会选择配图,进入手机相册,选择自己想要的照片,作为发布内容的一部分,这里就简单介绍
- 本次就是记录一下我的开发过程,不是教程,纯属自己做个笔记。现在项目有个需求,需要用户在公众号发送图片消息的时候,我后台程序能接收到这个图片,
- 微服务开发中经常有这样的需求,公司自定义了通用的请求头,需要在微服务的调用链中转发,比如在请求头中加入了token,或者某个自定义的信息un