一. 串口初识
平时较为常见的9针串口。也是我这次编程中所使用的硬件,其引脚的定义如下:
Pin Name Dir Description
1 CD Carrier Detect
2 RXD Receive Data
3 TXD Transmit Data
4 DTR Data Terminal Ready
5 GND System Ground
6 DSR Data Set Ready
7 RTS Request to Send
8 CTS Clear to Send
9 RI Ring Indicator
在一般的通讯条件下,我们只需要用到串口的三个引脚,分别为2.RXD, 3.TXD, 5.GND.
在计算机与计算机的通讯中,一般的所采取的联线方式为:RXD-TXD TXD-RXD GND-GND
那么看到这幅图我们就有了一个直观的概念,两台计算机通过将对应的串口中相应的引脚相连使得计算机在硬件上能够进行通讯。(这点不难吧,直观点说计算机A把想发的讯息交给TXD口使得讯息得以发送,计算机B通过读取RXD上的讯息得到相应的讯息)。
可是这只是一个直观的感觉有些地方还是有问题。比如说到底是什么样的讯息计算机才能识别?形象点的比喻就是当你用四川话和美国佬交流的时候你期望他能听懂多少?他只会说一句“I don’t speak Chinese”.
上面的问题说的技术点就是协议的问题,那么我们来看看串口通信相关的协议。串口通信的方式可以分为同步串口通信和异步串口通信。同步串口通信由于我的实验没有涉及所以在这里也就不再提及,主要还是说说异步串口通信。
所谓异步的串口通信就是将8位的bit一位一位的发出去,发送是以字节为单位的。这样的话就很自然会引入几个相关概念
1. 波特率:
这8位数据以多少的速度发送?就必须以多少的速度接收,否则就会出错。这个在串口通信中有专有的名词叫作波特率。单位为比特/秒。也就是一秒中所发送的比特数。
2. 起始位
(串口RXD和TXD的空闲电平为高)这个比较有意思。想像一种情况,当没有起始位时,当我要发送1111111,和我什么都不做时,接收端的计算机都是一直收到的是高电平。当然它也就无法判断这个时候是有数据来了还是这个时候处于空闲状态。所以在异步通信中采用一个低电平作为起始位为,告诉接收机数据要来了,做好准备接收。
3. 停止位
当然你告诉接收机什么时候开始接收数据,你也得告诉它什么时候数据结束。所以在八位数据的后面1位或者是1.5, 2位用高电平表示停止位。
4. 奇偶校验位
数据可能会出错,这个时候用奇偶校验位来检验数据的正确性。若不对,就将数据丢弃。