串口通信大全

RS232技术文摘枕善居收集整理http://www.elecfans.com
- 1 -
版权声明:本资料来自互联网,枕善居只负责聚合,原版权规原作者所有!枕善居不
负责任何责任! (我为人人,人人为我,枕善居http://www.mndsoft.com)
目 次
1. RS-232-C 详解………………………………………………………2
2. 串口通信基本接线方法………………………………………………12
3. 串口通讯的概念及接口电路…………………………………………13
4. 有关 RS232和RS485接口的问答……………………………………14
5. 同步通信方式…………………………………………………………16
6. 通信协议…………………………………………………………………19
7. 实战串行通讯……………………………………………………………25
8. 全双工和半双工方式…………………………………………………33
9. 浅析 PC 机串口通讯流控制……………………………………………34
10. 奇偶校验 ………………………………………………………………35
11. 开发通信软件的技术与技巧…………………………………………36
12. 接口技术的基本知识…………………………………………………41
13. 一个单片机串行数据采集/传输模块的设计…………………………44
14. 单工、半双工和全双工的定义………………………………………48
15. 从 RS232 端口获得电源…………………………………………………49
16. 串行同步通信的应用……………………………………………………50
17. 串行通信波特率的一种自动检测方法…………………………………53
18. RS-232、RS-422 与RS-485 标准及应用………………………………56
19. 串口泵…………………………………………………………………64
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 2 -
RS-232-C 详解
串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上
经过改进而形成的。所以,以RS-232C为主来讨论。RS-323C 标准是美国EIA(电子工业联合
会)与BELL等公司一起开发的1969 年公布的通信协议。它适合于数据传输速率在0~
20000b/s 范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性
都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为
一种标准,目前已在微机通信接口中广泛采用。
在讨论 RS-232C 接口标准的内容之前,先说明两点:
首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)
与数据通信设备DCE(Data Communication Equipment)而制定的。因此这个标准的制定,
并未考虑计算机系统的应用要求。但目前它又广泛地被借来用于计算机(更准确的说,是计
算机接口)与终端或外设之间的近端连接标准。显然,这个标准的有些规定及和计算机系统
是不一致的,甚至是相矛盾的。有了对这种背景的了解,我们对RS-232C标准与计算机不兼
容的地方就不难理解了。
其次,RS-232C 标准中所提到的“发送”和“接收”,都是站在DTE 立场上,而不是站
在DCE 的立场来定义的。由于在计算机系统中,往往是CPU 和I/O设备之间传送信息,两者
都是DTE,因此双方都能发送和接收。
一、RS-232-C
RS-232C 标准(协议)的全称是EIA-RS-232C 标准,其中EIA(Electronic Industry
Association)代表美国电子工业协会,RS(ecommeded standard)代表推荐标准,232是标
识号,C代表RS232 的最新一次修改(1969),在这之前,有RS232B、RS232A。。它规定连
接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有有EIA�RS-232-C、
EIA�RS-422-A、EIA�RS-423A、EIA�RS-485。这里只介绍EIA�RS-232-C(简
称232,RS232)。例如,目前在IBM PC 机上的COM1、COM2 接口,就是RS-232C接口。
1.电气特性
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。
在 TxD 和RxD 上:逻辑1(MARK)=-3V~-15V
逻辑 0(SPACE)=+3~+15V
在 RTS、CTS、DSR、DTR 和DCD等控制线上:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 3 -
图 1
以上规定说明了RS-323C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”(传
号)的电平低于-3V,逻辑“0”(空号)的电平告语+3V;对于控制信号;接通状态(ON)
即信号有效的电平高于+3V,断开状态(OFF)即信号无效的电平低于-3V,也就是当传输电平
的绝对值大于3V 时,电路可以有效地检查出来,介于-3~+3V 之间的电压无意义,低于-15V
或高于+15V的电压也认为无意义,因此,实际工作时,应保证电平在±(3~15)V 之间。
EIA-RS-232C与TTL转换:EIA-RS-232C是用正负电压来表示逻辑状态,与TTL 以高低
电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL 器件连接,必须
在EIA-RS-232C 与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立
元件,也可用集成电路芯片。目前较为广泛地使用集成电路转换器件,如MC1488、SN75150
芯片可完成TTL 电平到EIA 电平的转换,而MC1489、SN75154可实现EIA 电平到TTL电平的
转换。MAX232 芯片可完成TTL←→EIA 双向电平转换,图1 显示了1488 和1489的内部结构
和引脚。MC1488 的引脚(2)、(4,5)、(9,10)和(12,13)接TTL 输入。引脚3、6、8、11 输出
端接EIA-RS-232C。MC1498 的14 的1、4、10、13 脚接EIA 输入,而3、6、8、11 脚接TTL
输出。具体连接方法如图2 所示。图中的左边是微机串行接口电路中的主芯片UART,它是
TTL 器件,右边是EIA-RS-232C 连接器,要求EIA 高电压。因此,RS-232C所有的输出、输
入信号都要分别经过MC1488和MC1498转换器,进行电平转换后才能送到连接器上去或从连
接器上送进来。
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 4 -
图 2
2、、连接器的机械特性:
连接器:由于RS-232C 并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9
各种类型的连接器,其引脚的定义也各不相同。下面分别介绍两种连接器。
(1)DB-25: PC 和XT 机采用DB-25型连接器。DB-25 连接器定义了25 根信号线,分
为4 组:
①异步通信的9 个电压信号(含信号地SG)2,3,4,5,6,7,8,20,22
②20mA 电流环信号 9个(12,13,14,15,16,17,19,23,24)
③空 6 个(9,10,11,18,21,25)
④保护地(PE)1 个,作为设备接地端(1 脚)
DB-25 型连接器的外形及信号线分配如图3 所示。注意,20mA 电流环信号仅IBM PC和
IBM PC/XT 机提供,至AT 机及以后,已不支持。
图 3
(2)DB-9 连接器
在 AT 机及以后,不支持20mA 电流环接口,使用DB-9连接器,作为提供多功能I/O卡
或主板上COM1 和COM2 两个串行接口的连接器。它只提供异步通信的9 个信号。DB-25 型连
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 5 -
接器的引脚分配与DB-25 型引脚信号完全不同。因此,若与配接DB-25 型连接器的DCE设备
连接,必须使用专门的电缆线。
电缆长度:在通信速率低于20kb/s 时,RS-232C所直接连接的最大物理距离为15m(50
英尺)。
最大直接传输距离说明:RS-232C 标准规定,若不使用MODEM,在码元畸变小于4%的情
况下,DTE和DCE 之间最大传输距离为15m(50英尺)。可见这个最大的距离是在码元畸变
小于4%的前提下给出的。为了保证码元畸变小于4%的要求,接口标准在电气特性中规定,
驱动器的负载电容应小于2500pF。
3、RS-232C的接口信号
RS-232C 规标准接口有25 条线,4 条数据线、11 条控制线、3条定时线、7 条备用和未
定义线,常用的只有9 根,它们是:
(1)联络控制信号线:
数据装置准备好(Data set ready-DSR)——有效时(ON)状态,表明MODEM处
于可以使用的状态。
数据终端准备好(Data set ready-DTR)——有效时(ON)状态,表明数据终端可
以使用。
这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示
设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制
信号决定。
请求发送(Request to send-RTS)——用来表示DTE请求DCE发送数据,
即当终端要发送数据时,使该信号有效(ON 状态),向MODEM 请求发
送。它用来控制MODEM 是否要进入发送状态。
允许发送(Clear to send-CTS)——用来表示DCE准备好接收DTE
发来的数据,是对请求发送信号RTS 的响应信号。当MODEM 已准备好
接收终端传来的数据,并向前发送时,使该信号有效,通知终端开始
沿发送数据线TxD 发送数据。
这对 RTS/CTS 请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间
的切换。在全双工系统中作发送方式和接收方式之间的切换。在全双工系统中,因配置双向
通道,故不需要RTS/CTS 联络信号,使其变高。
接收线信号检出(Received Line detection-RLSD)——用来表示DCE
已接通通信链路,告知DTE 准备接收数据。当本地的MODEM 收到由通
信链路另一端(远地)的MODEM送来的载波信号时,使RLSD 信号有效,
通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字
两数据后,沿接收数据线RxD送到终端。此线也叫做数据载波检出
(Data Carrier dectection-DCD)线。
振铃指示(Ringing-RI)——当MODEM 收到交换台送来的振铃呼叫信号
时,使该信号有效(ON状态),通知终端,已被呼叫。
(2)数据发送与接收线:
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 6 -
发送数据(Transmitted data-TxD)——通过TxD终端将串行数据发送
到MODEM,(DTE→DCE)。
接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来
的串行数据,(DCE→DTE)。
(3)地线
有两根线SG、PG——信号地和保护地信号线,无方向。
上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有
当DSR 和DTR 都处于有效(ON)状态时,才能在DTE和DCE 之间进行传送操作。若DTE要发
送数据,则预先将DTR 线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能
在TxD 线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为半双工的通
信才能确定DCE 已由接收方向改为发送方向,这时线路才能开始发送。
2 个数据信号:发送TXD;接收RXD。
1 个信号地线:SG。
6 个控制信号:
DSR��数传机(即modem)准备好,Data Set Ready.
DTR��数据终端(DTE,即微机接口电路,如
Intel8250/8251,16550)准备好,Data Terminal Ready。
RTS��DTE 请求DCE 发送(Request To Send)。
CTS��DCE 允许DTE 发送(Clear To Send),该信号是对RTS 信
号的回答。
DCD��数据载波检出,Data Carrier Detection 当本地DCE设
备(Modem)收到对方的DCE设备送来的载波信号时,使DCD 有效,通
知DTE 准备接收, 并且由DCE将接收到的载波信号解调为数字信号,
经 RXD 线送给DTE。
RI��振铃信号Ringing当DCE收到交换机送来的振铃呼叫信号
时,使该信号有效,通知DTE已被呼叫。
用途
232 引脚CCITT Modem 名称说明
异步同步
1 101 AA 保护地设备外壳接地PE PE√
2 103 BA 发送数据数据送Modem TXD
3 104 BB 接收数据从 Modem 接收数据RXD
4 105 CA 请求发送在半双工时控制发送器的开和关RTS
5 106 CB 允许发送Modem 允许发送CTS
6 107 CC 数据终端准备好Modem 准备好DSR
7 102 AB 信号地信号公共地SG SG√
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 7 -
8 109 CF 载波信号检测Modem 正在接收另一端送来的信号DCD
9 空
10 空
11 空
12 接收信号检测(2) 在第二通道检测到信号√
13 允许发送(2) 第二通道允许发送√
14 118 发送数据(2) 第二通道发送数据√
15 113 DA 发送器定时为 Modem 提供发送器定时信号√
16 119 接收数据(2) 第二通道接收数据√
17 115 DD 接收器定时为接口和终端提供定时√
18 空
19 请求发送(2) 连接第二通道的发送器√
20 108 CD 数据终端准备好数据终端准备好DTR
21 空
22 125 振铃 振铃指示RI
23 111 CH 数据率选择选择两个同步数据率√
24 114 DB 发送器定时为接口和终端提供定时√
25 空
PART2
一、远距离通信
第 1 和第2中情况是属于远距离通信(传输距离大于15m 的通信)的例子,故一般要
加调制解调器MODEM,因此使用的信号线较多。注意:在以下各图中,DTE 信号为RS-232-C
信号,DTE 与计算机间的电平转换电路未画出。
1、采用Modem(DCE)和电话网通信时的信号连接:
若在双方MODEM 之间采用普通电话交换线进行通信,除了需要2~8 号信号线外还要增
加RI(22 号)和DTR(20 号)两个信号线进行联络,如图1 所示。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 8 -
图 1
DSR、DTR:数传机(DCE)准备好、数据终端(DTE)准备好,只表示设备本身可用。
首先,通过电话机拔号呼叫对方,电话交换台向对方发出拔号呼叫信号,当对方DCE
收到该信号后,使RI(振铃信号)有效,通知DTE,已被呼叫。当对方“摘机”后,两方建
立了通信链路。
若计算机要发送数据至对方,首先通过接口电路(DTE)发出RTS(请求发送)信号。
此时,若DCE(Modem)允许传送,则向DTE 回答CTS(允许发送)信号。一般可直接将RTS/CTS
接高电平,即只要通信链路已建立,就可传送信号。(RTS/CTS 可只用于半双工系统中作发
送方式和接收方式的切换。
当 DTE 获得CTS 信号后,通过TXD 线向DCE 发出串行信号,DCE(Modem)将这些数字
信号调制成模拟信号(又称载波信号),传向对方。
计算机向DTE“数据输出寄存器”传送新的数据前,应检查Modem状态和数据输出寄存
器为空。当对方的DCE收到载波信号后,向对方的DTE 发出DCD 信号(数据载波检出),通
知其DTE 准备接收,同时,将载波信号解调为数据信号,从RXD线上送给DTE,DTE通过串
行接收移位寄存器对接收到的位流进行移位,当收到1 个字符的全部位流后,把该字符的数
据位送到数据输入寄存器,CPU 可以从数据输入寄存器读取字符。
2、采用专用电话线通信:在通信双方的MODEM 之间采用电话线进行通信,则只要使用
2~8 号信号线进行联络与控制。不需要电话机、振铃信号RI 和DTR 信号,其信号线的连接
如图2 那样。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 9 -
图2
二、近距离通信:
当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用
少数几根信号线。最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根
线(发送线、接收线、信号地线)便可实现全双工异步串行通信,即是这里要讨论的第一种
情况。
无 Modem 时,最大通信距离按如下方式计算:
RS-232C 标准规定:当误码率小于4%时,要求导线的电容值应小于2500PF。对于普通
导线,其电容值约为170PF/M。则允许距离L=2500PF/(170PF/M)=15M
这一距离的计算,是偏于保守的,实际应用中,当使用9600bps,普通双绞屏蔽线时,
距离可达30~35米。
1、零Modem 的最简连线(3 线制)
图 3 是零MODEM 方式的最简单连接(即三线连接),图中的2 号线与3 号线交叉连接
是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。在这种方
式下,通信双方的任何一方,只要请求发送RTS 有效和数据终端准备好DTR 有效就能开始发
送和接收。
图 3
(1)RTS 与CTS 互联:只要请求发送,立即得到允许
(2)DTR 与DSR互联:只要本端准备好,认为本端立即可以接收(DSR、数传机准备好)。
2、零Modem标准连接:
如果想在直接连接时,而又考虑到RS-232C的联络控制信号,则采用零MODEM方式的
标准连接方法,其通信双方信号线安排如下1-2-3-4-5顺序所演示的那样。
无 Modem 的标准联线(7 线制)如图所示:
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 10 -
从中可以看出,RS-232C 接口标准定义的所有信号线都用到了,并且是按照DTE和DCE
之间信息交换协议的要求进行连接的,只不过是把DTE 自己发出的信号线送过来,当作对方
DCE 发来的信号,因此,又把这种连接称为双叉环回接口。
双方的握手信号关系如下(注:甲方乙方并未在图中标出):
(1)当甲方的DTE 准备好,发出
DTR 信号,该信号直接联至乙方的RI(振
铃信号)和DSR(数传机准备好)。即
只要甲方准备好,乙方立即产生呼叫
(RI)有效,并同时准备好(DSR)。尽
管此时乙方并不存在DCE(数传机)。
(2)甲方的RTS 和CTS 相连,并
与乙方的DCD 互连。即:一旦甲方请求
发送(RTS),便立即得到允许(CTS),
同时,使乙方的DCD有效,即检测到载
波信号。
(3)甲方的TXD 与乙方的RXD相
连,一发一收。
1
2
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 11 -
3
4
5
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 12 -
串口通信基本接线方法
目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆
线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且
常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232
相连,以回答前段网友的咨询。
1.DB9和DB25的常用信号脚说明
9针串口(DB9) 25针串口(DB25)
针号功能说明缩写 针号功能说明缩写
1 数据载波检测DCD 8 数据载波检测DCD
2 接收数据RXD 3 接收数据RXD
3 发送数据TXD 2 发送数据TXD
4 数据终端准备DTR 20 数据终端准备DTR
5 信号地GND 7 信号地GND
6 数据设备准备好DSR 6 数据准备好DSR
7 请求发送RTS 4 请求发送RTS
8 清除发送CTS 5 清除发送CTS
9 振铃指示DELL 22 振铃指示DELL
2.RS232C串口通信接线方法(三线制)
首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相
连,两个串口相连或一个串口和多个串口相连
· 同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连;
· 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)
9针-9针25针-25针9针-25针
2 3 3 2 2 2
3 2 2 3 3 3
5 5 7 7 5 7
上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住
一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接。
3.串口调试中要注意的几点:
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 13 -
· 不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必
须通过转换器才能连接;
· 线路焊接要牢固,不然程序没问题,却因为接线问题误事;
· 串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;
· 强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。
串口通讯的概念及接口电路
随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。这里所说的通信是只计算机与
外界的信息交换。因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由
于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信
息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部
设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,
采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微
机应用系统常用的接口。
许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送
方式,实际上,CPU与接口之间仍按并行方式工作。
1 串行通信的概念
图1-1
所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据
在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。如图1-1所示。这种
通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须
要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。典型的串行接口的结构如1-2所
示。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 14 -
图1-2
在数据输入过程中,数据1位1位地从外设进入接口的“接收移位寄存器”,当“接收移位寄存器”
中已接收完1个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输
入寄存器”中读取接收到的字符。(并行读取,即D7~D0同时被读至累加器中)。“接收移位寄存器”的
移位速度由“接收时钟”确定。
在数据输出过程中,CPU把要输出的字符(并行地)送入“数据输出寄存器”,“数据输出寄存器”
的内容传输到“发送移位寄存器”,然后由“发送移位寄存器”移位,把数据1位1位地送到外设。“发
送移位寄存器”的移位速度由“发送时钟”确定。
接口中的“控制寄存器”用来容纳CPU送给此接口的各种控制信息,这些控制信息决定接口的工作方
式。
“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种
错误。例如,用状态寄存器的D5位为“1”表示“数据输出寄存器”空,用D0位表示“数据输入寄存器满”,
用D2位表示“奇偶检验错”等。
能够完成上述“串<- ->并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal
Asynchronous Receiver and Transmitter),典型的芯片有:Intel 8250/8251,16550。
有关 RS232 和RS485 接口的问答
什么是RS-232-C接口?采用RS-232-C接口有何特点?传输电缆长度如何考虑?
答: 计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通
讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。在
串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。 RS-232-C
接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)
联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数
据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”该标准规定采用一个
25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。
(1)接口的信号内容实际上RS-232-C的25条引线中有许多是很少使用的,在计算机与终端通讯中一般
只使用3-9条引线。RS-232-C最常用的9条引线的信号内容见附表1所示
(2)接口的电气特性在RS-232-C中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”,-5— -15V;
逻辑“0” +5— +15V 。噪声容限为2V。即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V
的信号作为逻辑“1” 附表1
引脚序号信号名称符号流向功能
2 发送数据TXD DTE→DCE DTE发送串行数据
3 接收数据RXD DTE←DCE DTE接收串行数据
4 请求发送RTS DTE→DCE DTE请求DCE将线路切换到发送方式
5 允许发送CTS DTE←DCE DCE告诉DTE线路已接通可以发送数据
6 数据设备准备好DSR DTE←DCE DCE准备好
7 信号地信号公共地
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 15 -
8 载波检测DCD DTE←DCE 表示DCE接收到远程载波
20 数据终端准备好DTR DTE→DCE DTE准备好
22 振铃指示RI DTE←DCE 表示DCE与线路接通,出现振铃
(3) 接口的物理结构 RS-232-C接口连接器一般使用型号为DB-25的25芯插头座,通常插头在DCE端,插座
在DTE端. 一些设备与PC机连接的RS-232-C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发
送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。
(4)传输电缆长度由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50英尺,其实
这个4%的码元畸变是很保守的,在实际应用中,约有99%的用户是按码元畸变10-20%的范围工作的,所以
实际使用中最大距离会远超过50英尺,美国DEC公司曾规定允许码元畸变为10%而得出附表2 的实验结果。
其中1号电缆为屏蔽电缆,型号为DECP.NO.9107723 内有三对双绞线,每对由22# AWG 组成,其外覆以屏
蔽网。2号电缆为不带屏蔽的电缆。型号为DECP.NO.9105856-04是22#AWG的四芯电缆。附表2 DEC 公司
的实验结果
波特率1 号电缆传输距离(英尺) 2 号电缆传输距离(英尺)
110 5000 3000
300 5000 3000
1200 3000 3000
2400 1000 500
4800 1000 250
9600 250 250
2. 什么是RS-485接口?它比RS-232-C接口相比有何特点?
答: 由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点:
(1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路
方能与TTL电路连接。
(2) 传输速率较低,在异步传输时,波特率为20Kbps。
(3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,
所以抗噪声干扰性弱。
(4) 传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。
针对RS-232-C的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:
1. RS-485的电气特性:逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两线间的电压差为
-(2—6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平
兼容,可方便与TTL 电路连接。
2. RS-485的数据最高传输速率为10Mbps
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 16 -
3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
4. RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只
允许连接1个收发器, 即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站
能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。
因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接
口。因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。RS485
接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485
采用DB-9(针)。
3. 采用RS485接口时,传输电缆的长度如何考虑?
答: 在使用RS485接口时,对于特定的传输线经,从发生器到负载其数据信号传输所允许的最大电缆长度
是数据信号速率的函数,这个长度数据主要是受信号失真及噪声等影响所限制。下图所示的最大电缆长度
与信号速率的关系曲线是使用24AWG 铜芯双绞电话电缆(线径为0.51mm),线间旁路电容为52.5PF/M,
终端负载电阻为100欧时所得出。(曲线引自GB11014-89附录A)。由图中可知,当数据信号速率降低
到90Kbit/S以下时,假定最大允许的信号损失为6dBV时, 则电缆长度被限制在1200M。实际上,图中的
曲线是很保守的,在实用时是完全可以取得比它大的电缆长度。当使用不同线径的电缆。则取得的最大
电缆长度是不相同的。例如:当数据信号速率为600Kbit/S 时,采用24AWG 电缆,由图可知最大电缆长
度是200m,若采用19AWG电缆(线径为0。91mm)则电缆长度将可以大于200m; 若采用28AWG 电缆(线
径为0。32mm)则电缆长度只能小于200m。
同步通信方式
1、同步通信方式的特点:
采用同步通信时,将许多字符组成一个信息组,这样,字符可以一个接一个地传输,
但是,在每组信息(通常称为帧)的开始要加上同步字符,在没有信息要传输时,要填上空
字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5~8 位。当然,
对同一个传输过程,所有字符对应同样的数位,比如说n 位。这样,传输时,按每n位划分
为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字
符。
同步传输时,一个信息帧中包含许多字符,每个信息帧用同步字符作为开始,一般将
同步字符和空字符用同一个代码。在整个系统中,由一个统一的时钟控制发送端的发送和空
字符用同一个代码。接收端当然是应该能识别同步字符的,当检测到有一串数位和同步字符
相匹配时,就认为开始一个信息帧,于是,把此后的数位作为实际传输信息来处理。
2、面向字符的同步协议(IBM的BSC协议)
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 17 -
该协议规定了10 个特殊字符(称为控制字符)作为信息传输的标志。其格式为
SYN SOH 标题 STX 数据块 ETB/ETX 块校验
SYN:同步字符(Synchronous character),每帧可加1 个(单同步)或2 个(双
同步)同步字符。
SOH:标题开始(Start of Header)。
标题:Header,包含源地址(发送方地址)、目的地址(接收方地址)、路由指
示。
STX:正文开始(Start of Text)。
数据块:正文(Text),由多个字符组成。
ETB:块传输结束(end of transmission block), 标识本数据块结束。
ETX:全文结束(end of text),(全文分为若干块传输)。
块校验:对从SOH 开始,直到ETB/ETX字段的检验码。
3、面向bit 的同步协议(ISO的HDLC)
一帧信息可以是任意位,用位组合标识帧的开始和结束。帧格式为:
F 场A 场 C场 I场FC 场 F场
F 场:标志场;作为一帧的开始和结束,标志字符为8位,01111110。
A 场:地址场,规定接收方地址,可为8 的整倍位。接收方检查每个地址字节的
第1 位,如果为“0”,则后边跟着另一
个地址字节。若为“1”,则该字节为最后一个地址字节。
C 场:控制场。指示信息场的类型,8 位或16 位。若第1 字节的第1 位为0,则
还有第2 个字节也是控制场。
I 场:信息场。要传送的数据。
FC 场:帧校验场。16位循环冗余校验码CRC。除F 场和自动插入的“0”位外,
均参加CRC计算。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 18 -
4、同步通信的“0位插入和删除技术”
在同步通信中,一帧信息以一个(或几个)特殊字符开始,例如,F 场=01111110B。
但在信息帧的其他位置,完全可能出现这些特殊字符,为了避免接收方把这些特殊字
符误认为帧的开始,发送方采用了“0位插入技术”,相应地,接收方采用“0 位删除技术”。
发送方的0位插入:除了起始字符外,当连续出现5个1 时,发送方自动插入一个0。
使得在整个信息帧中,只有起始字符含有连续的6 个1。
接收方的“0位删除技术”:接收方收到连续6 个1,作为帧的起始,把连续出现5 个
1 后的0 自动删除。
5、同步通信的“字节填充技术”
设需要传送的原始信息帧为:
SOT DATA EOT
节填充技术采用字符替换方式,使信息帧的DATA 中不出现起始字符SOT和结束字符
EOT。
设按下表方式进行替换:
DATA 中的原字符替换为
SOT ESC X
EOT ESC Y
ESC ESC Z
其中,ESC=1AH,X、Y、Z 可指定为任意字符(除SOT、EOT、ESC外)。
发送方按约定方式对需要发送的原始帧进行替换,并把替换后的新的帧发送给接收方。
例如图所示:
接收方按约定方式进行相反替换,可以获得原始帧信息。
6、异步通信和同步通信的比较
(1)异步通信简单,双方时钟可允许一定误差。同步通信较复杂,双方时钟的允许误
差较小。
(2)异步通信只适用于点<--> 点,同步通信可用于点<--> 多。
(3)通信效率:异步通信低,同步通信高。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 19 -
通信协议
所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、
传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因
此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链
路层。
目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向
比特以及面向字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系
结构中。
一、物理接口标准
1.串行通信接口的基本任务
(1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实
现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧
数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。
(2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是
并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入
计算机处理。因此串并转换是串行接口电路的重要任务。
(3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选
择和控制的能力。
(4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他
校验码。在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。
(5)进行TTL 与EIA电平转换:CPU 和终端均采用TTL电平及正逻辑,它们与EIA采
用的电平及负逻辑不兼容,需在接口电路中进行转换。
(6)提供EIA-RS-232C 接口标准所要求的信号线:远距离通信采用MODEM 时,需要9
根信号线;近距离零MODEM 方式,只需要3 根信号线。这些信号线由接口电路提供,以便与
MODEM 或终端进行联络与控制。
2、串行通信接口电路的组成
为了完成上述串行接口的任务,串行通信接口电路一般由可编程的串行接口芯片、波
特率发生器、EIA 与TTL 电平转换器以及地址译码电路组成。其中,串行接口芯片,随着大
规模继承电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,如下
表所示。它们的基本功能是类似的,都能实现上面提出的串行通信接口基本任务的大部分工
作,且都是可编程的。才用这些芯片作为串行通信接口电路的核心芯片,会使电路结构比较
简单。
同步(USRT) 传输速率b/s
芯片
面向字

HDLC
异步(UART)(起止式)
同步 异步
INS8250 56K
MC6850 1M
MC6852 1.5M
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 20 -
MC6854 1.5M
Int8251A 64K 19.2K
Int8273 64K
Z-80 SIO 800K
3.有关串行通信的物理标准
为使计算机、电话以及其他通信设备互相沟通,现在,已经对串行通信建立了几个一
致的概念和标准,这些概念和标准属于三个方面:传输率,电特性,信号名称和接口标准。
1、传输率:所谓传输率就是指每秒传输多少位,传输率也常叫波特率。国际上规定了
一个标准波特率系列,标准波特率也是最常用的波特率,标准波特率系列为110、300、600、
1200、4800、9600 和19200。大多数CRT 终端都能够按110 到9600范围中的任何一种波特
率工作。打印机由于机械速度比较慢而使传输波特率受到限制,所以,一般的串行打印机工
作在110 波特率,点针式打印机由于其内部有较大的行缓冲区,所以可以按高达2400波特
的速度接收打印信息。大多数接口的接收波特率和发送波特率可以分别设置,而且,可以通
过编程来指定。
2、RS-232-C标准:RS-232-C 标准对两个方面作了规定,即信号电平标准和控制信号
线的定义。RS-232-C 采用负逻辑规定逻辑电平,信号电平与通常的TTL电平也不兼容,
RS-232-C 将-5V~-15V 规定为“1”,+5V~+15V规定为“0”。图1是TTL 标准和RS-232-C
标准之间的电平转换。
图 1
二、软件协议
1.OSI协议和TCP/IP协议
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 21 -
图 2
(1)OSI 协议
OSI 七层参考模型不是通讯标准,它只给出一个不会由于技术发展而必须修改的稳定模
型,使有关标准和协议能在模型定义的范围内开发和相互配合。
一般的通讯协议只符合OSI 七层模型的某几层,如: EIA-RS-232-C:实现了物理层。
IBM 的SDLC(同步数据链路控制规程):数据链路层。ANSI 的ADCCP(先进数据通讯规程):
数据链路层IBM 的BSC(二进制同步通讯协议):数据链路层。应用层的电子邮件协议SMTP
只负责寄信、POP3 只负责收信。
(2)TCP/IP协议
实现了五层协议。
(1)物理层:对应OSI 的物理层。
(2)网络接口层:类似于OSI的数据链路层。
(3)Internet 层:OSI 模型在Internet 网使用前提出,未考虑网间连接。
(4)传输层:对应OSI 的传输层。
(5)应用层:对应OSI 的表示层和应用层。
2.串行通信协议
串行通信协议分同步协议和异步协议。
(1)异步通信协议的实例——起止式异步协议
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 22 -
图 3
特点与格式:
起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开
始,以停止位结束,字符之间没有固定的时间间隔要求。其格式如图3 所示。每一个字符的
前面都有一位起始位(低电平,逻辑值0),字符本身有5~7 位数据位组成,接着字符后
面是一位校验位(也可以没有校验位),最后是一位,或意味半,或二位停止位,停止位后
面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开
始处一定有一个下跳沿。
从图中可以看出,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为
起始式协议。传送时,数据的低位在前,高位在后,图4 表示了传送一个字符E 的ASCAII
码的波形1010001。当把它的最低有效位写到右边时,就是E 的ASCII码1000101=45H。
图 4
起/止位的作用:起始位实际上是作为联络信号附加进来的,当它变为低电平时,告
诉收方传送开始。它的到来,表示下面接着是数据位来了,要准备接收。而停止位标志一个
字符的结束,它的出现,表示一个字符传送完毕。这样就为通信双方提供了何时开始收发,
何时结束的标志。传送开始前,发收双方把所采用的起止式格式(包括字符的数据位长度,
停止位位数,有无校验位以及是奇校验还是偶校验等)和数据传输速率作统一规定。传送开
始后,接收设备不断地检测传输线,看是否有起始位到来。当收到一系列的“1”(停止位
或空闲位)之后,检测到一个下跳沿,说明起始位出现,起始位经确认后,就开始接收所规
定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼装成一个并行字
节,并且经校验后,无奇偶错才算正确的接收一个字符。一个字符接收完毕,接收设备有继
续测试传输线,监视“0”电平的到来和下一个字符的开始,直到全部数据传送完毕。
由上述工作过程可看到,异步通信是按字符传输的,每传输一个字符,就用起始位来
通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,
这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所
以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加
位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小
于19.2kbit/s)。在高速传送时,一般要采用同步协议。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 23 -
(2)面向字符的同步协议
特点与格式:这种协议的典型代表是IBM公司的二进制同步通信协议(BSC)。它的特
点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10 个字符作
为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由
于被传送的数据块是由字符组成,故被称作面向字符的协议。
特定字符(控制字符)的定义:由上面的格式可以看出,数据块的前后都加了几个特
定字符。SYN是同步字符(synchronous Character),每一帧开始处都有SYN,加一个SYN
的称单同步,加两个SYN的称双同步设置同步字符是起联络作用,传送数据时,接收端不断检
测,一旦出现同步字符,就知道是一帧开始了。接着的SOH 是序始字符(Start Of Header),
它表示标题的开始。标题中包括院地址、目的地址和路由指示等信息。STX是文始字符(Start
Of Text),它标志着传送的正文(数据块)开始。数据块就是被传送的正文内容,由多个
字符组成。数据块后面是组终字符ETB(End Of Transmission Block)或文终字符ETX(End
Of Text),其中ETB用在正文很长、需要分成若干个分数据块、分别在不同帧中发送的场合,
这时在每个分数据块后面用文终字符ETX。一帧的最后是校验码,它对从SOH 开始到ETX(或
ETB)字段进行校验,校验方式可以是纵横奇偶校验或CRC。另外,在面向字符协议中还采
用了一些其他通信控制字,它们的名称如下表所示:
名 称 ASCII EBCDIC
序始(SOH) 0000001 00000001
文始(STX) 0000010 00000010
组终(ETB) 0010111 00100110
文终(ETX) 0000011 00000011
同步(SYN) 0010110 00110010
送毕(EOT) 0000100 00110111
询问(ENQ) 0000101 00101101
确认(ACK) 0000110 00101110
否认(NAK) 0010101 00111101
转义(DLE) 0010000 00010000
数据透明的实现:面向字符的同步协议,不象异步起止协议那样,需要在每个字符前
后附加起始和停止位,因此,传输效率提高了。同时,由于采用了一些传输控制字,故增强
了通信控制能力和校验功能。但也存在一些问题,例如,如何区别数据字符代码和特定字符
代码的问题,因为在数据块中完全有可能出现与特定字符代码相同的数据字符,这就会发生
误解。比如正文有个与文终字符ETX 的代码相同的数据字符,接收端就不会把它当作为普通
数据处理,而误认为是正文结束,因而产生差错。因此,协议应具有将特定字符作为普通数
据处理的能力,这种能力叫做“数据透明”。为此,协议中设置了转移字符DLE(Data Link
Escape)。当把一个特定字符看成数据时,在它前面要加一个DLE,这样接收器收到一个DLE
就可预知下一个字符是数据字符,而不会把它当作控制字符来处理了。DLE 本身也是特定字
符,当它出现在数据块中时,也要在它前面加上另一个DLE。这种方法叫字符填充。字符填
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 24 -
充实现起来相当麻烦,且依赖于字符的编码。正是由于以上的缺点,故又产生了新的面向比
特的同步协议。
(3)面向比特的同步协议
特点与格式:面向比特的协议中最具有代表性的是IBM的同步数据链路控制规程SDLC
(Synchronous Data Link Control),国际标准化组织ISO(International Standard
Organization)的高级数据链路控制规程HDLC(High Level Data link Control),美国国
家标准协会(Americal National Standard Institute)的先进数据通信规程ADCCP(Advanced
Data Communication Control Procedure)。这些协议的特点是所传输的一帧数据可以是任
意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面
向比特”的协议。这中协议的一般帧格式如图5所示:
图 5
帧信息的分段:由图5 可见,SDLC/HDLC的一帧信息包括以下几个场(Filed),所有场
都是从有效位开始传送。
(1)SDLC/HDLC 标志字符:SDLC/HDLC协议规定,所有信息传输必须以一个标志字符
开始,且以同一个字符结束。这个标志字符是01111110,称标志场(F)。从开始标志到结
束标志之间构成一个完整的信息单位,称为一帧(Frame)。所有的信息是以帧的形传输的,
而标志字符提供了每一帧的边界。接收端可以通过搜索“01111110”来探知帧的开头和结
束,以此建立帧同步。
(2)地址场和控制场:在标志场之后,可以有一个地址场A(Address)和一个控制场
C(Control)。地址场用来规定与之通信的次站的地址。控制场可规定若干个命令。SDLC规
定A 场和C场的宽度为8 位或16 位。接收方必须检查每个地址字节的第一位,如果为“0”,
则后面跟着另一个地址字节;若为“1”,则该字节就是最后一个地址字节。同理,如果控
制场第一个字节的第一位为为“0”,则还有第二个控制场字节,否则就只有一个字节。
(3)信息场:跟在控制场之后的是信息场I(Information)。I 场包含有要传送的数据,
并不是每一帧都必须有信息场。即数据场可以为0,当它为0 时,则这一帧主要是控制命令。
(4)帧校验信息:紧跟在信息场之后的是两字节的争校验,帧校验场称为FC(Frame
Check)场或称为帧校验序列FCS(Frame check Squence)。SDLC/HDLC 均采用16 位循环冗余
校验码CRC(Cyclic Redundancy Code)。除了标志场和自动插入的“0”以外,所有的信息
都参加CRC计算。
实际应用时的两个技术问题:
(1)“0”位插入/删除:如上所述,SDLC/HDLC协议规定以01111110为标志字节,但
在信息场中也完全有可能有同一种模式的字符,为了把它与标志区分开来,所以采取了“0”
位插入和删除技术。具体作法是发送端在发送所有信息(除标志字节外)时,只要遇到连续
5 个“1”,就自动插入一个“0”,当接收端在接收数据时(除标志字节)如果连续收到5
个“1”,就自动将其后的一个“0”删除是,以恢复信息的原有形式。这种“0”位的插入
和删除过程是由硬件自动完成的。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 25 -
(2)SDLC/HDLC异常结束:若在发送过程中出现错误,则SDLC/HDLC协议常用异常结束(Abort)
字符,或称为失效序列使本帧作废。在HDLC规程中,7 个连续的“1”被作为失效字符,而
在SDLC 中失效字符是8 个连续的“1”。当然在试销序列中不使用“0”位插入/删除技术。
SDLC/HDLC 协议规定,在一帧之内不允许出现数据间隔。在两帧之间,发送器可以连续输出
标志字符序列,也可以输出连续的高电平,它被称为空闲(Idle)信号。
实战串行通讯
本文不是全面的讲述如何编写串行通讯程序,而是讨论一些实际遇到的问题。
1 选择通讯方式-- 同步还是非同步
正如在《Serial communications in Microsoft Win32》等文章中提到的,同步
(NonOverLapped)方式是比较简单的一种方式,编写起来代码的长度要明显少于异步
(OverLapped)方式,我开始用同步方式编写了整个子程序,在Windows98 下工作正常,
但后来在 Windows2000 下测试,发现接收正常,但一发送数据,程序就会停在那里,原因
应该在于同步方式下如果有一个通讯 Api 在操作中,另一个会阻塞直到上一个操作完成,
所以当读数据的线程停留在 WaitCommEvent 的时候,WriteFile 就停在那里。我又测试了
我手上所有有关串行通讯的例子程序,发现所有使用同步方式的程序在 Windows 2000 下全
部工作不正常,对这个问题我一直找不到解决的办法,后来在Iczelion 站点上发现一篇文
章提到 NT 下对串行通讯的处理和 9x 有些不同,根本不要指望在 NT 或Windows 2000 下
用同步方式同时收发数据,我只好又用异步方式把整个通讯子程序重新写了一遍。
所以对于这个问题的建议是:如果程序只打算工作在 Win9x 下,为了简单起见,可以用同
步方式写程序,如果程序打算在 NT 下也可以工作的话,就必须用异步方式写。
2 Win32 通讯 API Bug 之一--- CommConfigDialog
CommConfigDialog 是弹出系统内置串口设置对话框的 API,我们在设备管理器中设置串口
参数的对话框就是这个,使用这个API 时不用先打开端口,它并不针对一个已打开的端口,
而是仅仅是把 DCB 的内容填写到对话框中,当按了 OK 后把输入的结果存回到DCB 数据结
构中,至于什么时候把结果设置到串口上,那就是你自己要做的事情了。
CommCinfigDialog 的定义如下:
BOOL CommConfigDialog(
LPTSTR lpszName, // pointer to device name string
HWND hWnd, // handle to window
LPCOMMCONFIG lpCC // pointer to comm. configuration structure
);
但在使用中发现,对话框有时能出来,有时出不来,最后总结的经验是问题出在 COMMCONFIG
结构的 dwSize 字段上,COMMCONFIG 的定义如下:
typedef struct _COMM_CONFIG {
DWORD dwSize;
WORD wVersion;
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 26 -
WORD wReserved;
DCB dcb;
DWORD dwProviderSubType;
DWORD dwProviderOffset;
DWORD dwProviderSize;
WCHAR wcProviderData[1];
} COMMCONFIG, *LPCOMMCONFIG;
在参数中,wVersion 要填 100h,dwProviderSubType 要填 1,但dwSize 就不能填sizeof
COMMCONFIG 了,我发现好象一定要把dwSize 设置为比 sizeof COMMCONFIG 对话框才能出
来,所以我用的代码中定义了一个足够大的缓冲区作为结构的地址:
_CommConfigDialog proc
local @stCC[256]:BYTE
pushad
invoke RtlZeroMemory,addr @stCC,sizeof @stCC
mov (COMMCONFIG ptr @stCC).dwSize,256
mov (COMMCONFIG ptr @stCC).wVersion,100h
mov (COMMCONFIG ptr @stCC).dwProviderSubType,1
invoke CommConfigDialog,addr [esi].szPortName,[esi].hWnd,addr @stCC
popad
ret
_CommConfigDialog endp
3 Win32 通讯 API Bug 之二--- BuildCommDCB
BuildCommDCB 的功能是把一个字符串如com1:9600,n,8,1 这样的转换到具体的数据填写到
DCB 中,但使用中也存在问题,我发现我用它转换象 com1:9600,e,7,1 之类的带校验位的
字符串,它总是无法把这个e 给我转换过去,设置好串口一看,成了 9600,n,7,1,而上面
提到的 CommConfigDialog 返回的结果用来设置串口却是正确的,经过比较,发现问题出在
DCB.fbits.fParity 这个 bit 上,只有把这个bit 置 1,校验位才是有效的,而
BuildCommDCB 恰恰是漏了这个 bit,所有如果你要使用 BuildCommDCB,别忘了补充把
DCB.fbits.fParity 设置回去,我用的代码是:
_BuildCommDCB proc _lpszPara,_lpstDCB
pushad
mov esi,_lpstDCB
assume esi:ptr DCB
invoke RtlZeroMemory,esi,sizeof DCB
invoke BuildCommDCB,_lpszPara,esi
;********************************************************************
; 根据校验位补充设置 DCB 中的 DCB.fbits.fParity 字段
;********************************************************************
mov dword ptr [esi].fbits,0010b
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 27 -
cld
@@:
lodsb
or al,al
jz @F
cmp al,'='
jz _BCD_Check
cmp al,','
jnz @B
_BCD_Check:
lodsb
or al,al
jz @F
or al,20h
cmp al,'n'
jnz @B
;********************************************************************
; 扫描到 =n 或 ,n 则取消校验位
;********************************************************************
mov esi,_lpstDCB
and dword ptr [esi].fbits,not 0010b
@@:
popad
ret
_BuildCommDCB endp
4 Win32 通讯编程的一般流程
由于同步方式相对比较简单,在这里讲述的是异步方式的流程,在其他的很多文章里提到了
Windows 通讯 API 有二十多个,它们是:
BuildCommDCB
BuildCommDCBAndTimeouts
ClearCommBreak
ClearCommError
CommConfigDialog
EscapeCommFunction
GetCommConfig
GetCommMask
GetCommModemStatus
GetCommProperties
GetCommState
GetCommTimeouts
GetDefaultCommConfig
PurgeComm
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 28 -
SetCommBreak
SetCommConfig
SetCommMask
SetCommState
SetCommTimeouts
SetDefaultCommConfig
SetupComm
TransmitCommChar
WaitCommEvent
我刚看到这些 API 的时候,都不知道如何使用它们,但并不是所有这些 API 都是必须用的,
比如说你要检测当前串口的设置可以只用 SetCommState 而不用GetCommProperties 和
GetCommConfig,虽然它们返回的信息可能更多。同样,如果有些值你想用缺省的,比如缓
冲区的大小和超时的时间等等,那么 SetupComm 和BuildCommDCBAndTimeouts、
SetCommTimeouts 也可以不用,TransmitCommChar 是马上在发送序列中优先插入发送一个
字符用的,平时也很少用到,下面讲的是必须用到的 API 和使用步骤:
1. 建立 Event -- 用 CreateEvent
invoke CreateEvent,NULL,TRUE,FALSE,NULL
用异步方式操作串口必须要定义OVERLAPPED 结构,其中的 hEvent 必须自己建立,你要定义两
个 OVERLAPPED 结构,一个用于读一个用于写,当然也必须建立两个 Event,把它们放入
OVERLAPPED.hEvent
2. 打开串口-- 用 CreateFile
invoke CreateFile,addr szPortName,GENERIC_READ or
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL
注意用异步方式必须指定 FILE_FLAG_OVERLAPPED,而文件方式必须 OPEN_EXISTING,读写必须是
GENERIC_READ or GENERIC_WRITE
3. 设置串口参数-- 用 SetCommState
invoke SetCommState,hCom,addr dcbx
hCom 是前面打开成功后返回的句柄,dcbx 是数据结构DCB,里面包括了通讯的具体参数,至于
这个参数的建立,你可以自己填写,也可以用前面提到的BuildCommDCB 或CommConfigDialog 填

4. 建立读数据的线程
到这里,就可以开始读数据了,一般我们是在主线程中写数据,因为写是我们可以控制的,而读
的时候我们不知道数据什么时候会到,所以要建立一个线程专门用来读数据,在这个线程中,我
们循环地用 ReadFile 读串口,同时用 WaitCommEvent 检测线路状态。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 29 -
5. 如果要检测通讯状态,如 CTS 信号,RingIn 等等-- 用 SetCommMask、WaitCommEvent、
ClearCommError、GetCommModemStatus
invoke SetCommMask,hCom,EV_BREAK or EV_CTS or EV_DSR or EV_ERR or EV_RING or EV_RLSD or
EV_RXCHAR or EV_RXFLAG or EV_TXEMPTY
SetCommMask 指定WaitCommEvent 要等待的事件名称,具体的参数请查手册
invoke WaitCommEvent,hCom,addr dwEvent,NULL
WaitCommEvent 等待一直到SetCommMask 指定事件之一发生
invoke ClearCommError,hCom,addr dwError,addr stComStat
在 WaitCommEvent 以后,要用ClearCommError 清除事件的Flag,以便进行下一轮
WaitCommEvent,同时这个API 可以获得更详细的事件信息
invoke GetCommModemStatus,hCom,addr dwModemStatus
同样,GetCommModemStatus 是用来获得串口线路状态的,如CTS、RING 等等,当 WaitCommEvent
返回时,只是指出了如CTS 等等状态有变化,但具体是变成On 还是Off 了还要靠这个 API 去
取得更详细的信息
6. 读数据-- 用 ReadFile
invoke ReadFile,hCom,addr szBuffer,sizeof szBuffer,addr dwBytesRead,addr stReadState
最后一个参数是开头定义的OVERLAPPED 结构的地址,指定了它就表示是用异步方式的读方式,
这个API 会马上返回,接下去要用
invoke GetOverlappedResult,hCom,addr stReadState,addr dwBytesRead,FALSE
将其余的数据读完
7. 结束时关闭端口-- 停止 WaitCommEvent 的等待以及关闭端口 CloseHandle
平时程序会停留在WaitCommEvent 的等待中,当要终止线程的时候,必须是程序从
WaitCommEvent 中退出来,这时候要用
按照 Win32 手册上的说明,参数为 NULL 的SetCommMask 会使另一个线程中的 WaitCommEvent 马
上返回,然后就是用 CloseHandle 关闭端口
invoke CloseHandle,hCom
5 Win32 通讯 API Bug 之二--- SetCommMask 和 WaitCommEvent
严格的说这不应该是Bug,而是偶然的情况,我发现有些时候我的读线程无法结束,跟踪发
现是停在了WaitCommEvent 上,这说明有时候invoke SetCommMask,hCom,NULL 并不能使
WaitCommEvent 退出,我最后使用的办法是: 在 SetCommMask 以后再执行 invoke
SetEvent,stReadState.hEvent,把读的 OVERLAPPED 结构中的Event 置位,让
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 30 -
WaitCommEvent 认为有 Event 发生,它就会马上返回,也许这并不是普遍的情况,但如果
你的程序也是停在了WaitCommEvent 的地方,不妨一试。
6 如何编写读线程中的循环
按照《Serial communications in Microsoft Win32》一文中的例程,读循环可以用:
#define READ_TIMEOUT 500 // milliseconds
DWORD dwRes;
DWORD dwRead;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
// Create the overlapped event. Must be closed before exiting
// to avoid a handle leak.
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL)
// Error creating overlapped event; abort.
if (!fWaitingOnRead) {
// Issue read operation.
if (!ReadFile(hComm, lpBuf, READ_BUF_SIZE, &dwRead, &osReader)) {
if (GetLastError() != ERROR_IO_PENDING) // read not delayed?
// Error in communications; report it.
else
fWaitingOnRead = TRUE;
}
else {
// read completed immediately
HandleASuccessfulRead(lpBuf, dwRead);
}
}
if (fWaitingOnRead) {
dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT);
switch(dwRes)
{
// Read completed.
case WAIT_OBJECT_0:
if (!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE))
// Error in communications; report it.
else
// Read completed successfully.
HandleASuccessfulRead(lpBuf, dwRead);
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 31 -
// Reset flag so that another opertion can be issued.
fWaitingOnRead = FALSE;
break;
case WAIT_TIMEOUT:
// Operation isn't complete yet. fWaitingOnRead flag isn't
// changed since I'll loop back around, and I don't want
// to issue another read until the first one finishes.
//
// This is a good time to do some background work.
break;
default:
// Error in the WaitForSingleObject; abort.
// This indicates a problem with the OVERLAPPED structure's
// event handle.
break;
}
}
这一段程序在 98 下正常,但非常不幸的是在 Win2000 下,ReadFile 总是返回读正确,并
不返回 ERROR_IO_PENDING,使下面的WaitForSingleObject 的循环形同虚设,要命的是,
ReadFile 返回读正确却每次只读一个字节,结果程序工作得很奇怪,即使缓冲区中有很多
的字符,程序也每次只能读一个字符,要等到发送字符或做其他的操作使线路状态改变了,
才能读下一个字符,我不知道这个奇怪的现象是如何发生的,反正我解决的办法是在
ReadFile 前加 WaitCommEvent,真正等到 EV_RXCHAR 以后才去ReadFile,到最后,我用
的循环是这样的,虽然没有一篇文章中的例子是这样的,但它却同时在 windows9x 和
windows2000 下工作得很好:
.while dwFlag & IF_CONNECT
;********************************************************************
; 检测其它的通信事件
; 如果检测到且定义了 lpProcessEvent 则调用 lpProcessEvent
;********************************************************************
invoke WaitCommEvent,hCom,addr @dwEvent,NULL ;addr stReadState
push eax
invoke ClearCommError,hCom,addr @dwError,addr @stComStat
pop eax
.if eax == 0
invoke GetLastError
.if eax == ERROR_IO_PENDING
or dwFlag,IF_WAITING
.endif
.else
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 32 -
;这里是线路状态的处理
.endif
;********************************************************************
; 如果没有在等待异步读的过程中,则读端口
;********************************************************************
.if ! (dwFlag & IF_WAITING)
mov @dwBytesRead,0
invoke ReadFile,hCom,addr @szBuffer,sizeof @szBuffer,\
addr @dwBytesRead,addr stReadState
.if eax == FALSE
or dwFlag,IF_WAITING
invoke GetLastError
.if eax != ERROR_IO_PENDING
;这里是错误处理
.endif
.else
and dwFlag,not IF_WAITING
mov eax,@dwBytesRead
.if eax != 0
;这里是接收到的数据处理
.endif
.endif
.endif
;********************************************************************
; 如果在异步读端口中,则等待一段时间
;********************************************************************
.if dwFlag & IF_WAITING
invoke WaitForSingleObject,stReadState.hEvent,200
.if eax == WAIT_OBJECT_0
and dwFlag,not IF_WAITING
invoke GetOverlappedResult,hCom,addr stReadState,\
addr @dwBytesRead,FALSE
.if eax != 0
mov eax,@dwBytesRead
.if eax != 0
;这里是接收到的数据处理
.endif
.else
;这里是错误处理
invoke ClearCommError,hCom,addr @dwError,addr @stComStat
.endif
.else
;这里是错误处理
.endif
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 33 -
.endif
.endw
7 流控制的问题
在流控制方式为“无”和“软件控制”的情况下,基本上没有什么问题,但在“硬件控制”
下,win32 手册中说明 RTS_CONTROL_HANDSHAKE 控制方式的含义是:
Enables RTS handshaking. The driver raises the RTS line when the "type-ahead" (input)
buffer is less than one-half full and lowers the RTS line when the buffer is more
than three-quarters full. If handshaking is enabled, it is an error for the
application to adjust the line by using the EscapeCommFunction function.
也就是说,当缓冲区快满的时候 RTS 会自动 OFF 通知对方暂停发送,当缓冲区重新空出来
的时候, RTS 会自动 ON,但我发现当 RTS 变 OFF 以后即使你已经清空了缓冲区, RTS 也
不会自动的 ON,造成对方停在那里不发送了,所以,如果要用硬件流控制的话,还要在接
收后最好加上检测缓冲区大小的判断,具体是使用ClearCommError 后返回的
COMSTAT.cbInQue , 当缓冲区已经空出来的时候, 要使用invoke
EscapeCommFunction,hCom,SETRTS 重新将RTS 设置为 ON。
全双工和半双工方式
在串行通信中,数据通常是在两个站(如终端和微机)之间进行传送,按照数据流的
方向Intel Mobile Pentium III-M(Tualatin)可分成三种基本的传送方式:全双工、半双工、
和单工。但单工目前已很少采用,下面仅介绍前两种方式。
1、全双工方式(full duplex)
当数据的发送和接收分流,分别由两根不同的传输线传送时,通信双方都能在同一时
刻进行发送和接收操作,这样的传送方式就是全双工制,如图1 所示。在全双工方式下,通
信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双
工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间
延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送
器和接收器,同时,需要2 根数据线传送数据信号。(可能还需要控制线和状态线,以及地
线)。
图 1
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 34 -
比如,计算机主机用串行接口连接显示终端,而显示终端带有键盘。这样,一方面键
盘上输入的字符送到主机内存;另一方面,主机内存的信息可以送到屏幕显示。通常,往键
盘上打入1个字符以后,先不显示,计算机主机收到字符后,立即回送到终端,然后终端再
把这个字符显示出来。这样,前一个字符的回送过程和后一个字符的输入过程是同时进行的,
即工作于全双工方式。
2、半双式方式(half duplex)
若使用同一根传输线既作接收又作发送,虽然数据可以在两个方向上传送,但通信双
方不能同时收发数据,这样的传送方式就是半双工制,如图2 所示。采用半双工方式时,通
信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,
会产生时间延迟。收/发开关实际上是由软件控制的电子开关。
图 2
当计算机主机用串行接口连接显示终端时,在半双工方式中,输入过程和输出过程使
用同一通路。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在
发送到主机的同时就被送到终端上显示出来,而不是用回送的办法,所以避免了接收过程和
发送过程同时进行的情况。
目前多数终端和串行接口都为半双工方式提供了换向能力,也为全双工方式提供了两
条独立的引脚。在实际使用时,一般并不需要通信双方同时既发送又接收,像打印机这类的
单向传送设备,半双工甚至单工就能胜任,也无需倒向。
浅析 PC 机串口通讯流控制
我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控
制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,
流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。
1.流控制在串行通讯中的作用
这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,
或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发
送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决
这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可
以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 PC机中常用
的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止),下面分
别说明。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 35 -
2.硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的
RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据
流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。这种硬件握手方式的
过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标
志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑
0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS
置高电平。RTS则用来标明接收设备有没有准备好接收数据。
常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的
多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。
3.软件流控制
由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过
XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据
发送端发出XOFF 字符(十进制的19 或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF
字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON
字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源
程序中找到发送的是什么字符。
应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控
制的缺陷,而硬件流控制不会有这个问题。
顺便说明一下,有不少朋友问到,为什么不在我编写的软件串口调试助手中将流控制加进去,我最初
将这个调试工具定位在各种自动控制的串口程序调试上,经过计算和实验验证,在设置的特定采样周期内
可以完成通讯任务,就干脆不用流控制。而且在工控中您即使不懂流控制,也能编写出简单的串口通讯程
序来,就如我写的串口调试助手。
奇偶校验
串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为:
0100,0101=45H
D7 D0
由于干扰,可能使位变为1,这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,
叫“检错”。发现错误后,如何消除错误,叫“纠错”。
最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校
验或偶校验。
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
1 0110,0101
0 0110,0001
偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
1 0100,0101
0 0100,0001
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 36 -
奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),
同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。
有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等。
开发通信软件的技术与技巧
【提要】随着计算机应用领域的不断扩展,计算机之间的远程通信用得也越来越广泛,计算
机间的远程通信所使用的通信软件,在市面上可以买到,但是通用的通信软件虽然能发送和
接收文件,在许方情况下这些通信软件并不能满足实际工作的需要。本文就这一技术进行了
探讨,介绍了有关的知识和技术,并由实例分步骤说明如何进行通信软件的开发。
一、前言
本文将以VB5.0所带的通信控件MSCOMM 进行通信软件的开发,它有约30 个属性和事件
(可以从联机帮助中找到其使用资料)。本文简述它的主要属性及事件,并归类整理。
利用串行端口与调制解调器进行连接时,对于用MSCOMM 控件编制通信软件来说,只需了解
以下五根线的代号及作用。以下五根线的高电平/低电平状态分别对应MScomm 控件的相应属
性的True/False 值。
(1)DTR线:PC 发往MODEM,表示PC 机是否已准备好。
(2)RTS线:PC 发往MODEM,表示PC 机是否允许modem 发回数据.
(3)DSR线:MODEM发往PC,表示MODEM 是否已做好操作准备
(4)CTS线:MODEM发往PC,表示MODEM 是否允许发送数据
(5)CD 线:MODEM 发往PC,表示MOEDM 已经与呼叫的远方MODEM 处于连结状态
二、MSCOMM控件的属性
用 1,2,...表示串口COM1,COM2....
设置或返回联接MODEM的串口的编号
Settings
例用"19200,N,8,1"表示传输速率为19200bps,没有奇偶校验位,8 位数据位,1位停止位。
设置或返回通信参数。
Handshaking
0 没有握手协议,不考虑流量控制。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 37 -
1XON/XOFF,即在数据流中嵌入控制苻来进行流控。
2RTS/CTS,既由信号线RTS/CTS自动进行流量控制(常用)。
3 两者皆可。
设置或返回硬件握手协议,指的是PC机MODEM之间为了控制流速而约定的内部协议。
PortOpen
True/False可以打开/关闭端口。
打开或关闭端口。
OutBufferSize
传输缓冲区的字节数,如选1024。
设置或返回传输缓冲区大小。
OutPut
Variant 型变量。
向传输缓冲区写数据流。
传输文本数据时,应将String型数据放入Variant 变量,传输二进制数据(即按字节)时,应
将Byte 型数组数据放入Variant 变量
InBufferSize
接收缓冲区的字节数,如选1024。
设置或返回接收缓冲区大小。
InputMode
0 用Input 属性接收文本型数据。
1 用Input 属性接收二进制数据。
设置或返回接收数据的数据类型。
InBufferCount
Integer 型
返回接收缓冲区中已传到但还未取走的字符个数。
Input
当 InputMode 属性值为0(文本模式)时,变量中含String型数据。
当 InputMode 属性值为1(二进制模式)时,变量中含Byte 型数组数据。
将接收缓冲区中收到的数据读入变量。
DTREnabled
RTSEnabled
DSRHolding
CTSHolding
CDHolding
均取值TRUE/FALSE
用于读取或控制pc 机与modem之间的交互状态。需运用好。例如,应在读取到DSRHolding
属性值为TRUE 时再向MODEM 发出命令。应当在载波检测到以后(CDHolding 属性为TRUE)时
再向MODEM发送数据。
三、MSCOMM控件的触发事件
MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发
时机。主要有以下几个:
(1)CommEvent=1 时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)
个。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 38 -
(2)CommEvent=2 时:接收缓冲区中收到hreshold(可设置的属性值)个个字符,利用
此事件可编写接收数据的过程。
(3)CommEvent=3 时:CTS线发生变化。
(4)CommEvent=4 时:DSR线发生变化。
(5)CommEvent=5 时:CD线发生变化。
(6)CommEvent=6 时:检测到振铃信号。
另外十种情况是通信错误时产生,即错误代码。
四、通信软件程序实现
1、首先是通信参数设置,主要就是可以设置端口号,波特率,数据位,停止位,奇偶
校验位及设置硬件握手协议,这些设置较为简单。
2、向MODEM 发出DTR(已准备好)信号,如下例程:
If MSComm1.PORTOPEN Then
MSComm1.DTREnable=True
Else
MSComm1.DTREnable=False
EndIf
3、打开时向MODEM发出一些命令来设置参数,其中S0=n(n>=1)自动应答.n 为响铃次数;
E0/E1 关闭/打开命令字符回应;Q0/Q1modem 返回/不返回结果码;M0/M1关闭/打开MODEM
扬声器,例程如下:
If MSComm1.PORTOPEN Then
Do While not MSComm1.CTSHolding : loop
Outstring="ATS0=1E1Q0M0"+Chr(13)
MSComm1.Output=Outstring
End if
4、进行拨号设计,需向MODEM 发出ATDT命令,如下语句:
MSComm1.Output="ATDT"+Trim(“电话号码”)+Chr(13)
5、拨号以后发送数据文件,程序要循环等待并随时判定是否接通。如果MODEM 向PC 的回
应字符串中含有"Connect"或CDHolding属性值变为True(检测出载波),则表示已与远方
MODEM 连机了,此时可以传输数据。
程序设计发送及接收程序时,需要以下定义:
S_FILENAME = "NAME" + Chr(5) + Chr(13) + Chr(10)
S_FILELEN = "LENTH" + Chr(5) + Chr(13) + Chr(10)
S_FILESEND = "BEGIN" + Chr(5) + Chr(13) + Chr(10)
Sub OpenFileToSend() '打开一个欲发送的文件
HSend = FreeFile
Open SENDFN For Binary As hSend 'SENDFN 中含有由用户选定的要传送的文件名。
LF&=LOF(hSend) '文件长度为LF&
'开始发送文件名,文件长度,文件开始等信息字符串。
Dim Data as Vrait
Data = S_FILENAME
MSComm1.Output=Data '发出"FILENAME"文件名字串的提示信息
Data = SENDFN +Chr(13)+Chr(10)
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 39 -
MSComm1.Output=Data '发出文件名
Data = S_FILELEN
MSComm1.Output=DATA '发出"FILELEN"提示字串
Data = Trim(Str(LF&))+Chr(13)+Chr(10)
MSComm1.Output=Data '发出文件大小
Data = S_FILESTAR
MSComm1.Output=Data '发出"FILESTART"提示信息,表示下面文件开始。
Dim Sendarr() as byte '定义字节型数组
Sum=0 '记录累计发送的字节数
BSIZE=MSComm1.OutBufferSize '每次发送的块大小
ReDim Sendarr(1 To BSIZE) '重新定义读取缓冲
Do While Sum If LF&-Loc(hSend) BSIZE=LF&-Loc(hSend)
ReDim Sendarr(1 To BSIZE)
End If
Get hSend ,, SENDARR '从文件取字节放入字节数组
Sendvar=Sendarr '转放到Variant 型变量
'当CTS 线及CD 线为高电平时才可发送,否则需等待。
T=Timer+60
L:
If MSComm1.CTSHolding And MSComm1.CDHolding Then
MSComm1.Output=Sendvar '发送
Sum = Sum + BSIZE'累加计数
Else
If Timer < T Then
Go To L '循环等待
Else
Go To CLOSEFILE '等待时间超过60 秒则退出
End If
End If
'等待系统处理完
Do
RET = DoEvents()
Loop Until MSComm1.OutBufferCount = 0
Loop '循环发送完毕。
6、接收MODEM 送回的信息和数据文件,该过程是编写mscomm1控件的OnCOMM 事件的处理
程序来完成。为了接收文本类型的握手信号,通常使InputMode 属性为文本模式。当发现接
收到的字符串中有"FILESTAR"+Chr(5)+Chr(13)+Chr(10),则将InputMode属性改为二进制
模式。当文件内容接收完(由接收的字节数判断)再将InputMode 属性改为文本模式。例程
如下:
Private Static Sub MSComm1_OnComm()
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 40 -
Select Case MSComm1.CommEvent
Case comEvReceive '接收缓冲区收到Rthreshold 个字符时触发
Dim DATA As Variant
Dim N As Long
Dim SJARR() As Byte
N=MSComm1.InBufferCount '接收缓冲区字符总数
If MSComm1.InputMode=0 Then'文本模式时,将收到的数据放到字符串变量。
MSComm1.InputLen=0
DATA = Space(N)
DATA = MSComm1.Input
Else '二进制模式时,将收到的数据放到字节数组。
ReDim S JARR(1ToN)
DATA=ARR
MSComm1.InputLen=N
DATA=MSComm1.Input
End If
'其它case情况略
End Select
End Sub
7、关于接收到的数据的处理例程:
Public Static Sub HandleData (Disp As Control,N As Long,DATA As Variant)
'参数:Disp(文本框,用于显示接受数据)
'N 为本次接收到的字节数
'DATA(接收到的数据.Variant型)
If not mscomm1.InputMode=0 Then '接收的是字符串
Go To L2
End If
Disp.SelStart = Len ( Disp.Text)
Disp.SelLength = 0
Disp.SelText = DATA '显示字符数据
If InStr(1,Disp.Text,S_FILESTAR,0)=0 Then '若没有开始标志就结束此过程
ExitSub
EndIf
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0) '找文件名及文件长度
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0)
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-V_FILENAME-13))
HJS = FreeFile'打开接收文件
JSFN = Pathc+"\SJFILE\S"+Trim(Str(NO))+"_"+FN
Open JSFN For Binary As HJS
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0)
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0)
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-1)-(V_FILENAME+11))
RS232技术文摘枕善居收集整理hhttp://www.elecfans.com
- 41 -
FL = Mid(Disp.Text,V_FILELEN+11,V_FILESTAR-(V_FILELEN+10))
SENDLEN = Val(FL) '应收总字节数SENDLEN
ReDim JSARR(0 To N-1)
JSARR=DATA '将字节流放入字节型数组
Puth JS , , JSARR ' 写入已打开的接收文件
JSLEN=JSLEN+N '本次已累计收到的字节数
Close HJS
End Sub
接口技术的基本知识
CPU与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O 接
口,而后者则被称为存储器接口。存储器通常在CPU 的同步控制下工作,接口电路比较简
单;而I/O 设备品种繁多,其相应的接口电路也各不相同,因此,习惯上说到接口只是指I/O
接口。
一、I/0 接口的概念
1.接口的分类
I/O 接口的功能是负责实现CPU 通过系统总线把I/O 电路和外围设备联系在一起,按
照电路和设备的复杂程度,I/O 接口的硬件主要分为两大类:
1)I/O 接口芯片
这些芯片大都是集成电路,通过CPU 输入不同的命令和参数,并控制相关的I/O 电路
和简单的外设作相应的操作,常见的接口芯片如定时/计数器、中断控制器、DMA控制器、
并行接口等。
2)I/O 接口控制卡
有若干个集成电路按一定的逻辑组成为一个部件,或者直接与CPU 同在主板上,或是
一个插件插在系统总线插槽上。
按照接口的连接对象来分,又可以将他们分为串行接口、并行接口、键盘接口和磁盘接
口等。
2.接口的功能
由于计算机的外围设备品种繁多,几乎都采用了机电传动设备,因此,CPU在与I/O 设
备进行数据交换时存在以下问题:
速度不匹配:I/O 设备的工作速度要比CPU慢许多,而且由于种类的不同,他们之间的
速度差异也很大,例如硬盘的传输速度就要比打印机快出很多。
时序不匹配:各个I/O 设备都有自己的定时控制电路,以自己的速度传输数据,无法与
CPU的时序取得统一。
信息格式不匹配:不同的I/O 设备存储和处理信息的格式不同,例如可以分
为串行和并行两种;也可以分为二进制格式、ACSII 编码和BCD 编码等。
信息类型不匹配:不同I/O 设备采用的信号类型不同,有些是数字信号,而有些是模
拟信号,因此所采用的处理方式也不同。
基于以上原因,CPU 与外设之间的数据交换必须通过接口来完成,通常接口有以下一
些功能:
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 42 -
1)设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度差异,接口通常由一些
寄存器或RAM 芯片组成,如果芯片足够大还可以实现批量数据的传输;
2)能够进行信息格式的转换,例如串行和并行的转换;
3)能够协调CPU和外设两者在信息的类型和电平的差异,如电平转换驱动器、数/模
或模/数转换器等;
4)协调时序差异;
5)地址译码和设备选择功能;
6)设置中断和DMA控制逻辑,以保证在中断和DMA允许的情况下产生中断和DMA
请求信号,并在接受到中断和DMA应答之后完成中断处理和DMA传输。
3.接口的控制方式
CPU通过接口对外设进行控制的方式有以下几种:
1)程序查询方式
这种方式下,CPU通过I/O 指令询问指定外设当前的状态,如果外设准备就绪,则进行
数据的输入或输出,否则CPU等待,循环查询。
这种方式的优点是结构简单,只需要少量的硬件电路即可,缺点是由于CPU 的速度远
远高于外设,因此通常处于等待状态,工作效率很低。
2)中断处理方式
在这种方式下,CPU 不再被动等待,而是可以执行其他程序,一旦外设为数据交换准
备就绪,可以向CPU提出服务请求,CPU如果响应该请求,便暂时停止当前程序的执行,
转去执行与该请求对应的服务程序,完成后,再继续执行原来被中断的程序。
中断处理方式的优点是显而易见的,它不但为CPU 省去了查询外设状态和等待外设就
绪所花费的时间,提高了CPU的工作效率,还满足了外设的实时要求。但需要为每个I/O
设备分配一个中断请求号和相应的中断服务程序,此外还需要一个中断控制器(I/O 接口
芯片)管理I/O 设备提出的中断请求,例如设置中断屏蔽、中断请求优先级等。
此外,中断处理方式的缺点是每传送一个字符都要进行中断,启动中断控制器,还要保
留和恢复现场以便能继续原程序的执行,花费的工作量很大,这样如果需要大量数据交换,
系统的性能会很低。
3)DMA(直接存储器存取)传送方式
DMA最明显的一个特点是它不是用软件而是采用一个专门的控制器来控制内存与外设之间
的数据交流,无须CPU介入,大大提高CPU的工作效率。
在进行DMA数据传送之前,DMA控制器会向CPU申请总线控制权,CPU如果允许,
则将控制权交出,因此,在数据交换时,总线控制权由DMA控制器掌握,在传输结束后,
DMA控制器将总线控制权交还给CPU。
二、常见接口
1.并行接口
目前,计算机中的并行接口主要作为打印机端口,接口使用的不再是36 针接头而是25
针D 形接头。所谓“并行”,是指8 位数据同时通过并行线进行传送,这样数据传送速度大
大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,容易出错。
现在有五种常见的并口:4 位、8 位、半8 位、EPP和ECP,大多数PC机配有4 位或8
位的并口,许多利用Intel386 芯片组的便携机配有EPP口,支持全部IEEE1284 并口规格的
计算机配有ECP并口。
标准并行口4 位、8 位、半8 位:
4位口一次只能输入4 位数据,但可以输出8 位数据;8 位口可以一次输入和输出8 位
数据;半8位也可以。
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 43 -
EPP口(增强并行口):由Intel等公司开发,允许8 位双向数据传送,可以连接各种非
打印机设备,如扫描仪、LAN 适配器、磁盘驱动器和CDROM 驱动器等。
ECP 口(扩展并行口):由Microsoft、HP 公司开发,能支持命令周期、数据周期和多
个逻辑设备寻址,在多任务环境下可以使用DMA(直接存储器访问)。
目前几乎所有的586 机的主板都集成了并行口插座,标注为Paralle1 或LPT1,是一个
26 针的双排针插座。
2.串行接口
计算机的另一种标准接口是串行口,现在的PC 机一般至少有两个串行口COM1 和
COM2。串行口不同于并行口之处在于它的数据和控制信息是一位接一位串行地传送下去。
这样,虽然速度会慢一些,但传送距离较并行口更长,因此长距离的通信应使用串行口。通
常COM1使用的是9 针D 形连接器,而COM2 有些使用的是老式的DB25 针连接器。
3.磁盘接口
1)IDE 接口
IDE 接口也叫做ATA 端口,只可以接两个容量不超过528M 的硬盘驱动器,接口的成
本很低,因此在386、486 时期非常流行。但大多数IDE 接口不支持DMA数据传送,只能
使用标准的PCI/O 端口指令来传送所有的命令、状态、数据。几乎所有的586 主板上都集
成了两个40针的双排针IDE 接口插座,分别标注为IDE1和IDE2。
2)EIDE接口
EIDE 接口较IDE 接口有了很大改进,是目前最流行的接口。
首先,它所支持的外设不再是2个而是4个了,所支持的设备除了硬盘,还包括CDROM
驱动器磁盘备份设备等。
其次,EIDE 标准取消了528MB的限制,代之以8GP限制。
第三,EIDE 有更高的数据传送速率,支持PIO模式3 和模式4 标准。
4.SCSI接口
SCSI(SmallComputerSystemInterface)小计算机系统接口,在做图形处理和网络服务的
计算机中被广泛采用SCSI 接口的硬盘。除了硬盘以外,SCSI 接口还可以连接CD-ROM
驱动器、扫描仪和打印机等,它具有以下特点:
*可同时连接7个外设;
*总线配置为并行8位、16 位或32 位;
*允许最大硬盘空间为8.4GB(有些已达到9.09GB);
*更高的数据传输速率,IDE是2MB每秒,SCSI通常可以达到5MB每秒,FASTSCSI
(SCSI-2)能达到10MB每秒,最新的SCSI-3 甚至能够达到40MB每秒,而EIDE 最高
只能达到16.6MB每秒;
*成本较IDE 和EIDE 接口高很多,而且,SCSI 接口硬盘必须和SCSI接口卡配合使用,
SCSI接口卡也比IED 和EIDE 接口贵很多。
*SCSI接口是智能化的,可以彼此通信而不增加CPU的负担。在IDE 和EIDE 设备之
间传输数据时,CPU 必须介入,而SCSI 设备在数据传输过程中起主动作用,并能在SCSI
总线内部具体执行,直至完成再通知CPU。
5.USB接口
最新的USB串行接口标准是由Microsoft、Intel、Compaq、IBM等大公司共同推出,它
提供机箱外的热即插即用连接,用户在连接外设时不用再打开机箱、关闭电源,而是采用“级
联”方式,每个USB 设备用一个USB 插头连接到一个外设的USB 插座上,而其本身又提
供一个USB插座给下一个USB设备使用,通过这种方式的连接,一个USB控制器可以连
接多达127 个外设,而每个外设间的距离可达5 米。USB 统一的4 针圆形插头将取代机箱
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 44 -
后的众多的串/并口(鼠标、MODEM)键盘等插头。USB能智能识别USB链上外围设备的
插入或拆卸。除了能够连接键盘、鼠标等,USB 还可以连接ISDN、电话系统、数字
音响、打印机以及扫描仪等低速外设。
三、I/O 扩展槽
I/O 扩展槽即I/O 信号传输的路径,是系统总线的延伸,可以插入任意的标准选件,如
显示卡、解压卡、MODEM 卡和声卡等。通过I/O 扩展槽,CPU可对连接到该通道的所有I
/O 接口芯片和控制卡寻址访问,进行读写。
根据总线的类型不同,主板上的扩展槽可分为ISA、EISA、MAC、VESA和PCI几种。
1)ISA插槽
黑色,分为8 位、16 位两种。16 位的扩展槽可以插8 位和16位的控制卡,但8位的扩
展槽只能插8 位卡。
2)EISA插槽
棕色,外型、长度与16 位的ISA卡一样,但深度较大,可插入ISA与EISA控制卡。
3)VESA插槽
棕色,位于16位ISA扩展插槽的下方,与ISA插槽配合使用。
4)PCI插槽
白色,与VESA 插槽一样长,与ISA 插槽平行,不需要与ISA 插槽配合使用,而且只能插
入PCI控制卡。由于主板的空间有限,PCI插槽要占用ISA插槽的位置
一个单片机串行数据采集/传输模块的设计
摘 要 以GMS97C2051单片机为核心,采用TLC2543 12位串行A/D转换器,设计了一个串行数据采集/
传输模块,给出了硬件原理图和主要源程序。
关键词串行A/D转换器串行数据传输 GMS97C2051单片机
在微机测控系统中,经常要用到A/D转换。常用的方法是扩展一块或多块A/D采集卡。当模拟量较少
或是温度、压力等缓变信号场合,采用总线型A/D卡并不是最合适、最经济的方案。这里介绍一种以
GNS97C2051单片机为核心,采用TLC2543 12位串行A/D转换器构成的采样模块,该模块的采样数据由单
片机串口经电平转换后送到上位机(IBM PC兼容机)的串口COM1或COM2,形成一种串行数据采集串行数
据传输的方式。经实践调试证实:该模块功耗低、采样精度高、可靠性好、接口简便,有一定实用价值。
1 主要器件介绍
1.1 TLC2543串行A/D转换器
模块采用TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源,且价格适中。其特点有:
(1)12位分辨率A/D转换器;
(2)在工作温度范围内10μs转换
时间;
(3)11个模拟输入通道;
(4)3路内置自测试方式;
(5)采样率为66kbps;
(6)线性误差+1LSB(max)
(7)有转换结束(EOC)输出;
(8)具有单、双极性输出;
(9)可编程的MSB或LSB前导;
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 45 -
(10)可编程的输出数据长度。
TLC2543的引脚排列如图1所示。图1中AIN0~AIN10为模拟输入端; 为片选端;DIN 为串行数据
输入端;DOUT为A/D转换结果的三态串行输出端;EOC为转换结束端;CLK为I/O时钟;REF+为正基准电
压端;REF-为负基准电压端;VCC为电源;GND为地。
1.2 GMS97C2051单片机
GMS97C2051是武汉力源公司和韩国LG公司联合推出的一种性能价格比极高的 8位单片机,其指令系
统与MCS-51系列完全兼容。GMS97C2051与AT89C2051兼容(可直接替换),但其性能价格比优于AT89C2051。
引脚排列如图2所示。
1.3 电平转换器MAX3232
MAX3232为RS-232收发器,简单易用,单+5V电源供电,仅需外
接几个电容即可完成从TTL电平到RS-232电平的转换,引脚排列如图
3所示。
2 硬件设计
硬件电路如图4所示。
单片机GMS97C2051是整个系统的核心,TLC2543对输入的模拟信号进行采集,转换结果由单片机通过
P3.5(9脚)接收,AD芯片的通道选择和方式数据通过P3.4(8脚)输入到其内部的一个8位地址和控制
寄存器,单片机采集的数据通过串口(3、2脚)经MAX3232转换成RS232电平向上位机传输。图中串行LCD
显示电路仅用于调试,对采集/传输的数据进行监测。
3 单片机软件设计
单片机程序主要包括串行数据采集模块“DATA_SAM”和串行数据传输模块“RS232”,调试所用到的显
示子程序在此略去。
TLC2543的通道选择和方式数据为8位,其功能为:D7、D6、D5和D4用来选择要求转换的通道,
D7D6D5D4=0000时选择0通道,D7D6D5D4=0001时选择1通道,依次类推;D3和D2用来选择输出数据长度,
本程序选择输出数据长度为12位,即D3D2=00或D3D2=10;D1,D0选择输入数据的导前位,D1D0=00选择
高位导前。
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 46 -
TLC2543在每次I/O周期读取的数据都是上次转换的结果,当前的转换结果在下一个I/O周期中被串
行移出。第一次读数由于内部调整,读取的转换结果可能不准确,应丢弃。
数据采集程序如下:
DATA_SAM:
MOV R0,#30H
;数据缓冲区首地址30H→R0
MOV R1,#00000000B ;0通道方式/通道数据
ACALL RD_AD ;第一次读取的转换结果可能不准确,丢弃。
MOV R1,#00010000B ;1通道方式/通道数据
ACALL RD_AD ;送1通道方式/通道数据并读第0通道转换结果
MOV @R0,R2 ;转换结果存放到数据缓冲区,下同
INC R0
MOV @R0,R3
INC R0
MOV R1,#00100000B ;2通道方式/通道数据
ACALL RD_AD ;送2通道方式/通道数据并读第1通道转换结果
MOV @R0,R2
INC R0
MOV @RO,R3
INC R0
………… ;其它通道操作方式类推
RET
单片机通过编程产生串行时钟,并按时序发送与接收数据位,完成通道方式/通道数据的写入和转换结
果的读出,程序如下,供数据采集模块“DATA_SAM” 调用。
CLK EQU P3.3
DIN EQU P3.4
DOUT EQU P3.5
CS EQU P3.7
RD_AD:
CLR CLK ;清I/O时钟
SETB CS ;设置片选为高
CLR CS ;设置片选为低
MOV R4,#08 ;先读高8位
MOV A, R1 ;把方式/通道控制字放到A
LOP1:
MOV C,DOUT ;读转换结果
RLC A ;A寄存器左移,移入结果数据位,移出方式/通道控制位
MOV DIN,C ;输出方式/通道位
SETB CLK ;设置I/O时钟为高
CLR CLK ;清I/O时钟
DJNZ R4,LOP1 ;R4不为0,则返回LOP1
MOV R2,A ;转换结果的高8位放到R2中
MOV A,#00H ;复位A寄存器
MOV R4,#04 ;再读低4位
LOP2:
MOV C,DOUT ;读转换结果
RLC A ;A寄存器左移,移入结果数据位
SETB CLK ;设置I/O时钟为高
CLR CLK ;清I/O时钟
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 47 -
DJNZ R4,LOP2 ;R4不为0,则返回LOP2
MOV R3,A ;转换结果的低4位放到R3中
SETB CS ;设置片选为高
RET
串行数据传输模块包括串行口初始化子程序和数据传输子程序,各子程序分别如下。其中数据传输采
用查询方式,也可以方便地改为中断方式。
INIT_COM:
MOV SCON,#50H ;串口方式1工作,8位数据位,1位停止位,无奇偶校验
MOV PCON,#80H ;SMOD=1,波特率增倍
MOV TMOD,#20H ;波特率设置,fOSC=12MHz,波特率=2* 2400,N=0F3H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1 ;启动定时器T1
RET
RS232:
MOV R0,#30H ;缓冲区首地址30H→R0
MOV R5,#22 ;发送数据长度→R5,11* 2=22
LOOP:
MOV A,@R0 ;取数据→A
MOV SBUF,A ;数据→SBUF
WAIT:
JBC TI,CONT ;判断发送中断标志,是1则转到CONT,并清TI
SJMP WAIT
CONT:
INC R0
DJNZ R5,LOOP
RET
4 上位机串口接收程序设计
上位机接收数据所用C语言程序包括初始化子程序和接收子程序。各子程序分别如下:
void init_com1(void) /*初始化子程序*/
{
outportb(0x3fb,0x80); /*线控制寄存器高位置1,使波特率设置有效*/
outportb(0x3f8,0x18); /*波特率设置,与单片机波特率一致为4800bps*/
outportb(0x3f9,0x00);
outportb(0x3fb,0x03); /*线控制寄存器设置,8位数据位,1位停止位,无奇偶校验*/
outportb(0x3fc,0x03); /*Modem控制寄存器设置,使DTR和RTS输出有效*/
outportb(0x3f9,0x00); /*设置中断允许寄存器,禁止一切中断*/
}
void receive_data(void) /*查询方式接收数据子程序*/
{
while(!kbhit())
{
while(!(inportb(0x3fd)&0x01));/*若接收寄存器为空,则等待*/
printf("%x ",inportb(0x3f8)); /*读取结果并显示*/
}
getch();
}
5 结论
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 48 -
本文给出的硬件和软件均经过实践检验,并且已经按照PC/104总线制作成数据采集卡,使用很方便,
能够满足对数据采样频率要求不是特别高的应用场合。
参 考 文 献
1 TLC2543模数转换器数据手册及应用笔记. 武汉力源电子股份有限公司,1999
2 一九九九年产品目录(第一期). 武汉力源电子股份有限公司, 1999
3 何立民. MS-51系列单片机应用系统设计. 北京:北京航空航天大学出版社, 1999
4 NEW RELEASES DATA BOOK(Volume V). MAXIM,1996: 2-61~2-72
单工、半双工和全双工的定义
串行通讯的基本概念:与外界的信息交换称为通讯。基本的通讯方式有并行通讯和串行通讯两种。
一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,
传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数
米)的通讯。
一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,
传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千
米。
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为单
工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。
串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式。
MCS_51单片机有一个全双工串行口。全双工的串行通讯只需要一根输出线和一根输入线。数据的输出
又称发送数据(TXD),数据的输入又称接收数据(RXD)。串行通讯中主要有两个技术问题,一个是数据
传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指数据
的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数
据转换为并行数据。
单工、半双工和全双工的定义
如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
如果在任意时刻,信息既可由A 传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。
如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。
电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也
将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。
--------> <--------> -------->
A---------B A----------B A---------B
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 49 -
<--------
单工半双工全双工
从 RS232 端口获得电源
图1的电路从一个RS-232端口产生半稳压5V 输出。与PC鼠标电源或依靠调制
解调器控制信号DTR和RTS的可比较电路不同的是,该电路采用3线端口(GND,Rx
和Tx)工作,并仅从Tx线获得功率。(除非高占空比时,Tx线,RCV-232在提
供功率时仍然可供使用)。输出电流大约8mA,对CMOS微控制器和其它低功耗
电路足够了。IC1是一个开关电容充电泵电压转换器,它既可以使输入电压反向,
也可以使输入电压加倍。图中的电路连接提供倍压配置,使输入电压极性反转:
正输入电压一般在GND和OUT之间连接,但是该电路却在OUT和GND之间连接一
个负输入电压。IC使负Vin在正向加倍,产生一个与Vin相等的正输出(在Vdd
端)。
齐纳二级管D1用作并联稳压器,使Vin“半稳压”至-5V(实际为-4.7V)。
图中的33uF电容比一般的电容值要大一些,它在最坏传送模式(全零)下支持
输出电压。例如,在9600波特时,零特性使输出电压下降大约0.2V。对于更低
的波特率,需要将C1换成一个更大的电容。
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 50 -
串行同步通信的应用
摘要:该文给出利用8251A 实现串行同步通讯设计的方法
关键词: 串行同步 8251A 同步时钟 Modem
1 引言
在分布式测控系统中,上位机常常采用工业PC 而工作站则用STD/PC 总线工业控机,它
们之间的数据通信很多采用串行异步方式,而串行同步方式则鲜为人用。在一次为用户开发
NEC 终端机仿真系统过程中为给系统提供同步通信模块,以STD5221 通信板,配合
MultiModem224 调制解调器实现远程串行同步通信。(如图1)
STD 总线 DTE DCE DTE STD 总线
图1
2 8251A初始化
在不同系统或计算机之间进行数据通信主要采用并行和串行两种方式。8251A是一种通
用的同/异步接收/发送器(USART)。在异步方式下的应用在有关书刊上已屡见不鲜,这里
就不加重复。下面我们根据8251A芯片的使用体会对其在串行同步方式下的通信原理及应用
进行着重介绍。在开始发送或接收之前,8251A 必须装入一组由CPU 产生的控制字。这些控
制信号定义了8251A的完整功能含义,并且必须紧跟在一个复位操作之后(内部的或外部
的)。控制字分为两种格式:方式字和命令字。图2为定义8251A方式字和命令字设定的初
始化与发送或接收数据流程图。
inital 为初始化程序的主要部分,方式字设置为止3CH( 内同步方式,双同步字符,8 位数
据,奇校验方式) 。命令字设置为B7H(进入同步字符搜索方式,请求发送,接收就绪,数
据端就绪,发送允许)。
inital proc ; 初始化程序.
: ; 清状态口和数据口.
mov dx,port ; port 为发送口/接收口地址
mov al,40h ; 复位操作,目的迫使8251 out dx,al ; 进入方式字格式,
mov al,3ch ; 设置方式字操

out dx,al
mov al,55h ; 设置同步字符操作
out dx,al ; 同步字符 1 为55h
out dx,al ; 同步字符 2 为55h
mov al,0b7h ; 设置命令字操作
ret
inital endp
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 51 -
图 2
3 同步通信体验
(1) 时钟
在串行同步通信中,需要使发送的数据同时带有同步信息,因此,在硬件电路的设计中
需要保证数据流中每一个连续不断的数据位均由一个基本时钟控制,并定时在某个特定的间
隔上,所以对时钟要求甚严,即使两个工作站的通讯模板上8251A 的晶振频率标称值相同,
但实际上每个晶振的频率有所差别,8251A 时钟频率的误差将导致同步时钟相位的移动,离
开要求的位置。为了保证进入同步后相位一直被锁定,我们将Modem 置为同步方式,利用
Modem 的RXC(接收时钟)和TXC(传送时钟)作为8251A的接收/传送时钟,以此来达到传
送时钟和接收时钟的同步。
另外8251A 的CLK这个输入信号用作产生器件内部的定时,它的频率必须比RXC与TXC
高30 倍。
(2) 发送
8251A被初始化完后,在CPU向8251A写一个字符启动发送前,TXD输出端一直处于高平状态,
作为8251A启动发送的第一个字符应是SYNC(同步字符)符号。一旦启动了发送,TXD 输出端
上的数据一定以TXC的频率连续不停地发送。在CPU不能及时向传送缓冲器写数之时,SYNC
符号将自动插入到TXD数据流中,以保持TXD 上有数据连续不断的发送。
(3) 接收
同步接收有外同步和内同步两种方式(初始化时,在方式字中设定,本例设为内同步)。
内同步方式下:
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 52 -
命令字的ENTER HUNT位置上的数据在RXC的上升没被采样RXC 缓冲器与同步字符比较,
直到相同为止(若8251A 被设置为双SYNC方式,则要与第二同步字符比较)。8251A结束
HUNT 搜索同步字符状态进入同步状态,处于字符同步中,然后把SYNDET 引脚置为高电平。
表明接收方已与发送方同步上。
外同步方式:
外同步方式是发送方接收主SYNDET脚施加一高电平的方法,迫使脱离HUNT 方式,实现
发送方与接收方的同步。
(4) MutiModem224 的接口芯脚分配
为使不同厂家的设备兼容,1969 年由电子工业协会(Electronic Industries
Association)公布RS-232-C 标准。最初拟制为终端设备和调制解调器之间的连接规定。它
规定了两设备间的电器特性和所需连线的名称及编号。
在串行通讯链路中,将通信设备分为两类,以线“2”作为数据输出的通讯设备称为
DTE(Data Terminal Equipment)。象调制解调器将线“2”作为数据输入的通讯设备称为DCE
(Data Communication Equipment)。这样假如知道一个设备是DTE,一个是DCE,即可“2”到
“2”,“3”到“3”的一一对应地将它们连接起来。这就是公认的直接连接。但厂家不一定
总遵守这个规定,所以一个给出的通讯设备是DTE,还是DCE 并不能分清。因此在连接两个
通讯设备时,最有效的方法是根据RS232-C 出脚的名称,按实际应用需要相联。图3 为调制解
调器与通讯模板的RS232-C 25芯接口的连接图。
计算机首先发出数据终端就绪信号,然后指示调制解调器呼叫远程站,当调制解调器完
成联通后,它就发出调制解调器就绪信号,通知计算机调制解调器已完成通讯准备,此时计
算机就发出请求传送信号,等调制解调器应答了允许发送信号后,即开始数据传送。
4 控制字设置与软件实现
8251A的引脚上有一“控制/信号”信号C/D,此信号和“读/写”信号合起来通知8251A
当前读写的是数据还是控制字.状态字。当C/D=0进行读写时,读出和写入的是数据。当C/D=1
进行写入时,写入的是控制字、方式字和同步字符;C/D=1 进行读出时,是从状态寄存器中读
出的状态。那么,在C/D=1 写入时,到底写到哪一个寄存器呢?这涉及8251A初始化的有关约
定。这个约定有三条: (1)芯片复位后,第一次用C/D=1 写入的值是方式字;(2)如果方式字中
规定了同部方式,接着用C/D=1写入的就是同部字符;(3)在此之后,以C/D=1写入的都被作为
命令字。
图 3
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 53 -
从原则上来说, 象8251A这样的8位接口芯片,连接在16 位系统时,低8 位的数据总写
到偶地址, 高8 位的数据总写到奇地址. STD5221 也遵从这个原则,不将地址总线的最低位
A0连到8251A的地址线上,而将地址总线A1作为8251A的地址最低位地址总线A0 经过反相
后连到8251A 的C/D端.(在常见的具有USART 的PC系统中,A0 是直接连接到8251A 的C/D
端,与STD5221 相反,这一点在应用时要注意)。注:据实验结果,在C/D=1 写入的第一个命令
字之后,先向数据口写同步字符,才能启动同步发送(在流程图中有标示)。
5 通讯模板及程序说明
STD5221 是一种通用的串行数据通讯插件,它提供了两套完全独立的RS232-C串行数据
通道。本例子在STD V40 系统Ⅱ下开发, 以STD5221作为通讯模板经过 Modem 以同步方式
互发一串字符。限于篇幅未能完全收录。
参考文献
[1] 魏庆福.STD 总线工业控制机设计于应用
[2] 康拓公司.STD 总线工业控制机双串行通信板(STD5221)
[3] MultiModem224E7 Owner’sManual
[4] 王仲文译.精通串行通信, 电子工业出版社
串行通信波特率的一种自动检测方法
摘 要:给出了一种利用接收到的字符信息检测串行终端通信波特率的方法。此方法简单、可靠、易行,
并给出了实现这种检测方法的伪代码。
关键词:自动检测;波特率
串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和19200等。
终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?本文给出了一种简
单、易行的方法:设定主机的接收波特率(以9600波特为例),终端发送一个特定的字符(以回车符为例),
主机根据接收到的字符信息就可以确定终端的通信波特率。本文对这种方法予以详述。
1 基本方法
回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是先传低位再
传高位。此时回车符的二进制表示方式为:
图1 回车符的位序列
串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个二进制位的传
输时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T 9600。因此,9600波特时一个位的传输
时间,19200波特时可以传输两个位。同样地,9600波特传输两个位的时间在4800波特时只能传送一个
位。主机设定接收波特率为9600, 终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 54 -
率高于或低于9600都会使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回
车符时,主机接收到的二进制序列如表1所示。
从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是 9600波特
时二进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺少停止位‘1’引发的
数据帧错误,把接收到的字符表示成字节方式(如表1的最右列所示) 。例如:在发送速率为1200波特,
接收速率为9600波特时,主机得到的字节是0x80,而不是正确的回车符0x0D。因为在不同的发送速率下
(9600,4800,2400,1200)得到的字节不同,所以通过接收字符的判定就可以确定发送波特率。
发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端的两个二进
制位会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种二进制位组合可能被认为
是‘1’或者‘0’。幸运的是,只有0~4位存在这样的歧义问题, 后面的位因为都是停止位,所以都是
‘1’。因此,发送速率为19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的
一个,但不会是0x0,因为0x0D中有相邻的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因
此,整个字节的形式为0xF?, 且低半个字节不为0。
表1 不同波特率下的二进制序列
波特率接收到的二进制位序列字节表示
19200 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0xF?
9600 0 1 0 1 1 0 0 0 0 1 0x0D
4800 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0xE6
2400 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0x78
1800 0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1 0xE0
1800 0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1 0xF0
1200 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0x80
600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0x00
300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x00
150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x00
110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x00
发送速率为1800波特时,因为
T1800=T9600*16/3,
而16/3不是整数,接收端二进制位的状态转换时刻和9600波特不一一对应,引起在接收端的一个位接收
周期内有状态发生变化的可能。表1中给出的第六个位(表示为x)就是这种情况。因为x有可能被看作
‘1’,也有可能被看作‘0’,所以发送速率为1800波特时接收到的字节可能是0xE0或者0xF0。波特
率为3600和7200时也有同样的问题,也可以采用同样的方法,但不确定的位数会增加,需要检测的字节
种类也会更多。3600波特和7200波特的传输速率几乎不采用,因此这个问题并不严重。只要发送波特率
在1200~19200之间,我们都可以通过接收到的一个字符对此波特率进行唯一的判定。
2 低波特率的检测
当发送速率低于1200波特时,接收端收到的字节都是0x00,因此只能确定其速率低于12 00波特,
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 55 -
而不可能再得到更多的信息。为了解决这个问题,可以在9600波特的速率下继续接收下一个字节信息。
发送速率为600波特或更低时,一个位的发送时间要大于9600波特时整个字节的接收时间。因此,发送
端每一个从‘1’(终止位)到‘0’(起始位)的跳变都会让接收端认为一个新的字节开始了。表2所示
为600波特或更低的传输速率时接收端回车符的二进制序列(只给出开始的一些位)。
表2 低波特率回车符的接收方式
波特率9600波特二进制序列
时间差
(周期)
时间差
(实时间)
600 16 0's 16 1's 16 0's 32 3.33ms
300 32 0's 32 1's 32 0's 64 6.66ms
150 64 0's 64 1's 64 0's 128 13.33ms
110 87 0's 87 1's 87 0's 174 18.13ms
75 128 0's 128 1's 128 0's 256 26.66ms
50 192 0's 192 1's 192 0's 384 4 0.00ms
600波特时,第一个从‘1’到‘0’的跳变在初始化以后即刻发生。这个跳变让接收端得到字节0x00。
第二个跳变在初始化(16+16)*T9600秒以后发生,这会让接收端认为另外一个字节开始接收了。一个二进制
位的接收时间是T9600,所以串行接口电路会在第一个跳变以后10* T9600秒提示第一个字节接收完毕,在
(16+16+10)* T96 00秒以后提示第二个字节接收完毕。因此600波特时,第一个字节接收完毕和第二个字节接
收完毕的时间差是(16+16+10-10)* T9600=32* T9600秒。表2的第三列所示是把这个时间差以T9600的个数表示。
因为T9600=1/9600秒=104.16毫秒,相乘可以得到两个字节接收完毕的实时间差。不同发送波特率的时间
差如表2的最后一列所示。有了这个时间差信息,就可以确定低传输速率时的波特率了:测定第一个和第
二个字节的接收时间差,然后在时间差常数表(表2)里查出哪个波特率下的时间差与之最相近,对应的
就是终端发送波特率。即使测定的时间差有些误差,一般也可以正确地确定波特率。
3 实现方式
通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪代码在本文的
最后给出。应用实践证明了这种方法的有效性。
; Pseudo code to determine what baud rate a transmitter is at,
on the b asis of a single
; RETURN (0x0D) character received from it.
Initialise receive baud rate to 9600
Wait for Byte to be received
IF Byte = 0x00 THEN
Start Timer
REPEAT
UNTIL (Timer > 50 ms OR New Byte Received)
CASE Timer IN
1 ms-4 ms:□ 600 Baud
5 ms-10 ms:□ 300 Baud
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 56 -
11 ms-15 ms:□ 150 Baud
16 ms-22 ms:□ 110 Baud
23 ms-32 ms:□ 75 Baud
33 ms-49 ms:□ 50 Baud
ELSE:□ Timed out; reset
END CASE;
ELSIF Byte >= 0xF1 THEN
□ 19200 Baud
ELSE
CASE Byte IN
0x0D:□ 9600 Baud
0xE6:□ 4800 Baud
0x78:□ 2400 Baud
0xE0,0xF0:□ 1800 Baud
0x80:□ 1200 Baud
ELSE:□ Line noise; reset
END CASE
END IF■
参考文献:
[1]赵依军等. 单片微机接口技术[M].北京: 人民邮电出版社,1989.
[2]刘利. 软硬件技术参考大全[M].北京: 学苑出版社,1993.
[3]张世一. 数字信号处理[M]. 北京:北京工业学院出版社,1987.
RS-232、RS-422 与RS-485 标准及应用
一、RS-232、RS-422与RS-485的由来
RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232
在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232
发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义
了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),
并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规
范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标
准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力
和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以
“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。
RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础
上用户可以建立自己的高层通信协议。因此在视频界的应用,许多厂家都建立了一套高层通信协议,或公
开或厂家独家使用。如录像机厂家中的Sony与松下对录像机的RS-422控制协议是有差异的,视频服务器
上的控制协议则更多了,如Louth、Odetis协议是公开的,而ProLINK则是基于Profile上的。
二、RS-232串行接口标准
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 57 -
目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中
增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。
图1
收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信
号地)的电平,DB25各引脚定义参见图1。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送
端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数
据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~
-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布
电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通
讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。其有关电气参数参见表
规定RS232 RS422 R485
工作方式单端 差分差分
节点数1收、1发1发10收1发32收
最大传输电缆长度50英尺400英尺400英尺
最大传输速率20Kb/S 10Mb/s 10Mb/s
最大驱动输出电压+/-25V -0.25V~+6V -7V~+12V
驱动器输出信号电平
(负载最小值)
负载+/-5V~+/-15V +/-2.0V +/-1.5V
驱动器输出信号电平
(空载最大值)
空载+/-25V +/-6V +/-6V
驱动器负载阻抗(Ω) 3K~7K 100 54
摆率(最大值) 30V/μs N/A N/A
接收器输入电压范围+/-15V -10V~+10V -7V~+12V
接收器输入门限+/-3V +/-200mV +/-200mV
RS232技术文摘枕善居收集整理http://www.mndsoft.com
- 58 -
接收器输入电阻(Ω) 3K~7K 4K(最小) ≥12K
驱动器共模电压-3V~+3V -1V~+3V
接收器共模电压-7V~+7V -7V~+12V
表1
三、RS-422与RS-485串行接口标准
1.平衡传输
RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,
将其中一线定义为A,另一线定义为B,如图2。
图2
通常情况下,发送驱动器A、B之间的正电平在+2~+6V,是一个逻辑状态,负电平在-2~6V,是另一个逻
辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”
端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称
作“第三态”,即它是有别于逻辑“1”与“0”的第三态。
接收器也作与发送端相对的规定,收、发端通过平衡双绞线将AA与BB对应相连,当在收端AB之间有大于
+200mV的电平时,输出正逻辑电平,小于-200mV时,输出负逻辑电平。接收器接收平衡线上的电平范围通
常在200mV至6V之间。参见图3。
图3
2.RS-422电气规定
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 59 -
RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。图5是典型的RS-422
四线接口。实际上还有一根信号地线,共5根线。图4是其DB9连接器引脚定义。由于接收器采用高输入
阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节
点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多
的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接
口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软
件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。
图4 图5
RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输
速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传
输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一
般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。
RS-422有关电气参数见表1
3.RS-485电气规定
由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传
输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双
向通信,参见图6。
而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设
备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。参见图7。
图6 图7
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 60 -
RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至
+7V之间,RS-485接收器最小输入阻抗为12k剑□鳵S-422是4k健;□旧峡梢运礡S-485满足所有RS-422
的规范,所以RS-485的驱动器可以用在RS-422网络中应用。
RS-485有关电气规定参见表1。
RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输
速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高
速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。
RS-485需要2个终接电阻,其阻值要求等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一
般在300米以下不需终接电阻。终接电阻接在传输总线的两端。
四、RS-422与RS-485的网络安装注意要点
RS-422可支持10个节点,RS-485支持32个节点,因此多节点构成网络。网络拓扑一般采用终端匹配的总
线型结构,不支持环形或星形网络。在构建网络时,应注意如下几点:
1.采用一条双绞线电缆作总线,将各个节点串接起来,从总线到每个节点的引出线长度应尽量短,以便使
引出线中的反射信号对总线信号的影响最低。图8所示为实际应用中常见的一些错误连接方式(a,c,e)
和正确的连接方式(b,d,f)。a,c,e 这三种网络连接尽管不正确,在短距离、低速率仍可能正常工作,
但随着通信距离的延长或通信速率的提高,其不良影响会越来越严重,主要原因是信号在各支路末端反射
后与原信号叠加,会造成信号质量下降。
2.应注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。下列几种情况易产生这种不连续
性:总线的不同区段采用了不同电缆,或某一段总线上有过多收发器紧靠在一起安装,再者是过长的分支
线引出到总线。
总之,应该提供一条单一、连续的信号通道作为总线。
图8
五、RS-422与RS-485传输线上匹配的一些说明
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 61 -
对RS-422与RS-485总线网络一般要使用终接电阻进行匹配。但在短距离与低速率下可以不用考虑终端匹
配。那么在什么情况下不用考虑匹配呢?理论上,在每个接收数据信号的中点进行采样时,只要反射信号
在开始采样时衰减到足够低就可以不考虑匹配。但这在实际上难以掌握,美国MAXIM公司有篇文章提到一
条经验性的原则可以用来判断在什么样的数据速率和电缆长度时需要进行匹配:当信号的转换时间(上升
或下降时间)超过电信号沿总线单向传输所需时间的3倍以上时就可以不加匹配。例如具有限斜率特性的
RS-485接口MAX483输出信号的上升或下降时间最小为250ns,典型双绞线上的信号传输速率约为0.2m/ns
(24AWG PVC电缆),那么只要数据速率在250kb/s以内、电缆长度不超过16米,采用MAX483作为RS-485
接口时就可以不加终端匹配。
一般终端匹配采用终接电阻方法,前文已有提及,RS-422在总线电缆的远端并接电阻,RS-485则应在总线
电缆的开始和末端都需并接终接电阻。终接电阻一般在RS-422网络中取100Ω,在RS-485网络中取120Ω。
相当于电缆特性阻抗的电阻,因为大多数双绞线电缆特性阻抗大约在100~120Ω。这种匹配方法简单有效,
但有一个缺点,匹配电阻要消耗较大功率,对于功耗限制比较严格的系统不太适合。
另外一种比较省电的匹配方式是RC匹配,如图9。利用一只电容C隔断直流成分可以节省大部分功率。但
电容C 的取值是个难点,需要在功耗和匹配质量间进行折衷。
还有一种采用二极管的匹配方法,如图10。这种方案虽未实现真正的“匹配”,但它利用二极管的钳位作
用能迅速削弱反射信号,达到改善信号质量的目的。节能效果显著。
图9 图10
六、RS-422与RS-485的接地问题
电子系统接地是很重要的,但常常被忽视。接地处理不当往往会导致电子系统不能稳定工作甚至危及系统
安全。RS-422与RS-485传输网络的接地同样也是很重要的,因为接地系统不合理会影响整个网络的稳定
性,尤其是在工作环境比较恶劣和传输距离较远的情况下,对于接地的要求更为严格。否则接口损坏率较
高。很多情况下,连接RS-422、RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端
连接起来。而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,
这有下面二个原因:
1.共模干扰问题:正如前文已述,RS-422与RS-485接口均采用差分方式传输信号方式,并不需要相对于
某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但人们往往忽视了收发器有一定的共
模电压范围,如RS-422共模电压范围为-7~+7V,而RS-485收发器共模电压范围为-7~+12V,只有满足上
述条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 62 -
坏接口。以图11为例,当发送驱动器A向接收器B发送数据时,发送驱动器A的输出共模电压为VOS,由
于两个系统具有各自独立的接地系统,存在着地电位差VGPD。那么,接收器输入端的共模电压VCM就会达
到VCM=VOS+VGPD。RS-422与RS-485标准均规定VOS≤3V,但VGPD可能会有很大幅度(十几伏甚至数十伏),
并可能伴有强干扰信号,致使接收器共模输入VCM超出正常范围,并在传输线路上产生干扰电流,轻则影
响正常通信,重则损坏通信接口电路。
图11
2.(EMI)问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信
号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。
由于上述原因,RS-422、RS-485尽管采用差分平衡传输方式,但对整个RS-422或RS-485网络,必须有一
条低阻的信号地。一条低阻的信号地将两个接口的工作地连接起来,使共模干扰电压VGPD被短路。这条信
号地可以是额外的一条线(非屏蔽双绞线),或者是屏蔽双绞线的屏蔽层。这是最通常的接地方法。
值得注意的是,这种做法仅对高阻型共模干扰有效,由于干扰源内阻大,短接后不会形成很大的接地环路
电流,对于通信不会有很大影响。当共模干扰源内阻较低时,会在接地线上形成较大的环路电流,影响正
常通信。笔者认为,可以采取以下三种措施:
(1) 如果干扰源内阻不是非常小,可以在接地线上加限流电阻以限制干扰电流。接地电阻的增加可能会
使共模电压升高,但只要控制在适当的范围内就不会影响正常通信。
(2) 采用浮地技术,隔断接地环路。这是较常用也是十分有效的一种方法,当共模干扰内阻很小时上述
方法已不能奏效,此时可以考虑将引入干扰的节点(例如处于恶劣的工作环境的现场设备)浮置起来(也
就是系统的电路地与机壳或大地隔离),这样就隔断了接地环路,不会形成很大的环路电流。
(3) 采用隔离接口。有些情况下,出于安全或其它方面的考虑,电路地必须与机壳或大地相连,不能悬
浮,这时可以采用隔离接口来隔断接地回路,但是仍然应该有一条地线将隔离侧的公共端与其它接口的工
作地相连。参见图12。
图12
七、RS-422与RS-485的网络失效保护
RS-422与RS-485标准都规定了接收器门限为±200mV。这样规定能够提供比较高的噪声抑制能力,如前文
所述,当接收器A电平比B电平高+200mV以上时,输出为正逻辑,反之,则输出为负逻辑。但由于第三态
的存在,即在主机在发端发完一个信息数据后,将总线置于第三态,即总线空闲时没有任何信号驱动总线,
使AB之间的电压在-200~+200mV直至趋于0V,这带来了一个问题:接收器输出状态不确定。如果接收机
的输出为0V,网络中从机将把其解释为一个新的启动位,并试图读取后续字节,由于永远不会有停止位,
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 63 -
产生一个帧错误结果,不再有设备请求总线,网络陷于瘫痪状态。除上述所述的总线空闲会造成两线电压
差低于200mV的情况外,开路或短路时也会出现这种情况。故应采取一定的措施避免接收器处于不确定状
态。
通常是在总线上加偏置,当总线空闲或开路时,利用偏置电阻将总线偏置在一个确定的状态(差分电压
≥-200mV)。如图13。将A上拉到地,B下拉到5V,电阻的典型值是1kΩ,具体数值随电缆的电容变化而
变化。
上述方法是比较经典的方法,但它仍然不能解决总线短路时的问题,有些厂家将接收门限移到
-200mV/-50mV,可解决这个问题。例如Maxim公司的MAX3080系列RS-485接口,不仅省去了外部偏置电阻,
而且解决了总线短路情况下的失效保护问题。
八、RS-422与RS-485的瞬态保护
前文提到的信号接地措施,只对低频率的共模干扰有保护作用,对于频率很高的瞬态干扰就无能为力了。
由于传输线对高频信号而言就是相当于电感,因此对于高频瞬态干扰,接地线实际等同于开路。这样的瞬
态干扰虽然持续时间短暂,但可能会有成百上千伏的电压。
实际应用环境下还是存在高频瞬态干扰的可能。一般在切换大功率感性负载如电机、变压器、继电器等或
闪电过程中都会产生幅度很高的瞬态干扰,如果不加以适当防护就会损坏RS-422或RS-485通信接口。对
于这种瞬态干扰可以采用隔离或旁路的方法加以防护。
1.隔离保护方法。这种方案实际上将瞬态高压转移到隔离接口中的电隔离层上,由于隔离层的高绝缘电阻,
不会产生损害性的浪涌电流,起到保护接口的作用。通常采用高频变压器、光耦等元件实现接口的电气隔
离,已有器件厂商将所有这些元件集成在一片IC中,使用起来非常简便,如Maxim公司的MAX1480/MAX1490,
隔离电压可达2500V。这种方案的优点是可以承受高电压、持续时间较长的瞬态干扰,实现起来也比较容
易,缺点是成本较高。
2.旁路保护方法。这种方案利用瞬态抑制元件(如TVS、MOV、气体放电管等)将危害性的瞬态能量旁路
到大地,优点是成本较低,缺点是保护能力有限,只能保护一定能量以内的瞬态干扰,持续时间不能很长,
RS232技术文摘枕善居收集整理h t t p : / / w w w . e l e c f a n s . c o m
- 64 -
而且需要有一条良好的连接大地的通道,实现起来比较困难。实际应用中是将上述两种方案结合起来灵活
加以运用,如图14。在这种方法中,隔离接口对大幅度瞬态干扰进行隔离,旁路元件则保护隔离接口不被
过高的瞬态电压击穿。
串口泵
[摘要]将RS232接口转换成双端平衡传送和差分接收方法,并对信号进行光
电隔离,无需外接电源,实现延长RS232通讯距离和抗干扰保护接口之目的。
[关键词]平衡传送差分接收串口窃电瞬态电压抑制
一、引言
串口泵也称为RS232隔离长线驱动器,是德阳四星电子技术开发中心研制
的RS232/RS422/RS485系列产品之一,外形采用DB25转接盒,外插RS232串口,
即插即用,使用极为方便。独特的串口窃电技术使得该系列产品不需要外接电
源,也不需靠初始化设置串口来供电,使用本系列产品后均不会对软件作任何修
改,确保适合一切软件!该产品全部采用工业级元器件,并设有抗雷击等瞬态电
压抑制电路。特别适用于工业现场,野外等恶劣环境,外形如图1所示:
图 1
● 外形尺寸:60×50×17
● 重量:40克
● 工作温度:-40~+85℃
● 工作湿度:0~95%
二、工作原理
采用RS232接口单端信号传送方式,通讯距离只能达到15米,很大程度上
限制了计算机的应用范围。影响计算机正常通讯的因素主要有电磁辐射干扰(噪
声干扰)和电源干扰(串扰)。电磁辐射干扰主要来自于工业现场的各种用电器,
它在通讯电缆线上产生感应电势等噪声干扰使系统不能正常工作。电源干扰的主
要原因是设备的电源电路不够理想,如两台设备所用的电源不同相;设备接地不
好;或者两台设备处在不同的电力分布网,地电位不同等原因在两台设备之间产
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 65 -
生地电位差而形成串扰。
由图2可见:Er=Et+En+Eg,Et为十几伏,Eg一般为几十伏至几百伏,En若
是来自用电器一般不超过几十伏,若是来自雷电则可达几千伏。 RS232接口所
能承受的最大电压是25伏,由此可见,几十伏以上的干扰信号不仅会影响正常
通讯而且足可将接口烧毁。
图 2
SC-232系列光隔离长线收发器是将RS232 接口数据传送方式转换成双端平
衡信号传输,并用高速光隔离器件将两台设备隔离开,在差分接收器接收到双端
平衡信号后再还原成RS232信号送至RS232接口。见图3所示:
图 3
Et为发送端电压,Er为接收端电压,En 为干扰电压,Eg为地电位差。
Er=Et+En-En=Et
由于采用双端平衡传输和差分接收,使得加在两根导线上的干扰信号可以
相互抵消而不影响正常信号的传输,因而有效克服了噪声干扰。同时由于光隔离
器的作用,使得两台通讯设备之间的地电位差Eg不会对信号有任何影响。从而
彻底解决了通讯中的串扰和噪声干扰。
经实测,使用串口泵后在波特率为9600bps时通讯距离可达2公里,若降
低通讯速率,则可相应延长通讯距离。
三、工作电源的窃取
本装置不需外接电源,其工作电源从RS232接口上窃取。如图4所示:图
中TXD、RTS、DTR是RS232的输出信号,每根信号线可提供约9mA的输出电源,
通讯时其电压在+10V和-10V之间跳变,通讯停止后其电压极性不定,但开机上
电时全部为-10V。该三个信号经D1~D6全波整流和C1、C2滤波后得到+9V和-9V
直流电压,若是开机上电状态则只有-9V电压。IC1和IC2分别是负电压到正电
压转换器和正电压到负电压转换器,将输入电压转换极性并升压,这样无论TXD、
RS232技术文摘枕善居收集整理http://www.elecfans.com
- 66 -
RTS、DTR是什么极性都能在DW1和DW2端得到+9V和-9V的稳定电压。亦即
不需靠软件设置来得到工作电压,确保适合所有软件!其实只需以上任意一根信
号线即可满足要求。
图 4
四、瞬态电压干扰接口保护
由于本装置采用平衡差分传输方式,因而具有良好的抗电磁干扰能力,光
电隔离电路能有效的抑制地电位差的干扰。采用屏幕电缆对抑制射频干扰很有
效,但屏蔽电缆线的电容较大,会相应降低通讯速率。除上述常见干扰因素外,
瞬态电压干扰是威胁通讯接口安全的元凶之一。
瞬态电压抑制器TVS是一种高效能的电路保护器件,外形及符号同普通稳压
管,所不同的是,它是一种特制的齐纳二级管,能经受高达数千伏的脉冲电压和
数十乃至数百安培的浪涌电流,能承受的功率高达数千瓦。同时TVS具有极小的
极间电容,并不会影响信号的正常传输。
图 5
图5给出了本采用TVS的保护电路。在发送端和接受端各采用3个TVS单元,
分别对线路之间、线路对地之间的瞬态电压干扰进行抑制,消除了由于强电进入
而产生通讯口被烧毁的现象,从而有效的保证了整个通讯系统的安全运行。
五、结束语
串口泵可广泛用于各种工业控制系统、计算机通讯系统等一切采用RS232
通讯的设备,对延长通讯距离、抗干扰和保护接口等方面不失为一种经济可靠的
装置。根据以上原理,还可设计出RS232到RS422/RS485等各种通讯规程转换器,
并且不需要外接电源。

你可能感兴趣的:(综合类)