Android
系统诞生这十几年以来,Android
开发工程师岗位经历了由盛转衰的过程,目前纯UI的Android APP已经鲜有公司愿意花费巨资去开发,Android APP开发的业务也仅剩游戏、物联网(Internet of Things,简称IoT)等方向。在物联网的世界中,串口通信是常见的有线通信方式,本篇文章围绕Android
与串口通信,来重新认识一下串口通信。
目录
- 串口通信简介
- 串口通信分类
- 串行通信
- 根据数据同步方式划分
- 根据数据传输方式划分
- 根据电气标准及协议划分
- 并行通信
- 图表总结串口通信
- 串口通信的使用
串口通信简介
串口通信(Serial Communications
),即串口按位(bit
)发送和接收字节的通信方式。
串口是显控设备与信号处理板之间通信的主要接口,也是显控设备与其他设备、设备与设备之间的协议数据帧通信传输的重要接口。
串口通信分类
根据通信方式划分,可以将串口通信划分为串行通信
与并行通信
。
串行通信
串行通信:通信双方按位进行,遵守时序的一种通信方式。
串行通信可以根据数据同步方式
、数据传输方式
、电气标准及协议
再次细分为不同的种类。
根据数据同步方式划分
- 同步通信
同步通信:一次通信只传送一帧信息,通常含有若干个数据字符。数据格式分别为面向字符和面向bit
。 - 异步通信
异步通信:每一个字符要用起始位和停止位作为字符开始和结束的标志,以字符为单位一个个地发送和接收。在进行异步传输数据时,通信双方必须约好:字符格式、通信速率。
根据数据传输方式划分
- 单工
单工:通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
- 半双工
半双工:在通信过程的任意时刻,信息既可由A传到B,又能由B传A,但只能有一个方向上的传输存在。
- 全双工
全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。
根据电气标准及协议划分
串口按电气标准及协议来划分,包括EIA-RS-232C
、EIA-422
、EIA-485
等。
- EIA-RS-232C
RS-232C
标准(协议)的全称是EIA-RS-232C
标准,定义是“数据终端设备(DTE
)和数据通讯设备(DCE
)之间串行二进制数据交换接口技术标准”。它是在1970年由美国电子工业协会(EIA
)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于全双工串行通讯的标准。例如,在PC
机上的COM1
、COM2
接口,就是RS-232C
接口。
查看更多详情:EIA-RS-232C
- EIA-422
EIA-422
(又称为RS-422
)是一系列的规定采用4线,全双工,差分传输,多点通信的数据传输协议。它采用平衡传输采用单向/非可逆,有使能端或没有使能端的传输线。和EIA-485
不同的是EIA-422
不允许出现多个发送端而只能有多个接受端。硬件构成上EIA-422
(RS-422
) 相当于两组EIA-485
(RS-485
),即两个半双工的EIA-485
(RS-485
)构成一个全双工的RS-422
(EIA-422
)。
查看更多详情:EIA-422
- EIA-485
EIA-485
(过去叫做RS-485
或者RS485
)是隶属于OSI模型物理层的电气特性规定为2线、半双工、平衡传输线多点通信的标准。是由电信行业协会(TIA
)及电子工业联盟(EIA
)联合发布的标准。实现此标准的数字通信网可以在有电子噪声的环境下进行长距离有效率的通信。在线性多点总线的配置下,可以在一个网络上有多个接收器。因此适用在工业环境中。
查看更多详情:EIA-485
并行通信
并行通信:是指以字节(byte
)或字节(byte
)的倍数为传输单位,同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错,因此并行通信不适合远距离数据传输。例如:打印机端口、IDE端口等。
图表总结串口通信
串口通信的使用
作为一个
Android
开发者,与串口相关的很多东西我们都不需要去了解,我们基本都只需要关注如何去连接上这个串口,或许也只有硬件开发工程师,才需要了解到串口通信的原理等相关知识。
使用前先前往Github clone
项目AndroidSerialPort到本地,拷贝lib_serialport
模块到项目。
接着配置串口的连接所需参数:
- 串口号:用于串口通信协议的接口。
- 波特率(
Baud rate
):一个单位时间内传输符号的个数。如,9600的波特率表示每秒传输9600个字节,每毫秒9.6字节。 - 数据位:计算机发送的信息包,取决于传送的信息长度。
- 校验位:又称奇偶校验位,是校验代码传输正确性的一种校验方式。
- 停止位:提供了校正时钟同步的机会,同时用来表示传输的结束。
- 流控:控制数据传输的进程,实现收发双方的速度匹配,防止数据的丢失。常用的流控制是硬件流控制和软件流控制。硬件流控制常用的有
RTS/CTS
流控制(数据终端就绪/数据设置就绪)流控制,软件流控制常用的有XON/XOFF
。
var mSerialPortHelper = SerialPortHelper()
// 配置串口号
mSerialPortHelper.port = ConfigManage.serialPort
// 配置波特率
mSerialPortHelper.baudRate = ConfigManage.baudRate.toInt()
// 配置数据位
mSerialPortHelper.dataBits = ConfigManage.dataBits.toInt()
// 配置校验位
mSerialPortHelper.parity = SerialPortDataManage.parity[ConfigManage.parity]!!.toInt()
// 配置停止位
mSerialPortHelper.stopBits = ConfigManage.stopBits.toInt()
// 配置流控
mSerialPortHelper.flowCon = SerialPortDataManage.flow_bits[ConfigManage.flowBits]!!.toInt()
// 监听串口数据的传输
mSerialPortHelper.setISerialPortDataListener(object : ISerialPortDataListener {
override fun onDataReceived(bytes: ByteArray?) {
byteToHex(1, bytes)
}
override fun onDataSend(bytes: ByteArray?) {
byteToHex(0, bytes)
}
})
// 打开串口
mSerialPortHelper.open()
最终效果:
参考文档
1、【串口通信】学习笔记
2、通信方式的分类(串行通信和并行通信)