Android串口通讯SerialPort(浅谈原理)

前言:通过前面这篇文章串口通讯SerialPort(使用篇)已经基本掌握了串口的使用,那么不经想问自己,到底什么才是串口通讯呢?串口通讯(Serial Communication),设备与设备之间,通过输入线(RXD),输出线(TXD),地线(GND),按位进行传输数据的一种通讯方式。CPU 和串行设备间的编码转换器。当数据从 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...,但抛开现象看本质,最终目标还是获得一个输入输出流去进行读写操作。

猜你喜欢

转载自blog.csdn.net/qq_42111674/article/details/123737732