1. 基本概念
UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。
在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。数据传输可以通过两种方式进行,即并行通信和串行通信。
并行通信
如果一组数据的各数据位在多条线上同时被传送,这种传输被称为并行通信,如图1所示。
- 各数据位同时传送,传送速度快、速率高,多用在实时、快速的场合。
- 数据宽度可以是1位~128位,甚至更宽,但是有多少数据位就需要多少根数据线,因此传送的成本高。
- 在集成电路芯片的内部,同一插件板上各部件之间,同一机箱内各插件板之间的数据传送都是并行的。
- 只适用于近距离的通信,通常小于30CM。
串行通信
串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输,如图2所示。
- 数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。
- 传输距离长,可以从几米到几千米。
- 抗干扰能力十分强,其信号间的互相干扰完全可以忽略。
- 理论上传送速率比并行通信慢得多,但实际应用中远距离情况下不低于并行传输
串行通信工作模式
通过单线传输信息是串行数据通信的基础。数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模式:单工、半双工、全双工。
单工形式:早期的电流环
单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方则固定为接收端。信息只能沿一个方向传送,使用一根传输线,如图3所示。
单工形式一般用在只向一个方向传送数据的场合。如计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。还有在某些通信信道中,如单工无线发送等。
半双工形式:RS-485
半双工通信使用同一根传输线,即可发送数据又可接收数据,但不能同时发送和接收。在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式即可以使用一条数据线,也可以使用两条数据线,如图4所示。
半双工通信中每端需有一个收/发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。但是对于像打印机这样单方向传输的外围设备,用半双工方式就能满足要求了,不必采用全双工方式,可省一根传输线。
全双工形式:RS-232、RS-422
全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进行传送,通信双方都能在同一时刻进行发送和接收操作,如图5所示。
在全双工方式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高。
异步传输与同步传输
所谓同步是指接收端要按照发送端所发送的每个数据的起止时间和重复频率来接收数据,既收发双方在时间上必须一致。数据传输的同步方式有异步传输与同步传输两种。
异步传输
- 异步传输是以字符为单位的数据传输。
- 每个字符都要附加1位起始位和l位停止位以标记一个字符的开始和结束。此外,还要附加1位寄偶校验位,可以选择奇校验或偶校验方式对该字符实施简单的差错控制。
- 起始位对应于二进制值“0”,以低电平表示,占用1位宽度。
- 停止位对应于二进制值“1”,以高电平表示,占用1~2位宽度。
- 一个字符占用5~8位,具体取决于数据所采用的字符集。例如,电报码字符为5位、ASCll码字符为7位、汉字码则为8位。
- 起始位和停止位结合起来,便可实现字符的同步。
同步传输
同步传输是以数据块为单位的数据传输。
- 每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束;
- 一般还要附加一个校验序列(如16位或32位CRC校验码),以便对数据块进行差错控制,参见图2-10(b)。
- 根据同步通信规程,同步传输又分为面向字符的同步传输和面向位流的同步传输。
面向字符的同步传输
- 在面向字符的同步传输中,每个数据块的头部用一个或多个同步字符“SYN”来标记数据块的开始;
- 尾部用另一个惟一的字符“ETX”来标记数据决的结束。
- 其中,这些特殊字符的位模式与传输的任何普通字符都有显著的差别。
- 典型的面向字符的同步通信规程是IBM公司的二进制同步通信规程BISYNC。
面向位流的同步传输
- 在面向位流的同步传输中,每个数据块的头部和尾部用一个特殊的比特序列(如01111110)来标记数据块的开始和结束。
- 数据块将作为位流来处理,而不是作为字符流来处理。
- 为了避免在数据流中出现标记块开始和结束的特殊位模式,通常采用位插入的方法,即发送端在发送数据流时,每当出现连续的五个1后便插入一个“0”,接收端在接收数据流时,如果检测到连续五个“1”的序列,就要检查其后的一位数据;若该位是“0”,则删除它;若该位为“1”,则表示数据块的结束,转入结束处理。
- 典型的面向位流的同步通信规程是高级数据链路控制(HDLC)规程和同步数据链路控制(SDLC)规程。
UART是全双工异步串行通信。
握手信号
握手信号实际上是控制信号,用来控制数据的传送。通过握手信号,发送方可以通知接收方是否有数据要发送。接收方通过握手信号通知发送方它是否已经准备好了接收信号。握手信号遵循某种协议。
当发送方和接收方处理数据的不一样时,可能会造成数据丢失。
- 在传输中,如果发送方的发送速度大于接收方的接收速度,同时接收方处理数据的速度不够快的话,那么接收端的缓冲区必定在一定时间后溢出,从而造成以后发送过来的数据不能进入缓冲区而丢失。
- 发送方何时可以继续发送数据,何时必须暂停发送,从而让接收方有时间处理数据,称为流量控制,必须靠握手信号来解决这个问题。例如,打印机和计算机进行通信时,一些打印机打印速度可能跟不上计算机发送数据的速度,就必须要通过握手信号通知计算机暂停发送数据。
硬件握手
- 在硬件握手中,发送方通过将某一个导线拉到高电平或者低电平,来表示发送方可以发送数据。
- 接收方已经准备好接收数据之后,也把某一个导线拉到高电平或者是低电平,来通知发送方,发送方一直在检测这个信号。
- 接收方可以在任何时候把这个信号变为无效,甚至是在接受一个数据块过程中。当发送方检测到这个信号变为无效之后,就必须停止本次发送,直到这个信号变为有效。
软件握手
在软件握手中,以数据线上的数据信号来代替实际的硬件电路。这种方法用在直接连接或者通过调制解调器连接的两台计算机之间进行双向通信的场合。
对于软件握手现在已经建立了一些标准协议,其中最常用的是通信协议。通信协议是指通信双方的一种约定,包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题作出统一规定,通信双方必须共同遵守,也叫做通信控制规程或称传输控制规程,它属于OSI七层参考模型中的数据链路层。
UART支持硬件流控制和软件流控制:
- 硬件流控制用RTS/CTS和DTS/DTR(数据终端就绪/数据设置就绪)控制;
- 一般通过XON/XOFF来实现软件流控制。
- 应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。
大多数情况下MCU之间的通信不会用到流控制。
通信参数
串行端口的通信方式是将字节拆分成一个接着一个的位再传送出去。接到此电位信号的一方再将此一个一个的位组合成原来的字节,如此形成一个字节的完整传送。
在传输进行的过程中,双方明确传送信息的具体方式,否则双方就没有一套共同的译码方式,从而无法了解对方所传过来的信息的意义。因此双方为了进行通信,必须遵守一定的通信规则,这个共同的规则就是通信端口的初始化。
通信端口的初始化必须对以下几项参数进行设置。
数据传输速度
串行通信的传输受到通信双方配备性能及通信线路的特性所左右,收、发双方必须按照同样的速率进行串行通信,即收、发双方采用同样的数据传输率。数据传输率批量的是串行通信中每一秒所传送的数据位数,单位是bit/s。
例如,在某异步串行通信中,每传送一个字符需要8位,如果采用数据传输率4800bit/s进行传送,则每秒可以传送600个字符。
数据的传送单位
- 一般串行通信端口所传送的数据是字符型,若用来传输文件,则会使用二进制的数据类型。
- 当使用字符型时,工业界使用到的有ASCII字符码及JIS字符码;ASCII使用了8位形成一个字符,而JIS码则以7位形成一个字符。
- 欧美的设备多使用8位的字节,而日本的设备多使用7位为一个字节。
ASCii码表:
起始位和停止位
- 由于异步串行传输中并没有使用同步脉冲作基准,故接收端完全不知道传送端何时将进行数据的传送。
- 发送端准备要开始传送数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位。
- 也就是说,当传送端要开始传送数据时,便将传输线上的电位由低电位提升至高电位;而当传送结束后,再将电位降至低电位。
- 接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据,并因停止位的通知(因电压维持在低电位)而明确数据的字符信号已经结束,当加入了起始位及停止位才比较容易达到多字符的接收能力。
- 起始位固定为1位,而停止位则有1、1.5、2位等多种选择,如何选择呢?只要通信双方协议通过即可,没有强制规定。
校验位
- 为了预防错误的发生,使用校验位作为检查的机制。校验位即是用来检查所传送数据的正确性的一种核对码,这之中又分成奇校验与偶校验两种,分别是检查字符码中1数目是奇数或偶数。
- 以偶校验为例,“A”的ASCII码是41H(16进制),将它以二进制表示时,是01000001其中1的数目是2,因此校验位便是0,使1的数目保持偶数;同样,校验位是奇校验时,“A”的校验位便是1,使1的数目保持在奇数。
- 接收者重新计算奇偶校验位,如果新的计算值正确,那么表示正常。如果新的计算值错误,那么接收端就会收到一些指示,表示此次接收的数据有误。
UART异步串行数据的一般格式是:
- 起始位+数据位+停止位,其中起始位1位,数据位可以是5、6、7、8位,停止位可以是1、1.5、2位。
- 起始位是一个值为0的位,所以对于正逻辑的TTL电平,起始位是一位时间的低电平;
- 停止位是值为1的位,所以对于正逻辑的TTL电平,停止位是高电平。
- 对于负逻辑(如RS-232电平)则相反。
- 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。
图1 TTL电平的串行数据帧格式(55aah)
图2 RS-232电平的串行数据帧格式(55aah)
根据波形图计算波特率:
如图3是图1在示波器中的显示示意,其中灰 {MOD}线是示波器的时间分度线,此时假设是200us/格。
可以看到,第一个字节的10位(1位起始位,8位数据位和1位停止位)共占约1.05ms,这样可计算出其波特率约为:
10bit / 1.05ms X 1000 ≈ 9600 bit/s
2. 物理接口
单片机之间的UART接口通常是三根线(TXD,RXD,GND),TTL电平(1.8V,3.3V,5V)。
单片机与PC的接口通常是RS232或USB转串口。
RS232接口
在我们的台式电脑上,有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑都不带这种9针串口了,所以和单片机通信越来越趋向于使用USB虚拟的串口和单片机通信,因此这一节的内容作为了解内容,大家知道有这么回事就行。
我们先来认识一下这个标准串口,串口分为9针的和9孔的,习惯上我们也称之为公头和母头,如图11-3所示。
RS232接口一共有9个引脚,分别定义是:
- 1、载波检测(DCD);
- 2、接收数据(RXD);
- 3、发送数据(TXD);
- 4、数据终端准备好(DTR);
- 5、信号地线(SG);
- 6、数据准备好(DSR);
- 7、请求发送(RTS);
- 8、清除发送(CTS);
- 9、振铃提示(RI)。
我们要让这个串口和我们单片机进行通信,我们只需要关心其中的2脚(RXD),3脚(TXD)和5脚(GND)。
虽然这三个脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机对连直接通信,这是为什么呢?随着我们了解的内容越来越多,我们得慢慢知道,不是所有的电路都是5V代表高电平而0V代表低电平的。对于RS232标准来说,它是个反逻辑,也叫做负逻辑。为何叫负逻辑?它的TXD和RXD的电压,-3V到-15V代表是1,3-15V之间的电压代表是0。低电平代表的是1,而高电平代表的是0,所以称之为负逻辑。因此电脑的9针232串口是不能和单片机直接连接的,需要用一个转换芯片MAX232来完成,如图11-4所示。
这个芯片就可以实现把标准RS232串口电平转换成我们单片机能够识别和承受的UART 0V/5V电平标准。从这里大家似乎慢慢有点明白了,其实RS232串口和UART串口,他们的协议类型是一样,只是电平不同而已,而MAX232这个芯片起到的就是中间人的作用,他把UART电平转换成RS232电平,也把RS232电平转换成UART电平,从而实现标准RS232接口和单片机UART之间的通信连接。
USB转串口通信
随着技术的发展,工业上还有RS232串口通信的大量使用,但是商业技术的应用上,已经慢慢的使用USB转UART技术取代了RS232串口,绝大多数笔记本电脑已经没有串口这个东西了,那我们要实现单片机和电脑之间的通信该如何办呢?
我们只需要在我们电路上添加一个USB转串口芯片,就可以成功实现USB通信协议和标准UART串行通信协议的转换。
3. 调试常见问题
问:我该使用什么样的USB转TTL工具?
答:取决于你的UART引脚的电平标准。大多数芯片使用3.3V/5V的TTL电平,还有一些芯片使用1.8V的TTL电平。如果电平不匹配,会出现无法正常通行的情况。选择USB转TTL工具时注意看转换芯片的型号。主流芯片有PL2303和FT232R,前者可支持5V和3.3V,后者可额外支持1.8V。在安装工具时注意选择安装正确的驱动。
问:RS232和TTL电平之间能直接连接吗?
答:不可以。RS232和TTL电平不兼容。TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平。Uart串口的RXD、TXD等一般直接与处理器芯片的引脚相连,而RS232串口的RXD、TXD等一般需要经过电平转换(通常由Max232等芯片进行电平转换)才能接到处理器芯片的引脚上,否则这么高的电压很可能会把芯片烧坏。
问:我可以一个RXD接多个TXD吗
答:不可以。一个RXD只能接一个TXD,反之亦然。
问:我的串口调试工具会出现不能正常收发数据,我该如何处理?
答:我的经验是试着更换USB转TTL工具与电脑连接的USB口。
4. 参考内容
- http://blog.sina.com.cn/s/blog_5f1c1b430100ygb9.html
- http://bbs.ickey.cn/group-topic-id-24418.html