一点一滴成长

导航

统计

串口编程基础知识

1、串口通信原理

基本的通讯方式有并行通讯和串行通讯两种。  
一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯。 
一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。  
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。

串口又称串行端口,它即采用串行通讯,是CPU和串行设备之间的编码转换器。当数据从CPU到串口发送出去时,字节数据转换为串行的位;在接受数据时,串行的位被转换为字节数据。串口按位即bit发送和接收字节,比按字节的并行通信慢但可以使用一根线发送数据的同时用另一根线接收数据。早期计算机上一般包含两个基于RS-232的串口,由于串口不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已开始取消该接口。目前串口多用于工控和测量设备以及部分通信设备中。

串口通信使用地线、发送、接收这3根线来完成,其它线用于握手,但不是必须的。比如RS-232通信方式允许简单连接三线:Tx、Rx和地线,而对于数据传输,双方必须对数据定时采用使用相同匹配参数,如波特率。尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制,这时需要串口的握手功能。

一般的单片机是TTL或CMOS电特性的,而PC机的串口电特性为RS232(TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平),所以两者连接时应使用串口电平转换芯片进行电平转换。

串口从发展历史来看,有三种接口标准,RS-232、RS-422、RS-485:

RS-232可以用于连接鼠标、打印机、Modem、工业仪表等,一般用在实验室等短距离(20米左右),传输速度要求不高(异步传输时波特率仅为20Kbps,实际已远超这个数值)的场合,且抗噪声、干扰较弱。单向传输。RS-232只限于PC串口和设备间点对点的通信。传统的RS-232有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中一般使用9芯D型插座

DB-9接头针脚的功能:
接收/发送数据:

RXD(pin 2):接收数据(Receive Data)
TXD(pin 3):发送数据(Transmit Data)
握手:
RTS(pin 7):发送数据请求(Request to Send)
CTS(pin 8):允许发送(Clear to Send)
DSR(pin 6):数据发送就绪(Data Send Ready)
DCD(pin 1):数据载波检测(Data Carrier Detect)
DTR(pin 4):数据终端就绪(Data Terminal Ready)
地线:
GND(pin 5):地线
其他
RI(pin 9):铃声指示

RS-422在RS-232的基础上提高了传输距离和传输速度,在相同传输线上可连接多个站点(最多10个)。

RS-485从RS-422发展而来,分为二线和四线方式,可连接多个站点(最多32个)。

RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

RS-485与RS-422的共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以用在RS-422网络中应用。

RS-232与RS-422是全双工的,RS485属于半双工。

串口通信中的一帧信息由起始位、数据位、奇偶校验位和停止位4个部分组成,其中还有一个重要参数—波特率:

波特率:每秒钟传送bit的个数,用来衡量通信速度。时钟周期即为波特率,同时串口通信在数据线上的采样率也即为波特率。通常电话线的波特率为14400、28800、36600。波特率和距离成反比,所以高波特率通常用于相距很近的仪器间的通信。

起始位:占一位,为信号0。

数据位:当发送一个信息包时,其中的数据一般占5、7、8位,如何设置取决于你想要传送的数据类型。

奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。奇偶校验位是一个表示给定位数的二进制数中 1 的个数是奇数还是偶数的二进制数,是最简单的错误检测码。对于奇偶校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据(数据位+校验位)有偶个或者奇个1。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

停止位:表示单个包的最后一位。典型的值为1、1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

3、串口通信数据格式

 下面这个数据格式是我在开发中使用的,串口发送方和接收方之间约定的数据通信协议,其中一帧的格式定义为:

   ---------------------------------------------------
  | 帧头 | 帧时间 | 数据段长度 | 数据段 | CRC校验 | 帧尾 |
   ---------------------------------------------------

一帧分为四个部分:其中帧头为0x01,帧尾为0x02,都是占一个字节;帧时间占8个字节,为time_t;数据段长度占两个字节,为unsigned short;数据段不定长;

串口通信中为了保证数据的正确往往需要进行校验,在传送一个字节的时候可以进行奇偶校验,传送一组数据的时候可以采用CRC(循环冗余校验码)校验等。一般为发送方计算出CRC值并随数据发送给接收方,接收方对收到的数据再次计算CRC并与收到的CRC值相比较,若两个CRC值不同,则说明数据通讯中出现错误。CRC校验为两个字节,为一个unsigned short整数,校验计算为从该帧的帧时间到数据段的所有字节,校验基于多项式G(x) = x^16+x^12+x^5+1。

为了避免帧中0x01和0x02与帧头、帧尾混淆,在发送前将一帧中除了帧头、帧尾以外的0x01、0x02进行转义:将0x01转成0x10 0x81,将0x02转成0x10 0x83,另外作为转义标志的0x10转成0x10 0x90,所以在接收方收到一帧数据后应先进行反转义操作。

 

 部分内容转载自:http://wenku.baidu.com/link?url=fAlJPFMWzZKQ2JhKKXTzx8JaRXYW4A9lVEe6Cnqgid_T8exUE-61r57zaBMIOc_v61nnSdbi8BRPiEq4Rgi0PV6J_4Mbsb9tGNEOhPS6gDi

posted on 2014-08-05 16:07  整鬼专家  阅读(1281)  评论(0编辑  收藏