锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

串口通信大全

时间:2022-12-26 02:30:00 三脚电位器结构线串接56k电阻dd250gb160二极管模块集成电路max4579epp感应器24v开关电感接近tl

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)二、四、五、七、八、二
②20mA 电流环信号 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 机器及以后不支持20台mA 使用电流环接口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
用异步方式操作串口必须要定义OVER
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章