C/C++串口通信:典型应用实例编程实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 串口通信的基本概念

1.1.1 并行通信与串行通信

终端与其他设备(例如其他终端、计算机和外部设备)通过数据传输进行通信。数据传输可以通过两种方式进行:并行通信和串行通信。

1. 并行通信

在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信,如图1-1所示。

图1-1 并行通信

并行数据传输的特点是:各数据位同时传输,传输速度快、效率高,多用在实时、快速的场合。

并行传输的数据宽度可以是1~128位,甚至更宽,但是有多少数据位就需要多少根数据线,因此传输的成本较高。在集成电路芯片的内部、同一插件板上各部件之间、同一机箱内各插件板之间的数据传输都是并行的。

并行数据传输只适用于近距离的通信,通常传输距离小于30m。

2. 串行通信

串行通信是指通信的发送端和接收端之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输,如图1-2所示。

图1-2 串行通信

串行数据传输的特点是:数据传输按位顺序进行,仅需要一根传输线即可完成,节省传输线。与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。但是串行通信传送速度比并行通信慢得多。

正是由于串行通信的连线少、成本低,因此它在数据采集和控制系统中得到了广泛的应用,产品也是多种多样的。

1.1.2 串行通信的工作模式

通过单线传输信息是串行数据通信的基础。数据通常是在两个站(点对点)之间进行传输,按照数据流的方向可分成三种传输模式:单工、半双工、全双工。

1. 单工模式

单工模式的数据传输是单向的。通信双方中,一方固定为发送端,另一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线,如图1-3所示。

图1-3 单工模式

单工模式一般用在只向一个方向传输数据的场合。例如计算机与打印机之间的通信是单工模式,因为只有计算机向打印机传输数据,而没有相反方向的数据传输。还有在某些通信信道中,如单工无线发送等。

2. 半双工模式

半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时进行发送和接收。

在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线,如图1-4所示。

图1-4 半双工模式

半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟。信息传输效率低些。

3. 全双工形式

全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进行传输,通信双方都能在同一时刻进行发送和接收操作,如图1-5所示。

图1-5 全双工模式

在全双工模式中,每一端都有发送器和接收器,有两条传输线,可在交互式应用和远程监控系统中使用,信息传输效率较高。

1.1.3 异步传输与同步传输

在串行传输中,数据是一位一位地按照到达的顺序依次进行传输的,每位数据的发送和接收都需要时钟来控制。发送端通过发送时钟确定数据位的开始和结束,接收端需要在适当的时间间隔对数据流进行采样来正确地识别数据。接收端和发送端必须保持步调一致,否则就会在数据传输中出现差错。为了解决以上问题,串行传输可采用以下两种方式:异步传输和同步传输。

1. 异步传输

在异步传输方式中,字符是数据传输单位。在通信的数据流中,字符之间异步,字符内部各位间同步。异步通信方式的“异步”主要体现在字符与字符之间通信没有严格的定时要求。在异步传输中,字符可以是连续地、一个个地发送,也可以是不连续地、随机地单独发送。在一个字符格式的停止位之后,立即发送下一个字符的起始位,开始一个新的字符的传输,这叫做连续的串行数据发送,即帧与帧之间是连续的。断续的串行数据传输是指在一帧结束之后维持数据线的“空闲”状态,新的起始位可在任何时刻开始。一旦传输开始,组成这个字符的各个数据位将被连续发送,并且每个数据位持续的时间是相等的。接收端根据这个特点与数据发送端保持同步,从而正确地恢复数据。收发双方则以预先约定的传输速度,在时钟的作用下,传输这个字符中的每一位。

2. 同步传输

在同步传输方式中,比特块以稳定的比特流的形式传输,数据被封装成更大的传输单位,称为帧。每个帧中含有多个字符代码,而且字符代码与字符代码之间没有间隙以及起始位和停止位。和异步传输相比,数据传输单位的加长容易引起时钟漂移。为了保证接收端能够正确地区分数据流中的每个数据位,收发双方必须通过某种方法建立起同步的时钟。例如,可以在发送器和接收器之间提供一条独立的时钟线路,由线路的一端(发送器或者接收器)定期地在每个比特时间中向线路发送一个短脉冲信号,另一端则将这些有规律的脉冲作为时钟。这种方法在短距离传输时表现良好,但在长距离传输中,定时脉冲可能会和信息信号一样受到破坏,从而出现定时误差。另一种方法是通过采用嵌有时钟信息的数据编码位向接收端提供同步信息。

1.1.4 硬件握手与软件握手

握手信号实际上是控制信号,用来控制数据的传输。通过握手信号,发送端可以得知接收端是否有数据要发送。接收端通过握手信号通知发送端它是否已经准备好了接收信号。握手信号遵循某种协议。

当发送端和接收端处理数据的速度不一样时,可能会造成数据丢失。在传输中,如果发送端的发送速度大于接收端的接收速度,同时若接收端处理数据的速度不够快的话,那么接收端的缓冲区必定在一定时间后溢出,从而造成以后发送过来的数据不能进入缓冲区而丢失。发送端何时可以继续发送数据,何时必须暂停发送,从而让接收端有时间处理数据,称为流量控制,必须靠握手信号来解决这个问题。例如,打印机和计算机进行通信时,一些打印机打印速度可能跟不上计算机发送数据的速度,就必须要通过握手信号通知计算机暂停发送数据。

1. 硬件握手

在硬件握手中,发送端通过将某一个导线拉到高电平或者低电平,来表示发送端可以发送数据。接收端已经准备好接收数据之后,也把某一个导线拉到高电平或者是低电平,来通知发送端,发送端一直在检测这个信号。接收端可以在任何时候把这个信号变为无效,甚至是在接收一个数据块过程中。当发送端检测到这个信号变为无效之后,就必须停止本次发送,直到这个信号变为有效为止。

2. 软件握手

在软件握手中,以数据线上的数据信号来代替实际的硬件电路。这种方法用在直接连接或者通过调制解调器连接的两台计算机之间进行双向通信的场合。

对于软件握手现在已经建立了一些标准协议,其中最常用的是通信协议。通信协议是指通信双方的一种约定,约定包括对数据格式、同步方式、传输速度、传输步骤、检/纠错方式以及控制字符定义等问题进行统一规定,通信双方必须共同遵守,也叫做通信控制规程或称传输控制规程,它属于OSI七层参考模型中的数据链路层。

3. 硬件和软件结合的握手方法

如果使用个人计算机或终端通过调制解调器和主计算机进行通信,那么调制解调器使用硬件握手方法和个人计算机联系,主计算机和调制解调器之间也使用硬件握手方法,主计算机和个人计算机之间将使用软件握手方法进行联系。因此,个人计算机必须要编程,仅当调制解调器的DSR(有时可能使用CD)线电位变高和软件停止信号没有收到时,软件才送出一个通知信号。

一些计算机自动监测硬件握手信号,这些计算机等待硬件握手信号变高以后送出一个字符,所以程序只需要处理软件握手信号。

1.1.5 串口通信的基本参数

串口的通信方式是将字节拆分成一个接着一个的位后再进行传输。接到此电位信号的一方再将此一个一个的位组合成原来的字节,如此形成一个字节的完整传输。

在传输进行的过程中,双方明确传输信息的具体方式,否则双方就会没有一套共同的译码方式,从而无法了解对方所传输过来的信息的意义。因此双方为了进行通信,必须遵守一定的通信规则,这个共同的规则就是串口的初始化。

串口的初始化必须对以下几项参数进行设置。

1. 数据的传输速度

串行通信的传输受到通信双方配备性能及通信线路的特性所控制,收发双方必须按照同样的速率进行串行通信,即收发双方采用同样的波特率。我们通常将传输速度称为波特率,指的是串行通信中每秒所传输的数据位数,单位是b/s。我们经常可以看到仪器或Modem的规格书上都写着19200b/s、38400b/s,…,所指的就是传输速度。

就仪器或工业场合来说,4800b/s、9600b/s是最常见的传输速度,现在的个人计算机所提供的串口的传输速度都可达到15200b/s(甚至达到921600b/s),若传输距离较近而设备也提供时,使用最高的传输速度也可以。

例如在某异步串行通信中,每传输一个字符需要8位,如果采用波特率4800b/s进行传输,则每秒可以传输600个字符。

2. 数据的传输单位

一般串口所传输的数据是字符型,若用来传输文件,则会使用二进制的数据形式。当使用字符型时,工业界使用到的有ASCII字符码及JIS字符码;ASCII码使用了8位形成一个字符,而JIS码则以7位形成一个字符。我们可以发现,欧美的设备多使用8位的字节,而日本的设备多使用7位为一个字节。以实际的RS-232传输上看来,由于工业界常使用的PLC大多只是传输文字码,因此只要7位就可以将ASCII码的0~127码表达出来(27=128,共有128种组合方式),所有的可见字符也在此范围内,所以只要7个数据位就够了。不同的情形下(根据所使用的协议),会使用到不同的传输单位。使用多少位合成一个字节必须先行确定。

3. 起始位与停止位

由于异步串行传输中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的传输。发送端准备要开始传输数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位,也就是说,当发送端要开始传输数据时,便将传输线上的电位由低电位提升至高电位,而当传输结束后,再将电位降至低电位。接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据;并因停止位的通知(因电压维持在低电位)而明确数据的字符信号已经结束;加入了起始位及停止位才能比较容易达到多字符的接收能力。起始位固定为1位,而停止位则有1、1.5、2位等多种选择,如何选择呢?只要通信双方协议通过即可,没有强制规定。

4. 校验位

为了预防错误的产生,使用校验位作为检查的机制。校验位是用来检查所传输数据的正确性的一种核对码,又可分成奇校验与偶校验两种,分别是检查字符码中1的数目是奇数或偶数。以偶校验为例,“A”的ASCII码是41H(十六进制),将它以二进制表示时,是01000001,其中1的数目是2,因此校验位便是0,使1的数目保持偶数;同样地,校验位是奇校验时,“A”的校验位便是1,使1的数目保持在奇数。接收端重新计算奇偶校验位,如果新的计算值正确,那么表示正常。如果新的计算值错误,那么接收端就会发出一些指示,表示此次接收的数据有误。