几种常用单片机I/O/O口线的驱动能力

51单片机sbit led=P1^0是什么意思?语句里面起什么作用,怎么看的?和sbit CY=PSW^7有什么区别
问题描述:
51单片机sbit led=P1^0是什么意思?语句里面起什么作用,怎么看的?和sbit CY=PSW^7有什么区别
问题解答:
sbit 这个是说明你定义的类型为位.led=P1^0; 这里表示 定义单片机I/O口 P1.0的伪名称叫led 这样你要对P1.0控制时直接写 led=1; 或者=0 让灯亮或者灭.和sbit CY=psw^7; 是一样的定义模式,都是定义一个字符内的其中一位!
我来回答:
剩余:2000字
sbit 这个是说明你定义的类型为位.led=P1^0; 这里表示 定义单片机I/O口 P1.0的伪名称叫led 这样你要对P1.0控制时直接写 led=1; 或者=0 让灯亮或者灭.和sbit CY=psw^7; 是一样的定义模式,都是定义一个字符内的其中一位!
#include#define uint unsigned intsbit S1=P1^0;sbit S2=P1^1;sbit S3=P1^2;sbit S4=P1^3;sbit LED1=P1^4;void delay(uint);main(){S1 = 1;S2 = 1;S3 = 1;S4 = 1;while(1)
P0口第一个功能是数据接口,第二个功能是地址低八位,P2口第二个功能是地址高八位.另外除了P0口没有内部上拉电阻外,其他三个都有内部上拉电阻.P1 就没多少功能,就是个准双向I/O口.最重要的就是P3口了,他除了是个准双向I/O口外,第二功能很重要:P3.0 (RXD)串行数据接收端;P3.1 (TXD)串行数据发送端
1、让P3口置1,目的是为了下面(第二条指令)正确读入P3口的状态,从而能正确判断开关的闭合.此图上P3口只用到P3.0.2、K闭合时,灯亮,反知灭.JB指令判断出1,则跳转,判断出0,则不跳转,而是顺序执行.第一条指令上面已说作用.第二条指令判断P3.0状态,当K打开时,第二条指令判断得P3.0为1,转到L1执行.L
你肯定是打错了 TMOD&=0Xdf 的意思是 让TMOD这个寄存器的第六位(从低往高数哈)置为0,其他位的电平保持不变.TMOD |=0Xdf 的意思是让第六位保持不变,其他位都置为1 再问: 哦是打错了是这个才对& 再答: 那就是嘛,给个好评吧
试分析你的程序.你的time0中断里面只有pp++,也就是在第一次灭了以后,pp是20000,而这个时候你没有对pp清零,pp还会一直+下去,,20003……一直循环下去,如果p变量无界的话,你这个程序就只能亮一次,灭一次,以后就再也亮不起来了,但为什么过了好多秒又亮了呢?因为pp的类型是uint
这个程序每一条语句你肯定能看懂,给你加注释没有必要,给你讲讲PWM的原理,你再对照程序看就明白了你要用51产生PWM去控制LED,首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多
嗯!这个问题是!你的外部中断使用的是外部中断0,而定时器使用的也是0.在51内,外部中断0的优先级是要大于定时器0的.所以在程序的最后是要先执行外部中断0的!然后你的程序就会先进入外部中断服务,然后你在外部中断中又把定时器中断给关闭了!这样你就不会走到定时器中断的服务项中.所以你的num一直是0
不知道你说的是哪种单片机,如果是常用的51单片机的话,其P1口仅作为I/O,无第二功能;P3口作为I/O的同时,其第二功能是一些特殊功能,非扩展存储.P0口用于外部扩展存储时,用作地址总线或数据总线;P2口作为扩展存储时,作为地址总线.
这就要看你想初始化为高电平有效还是低电平有效,只要在数值里面反一下就可以了,即0变1或1变0,不懂你是学汇编语言还是C语言,我举个例子你看看吧.ORG 100H ;单片机起始地址MOV A,31H ;分配存储空间M0:MOV A,#0EFH ;P2口赋初值( 即P2口管脚初始化)MOV R0,#08H ;循环次数M1:
普通51单片机是不能检测电流的,需要外接其他电流检测电路.io口可以检测高低电平,只有0和1的区别.如果需要检测电压,需要用带有ADC功能的51单片机,如果检测电流的话,需要将电流转换成电压用ADC来转换,或者用外部电路将电流转换成数字量再给单片机处理.
先要知道sbit的意义和用法,这个叫位定义就是给P0^0又定义了个名字叫P00.这样在程序中用到P0^0的时候写P00就可以了,这样为的是书写方便.也就是说写了sbit p1_7=p1^7 之后,p1.7口就可以用p1_7来代替了,也可以自己定义任何变量.单独改变p2.0口可以这样,比如要将p2.0口赋值0 .参考程序
把三个口全部赋值,应就可以了吧.和您一起学习一下.错了的话,请多多包涵!void main() //主函数{ while(1) //大循环{ for(num=0;num
汇编语言还是 c 语言?给你一个 c 的编程:#include unsigned char code Tab_Led[]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7f,0xff,0xef,0xff,0xdf,0xff,0xbf,0xff,0x7f,0xff,0xff,0xfe,0xff,0x
变量可以这样写 ,位定义 好像是不行的 .
这个我在行,呵呵.只不过我用的是dsPIC30F系列的单片机,位定义如下:TRISFbits.TRISF6=0; //PF6 输出LATFbits.LATF6 ^=1; //PF6 取反详细看一下头文件就知道了.希望对你有帮助.
单片机采用MSC-51或其兼容系列芯片,采用24MHZ或更高频率晶振,以获得较高的刷新频率,时期显示更稳定.单片机的串口与列驱动器相连,用来显示数据.P1口低4位与行驱动器相连,送出行选信号;P1.5~P1.7口则用来发送控制信号.P0口和P2口空着,在有必要的时候可以扩展系统的ROM和RAM.2列驱动电路列驱动电路有
采用中断方式,程序如下:#include#include#define uchar unsigned charsbit button = P3^2;uchar press = 0;uchar luishui = 0void Delay(uchar z){uchar x,y;for(x = x > 0; x
main(){unsigned char temp=0while(1){P1=temp= _crol_(temp,1);delay();}}
模拟串口方式0:#include"reg52.h"#define uint unsigned int #define uchar unsigned charsbit P3_2=P3^2; //模拟接受sbit P3_3=P3^3; //模拟发送uchar code smg[11]={0x03,0x9f,0x25,0x0
也许感兴趣的知识串口通信大全
RS232技术文摘枕善居收集整理http://www.elecfans.com
版权声明:本资料来自互联网,枕善居只负责聚合,原版权规原作者所有!枕善居不
负责任何责任! (我为人人,人人为我,枕善居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
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
以上规定说明了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
2、、连接器的机械特性:
连接器:由于RS-232C 并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9
各种类型的连接器,其引脚的定义也各不相同。下面分别介绍两种连接器。
(1)DB-25: PC 和XT 机采用DB-25型连接器。DB-25 连接器定义了25 根信号线,分
①异步通信的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 机及以后,已不支持。
(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
接器的引脚分配与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
发送数据(Transmitted data-TxD)——通过TxD终端将串行数据发送
到MODEM,(DTE→DCE)。
接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来
的串行数据,(DCE→DTE)。
有两根线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,即微机接口电路,如
Intel550)准备好,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
8 109 CF 载波信号检测Modem 正在接收另一端送来的信号DCD
12 接收信号检测(2) 在第二通道检测到信号√
13 允许发送(2) 第二通道允许发送√
14 118 发送数据(2) 第二通道发送数据√
15 113 DA 发送器定时为 Modem 提供发送器定时信号√
16 119 接收数据(2) 第二通道接收数据√
17 115 DD 接收器定时为接口和终端提供定时√
19 请求发送(2) 连接第二通道的发送器√
20 108 CD 数据终端准备好数据终端准备好DTR
22 125 振铃 振铃指示RI
23 111 CH 数据率选择选择两个同步数据率√
24 114 DB 发送器定时为接口和终端提供定时√
一、远距离通信
第 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
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
二、近距离通信:
当通信距离较近时,可不需要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 有效就能开始发
送和接收。
(1)RTS 与CTS 互联:只要请求发送,立即得到允许
(2)DTR 与DSR互联:只要本端准备好,认为本端立即可以接收(DSR、数传机准备好)。
2、零Modem标准连接:
如果想在直接连接时,而又考虑到RS-232C的联络控制信号,则采用零MODEM方式的
标准连接方法,其通信双方信号线安排如下1-2-3-4-5顺序所演示的那样。
无 Modem 的标准联线(7 线制)如图所示:
RS232技术文摘枕善居收集整理http://www.mndsoft.com
从中可以看出,RS-232C 接口标准定义的所有信号线都用到了,并且是按照DTE和DCE
之间信息交换协议的要求进行连接的,只不过是把DTE 自己发出的信号线送过来,当作对方
DCE 发来的信号,因此,又把这种连接称为双叉环回接口。
双方的握手信号关系如下(注:甲方乙方并未在图中标出):
(1)当甲方的DTE 准备好,发出
DTR 信号,该信号直接联至乙方的RI(振
铃信号)和DSR(数传机准备好)。即
只要甲方准备好,乙方立即产生呼叫
(RI)有效,并同时准备好(DSR)。尽
管此时乙方并不存在DCE(数传机)。
(2)甲方的RTS 和CTS 相连,并
与乙方的DCD 互连。即:一旦甲方请求
发送(RTS),便立即得到允许(CTS),
同时,使乙方的DCD有效,即检测到载
(3)甲方的TXD 与乙方的RXD相
连,一发一收。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
RS232技术文摘枕善居收集整理http://www.mndsoft.com
串口通信基本接线方法
目前较为常用的串口有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
· 不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必
须通过转换器才能连接;
· 线路焊接要牢固,不然程序没问题,却因为接线问题误事;
· 串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;
· 强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。
串口通讯的概念及接口电路
随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。这里所说的通信是只计算机与
外界的信息交换。因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由
于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信
息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部
设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,
采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微
机应用系统常用的接口。
许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送
方式,实际上,CPU与接口之间仍按并行方式工作。
1 串行通信的概念
所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据
在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。如图1-1所示。这种
通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须
要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。典型的串行接口的结构如1-2所
RS232技术文摘枕善居收集整理http://www.mndsoft.com
在数据输入过程中,数据1位1位地从外设进入接口的“接收移位寄存器”,当“接收移位寄存器”
中已接收完1个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输
入寄存器”中读取接收到的字符。(并行读取,即D7~D0同时被读至累加器中)。“接收移位寄存器”的
移位速度由“接收时钟”确定。
在数据输出过程中,CPU把要输出的字符(并行地)送入“数据输出寄存器”,“数据输出寄存器”
的内容传输到“发送移位寄存器”,然后由“发送移位寄存器”移位,把数据1位1位地送到外设。“发
送移位寄存器”的移位速度由“发送时钟”确定。
接口中的“控制寄存器”用来容纳CPU送给此接口的各种控制信息,这些控制信息决定接口的工作方
“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种
错误。例如,用状态寄存器的D5位为“1”表示“数据输出寄存器”空,用D0位表示“数据输入寄存器满”,
用D2位表示“奇偶检验错”等。
能够完成上述“串&- -&并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal
Asynchronous Receiver and Transmitter),典型的芯片有:Intel 550。
有关 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
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.是22#AWG的四芯电缆。附表2 DEC 公司
的实验结果
波特率1 号电缆传输距离(英尺) 2 号电缆传输距离(英尺)
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
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
该协议规定了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位,。
A 场:地址场,规定接收方地址,可为8 的整倍位。接收方检查每个地址字节的
第1 位,如果为“0”,则后边跟着另一
个地址字节。若为“1”,则该字节为最后一个地址字节。
C 场:控制场。指示信息场的类型,8 位或16 位。若第1 字节的第1 位为0,则
还有第2 个字节也是控制场。
I 场:信息场。要传送的数据。
FC 场:帧校验场。16位循环冗余校验码CRC。除F 场和自动插入的“0”位外,
均参加CRC计算。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
4、同步通信的“0位插入和删除技术”
在同步通信中,一帧信息以一个(或几个)特殊字符开始,例如,F 场=B。
但在信息帧的其他位置,完全可能出现这些特殊字符,为了避免接收方把这些特殊字
符误认为帧的开始,发送方采用了“0位插入技术”,相应地,接收方采用“0 位删除技术”。
发送方的0位插入:除了起始字符外,当连续出现5个1 时,发送方自动插入一个0。
使得在整个信息帧中,只有起始字符含有连续的6 个1。
接收方的“0位删除技术”:接收方收到连续6 个1,作为帧的起始,把连续出现5 个
1 后的0 自动删除。
5、同步通信的“字节填充技术”
设需要传送的原始信息帧为:
SOT DATA EOT
节填充技术采用字符替换方式,使信息帧的DATA 中不出现起始字符SOT和结束字符
设按下表方式进行替换:
DATA 中的原字符替换为
其中,ESC=1AH,X、Y、Z 可指定为任意字符(除SOT、EOT、ESC外)。
发送方按约定方式对需要发送的原始帧进行替换,并把替换后的新的帧发送给接收方。
例如图所示:
接收方按约定方式进行相反替换,可以获得原始帧信息。
6、异步通信和同步通信的比较
(1)异步通信简单,双方时钟可允许一定误差。同步通信较复杂,双方时钟的允许误
(2)异步通信只适用于点&--& 点,同步通信可用于点&--& 多。
(3)通信效率:异步通信低,同步通信高。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、
传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因
此,也叫做通信控制规程,或称传输控制规程,它属于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
异步(UART)(起止式)
INS8250 56K
RS232技术文摘枕善居收集整理http://www.mndsoft.com
Int8273 64K
Z-80 SIO 800K
3.有关串行通信的物理标准
为使计算机、电话以及其他通信设备互相沟通,现在,已经对串行通信建立了几个一
致的概念和标准,这些概念和标准属于三个方面:传输率,电特性,信号名称和接口标准。
1、传输率:所谓传输率就是指每秒传输多少位,传输率也常叫波特率。国际上规定了
一个标准波特率系列,标准波特率也是最常用的波特率,标准波特率系列为110、300、600、
、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.OSI协议和TCP/IP协议
RS232技术文摘枕善居收集整理http://www.mndsoft.com
(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
特点与格式:
起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开
始,以停止位结束,字符之间没有固定的时间间隔要求。其格式如图3 所示。每一个字符的
前面都有一位起始位(低电平,逻辑值0),字符本身有5~7 位数据位组成,接着字符后
面是一位校验位(也可以没有校验位),最后是一位,或意味半,或二位停止位,停止位后
面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开
始处一定有一个下跳沿。
从图中可以看出,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为
起始式协议。传送时,数据的低位在前,高位在后,图4 表示了传送一个字符E 的ASCAII
码的波形1010001。当把它的最低有效位写到右边时,就是E 的ASCII码H。
起/止位的作用:起始位实际上是作为联络信号附加进来的,当它变为低电平时,告
诉收方传送开始。它的到来,表示下面接着是数据位来了,要准备接收。而停止位标志一个
字符的结束,它的出现,表示一个字符传送完毕。这样就为通信双方提供了何时开始收发,
何时结束的标志。传送开始前,发收双方把所采用的起止式格式(包括字符的数据位长度,
停止位位数,有无校验位以及是奇校验还是偶校验等)和数据传输速率作统一规定。传送开
始后,接收设备不断地检测传输线,看是否有起始位到来。当收到一系列的“1”(停止位
或空闲位)之后,检测到一个下跳沿,说明起始位出现,起始位经确认后,就开始接收所规
定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼装成一个并行字
节,并且经校验后,无奇偶错才算正确的接收一个字符。一个字符接收完毕,接收设备有继
续测试传输线,监视“0”电平的到来和下一个字符的开始,直到全部数据传送完毕。
由上述工作过程可看到,异步通信是按字符传输的,每传输一个字符,就用起始位来
通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,
这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所
以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加
位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小
于19.2kbit/s)。在高速传送时,一般要采用同步协议。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
(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) 00001
文始(STX) 00010
组终(ETB) 00110
文终(ETX) 00011
同步(SYN) 10010
送毕(EOT) 10111
询问(ENQ) 01101
确认(ACK) 01110
否认(NAK) 11101
转义(DLE) 10000
数据透明的实现:面向字符的同步协议,不象异步起止协议那样,需要在每个字符前
后附加起始和停止位,因此,传输效率提高了。同时,由于采用了一些传输控制字,故增强
了通信控制能力和校验功能。但也存在一些问题,例如,如何区别数据字符代码和特定字符
代码的问题,因为在数据块中完全有可能出现与特定字符代码相同的数据字符,这就会发生
误解。比如正文有个与文终字符ETX 的代码相同的数据字符,接收端就不会把它当作为普通
数据处理,而误认为是正文结束,因而产生差错。因此,协议应具有将特定字符作为普通数
据处理的能力,这种能力叫做“数据透明”。为此,协议中设置了转移字符DLE(Data Link
Escape)。当把一个特定字符看成数据时,在它前面要加一个DLE,这样接收器收到一个DLE
就可预知下一个字符是数据字符,而不会把它当作控制字符来处理了。DLE 本身也是特定字
符,当它出现在数据块中时,也要在它前面加上另一个DLE。这种方法叫字符填充。字符填
RS232技术文摘枕善居收集整理http://www.mndsoft.com
充实现起来相当麻烦,且依赖于字符的编码。正是由于以上的缺点,故又产生了新的面向比
特的同步协议。
(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 可见,SDLC/HDLC的一帧信息包括以下几个场(Filed),所有场
都是从有效位开始传送。
(1)SDLC/HDLC 标志字符:SDLC/HDLC协议规定,所有信息传输必须以一个标志字符
开始,且以同一个字符结束。这个标志字符是,称标志场(F)。从开始标志到结
束标志之间构成一个完整的信息单位,称为一帧(Frame)。所有的信息是以帧的形传输的,
而标志字符提供了每一帧的边界。接收端可以通过搜索“”来探知帧的开头和结
束,以此建立帧同步。
(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协议规定以为标志字节,但
在信息场中也完全有可能有同一种模式的字符,为了把它与标志区分开来,所以采取了“0”
位插入和删除技术。具体作法是发送端在发送所有信息(除标志字节外)时,只要遇到连续
5 个“1”,就自动插入一个“0”,当接收端在接收数据时(除标志字节)如果连续收到5
个“1”,就自动将其后的一个“0”删除是,以恢复信息的原有形式。这种“0”位的插入
和删除过程是由硬件自动完成的。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
(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 {
RS232技术文摘枕善居收集整理http://www.mndsoft.com
DWORD dwProviderSubT
DWORD dwProviderO
DWORD dwProviderS
WCHAR wcProviderData[1];
} COMMCONFIG, *LPCOMMCONFIG;
在参数中,wVersion 要填 100h,dwProviderSubType 要填 1,但dwSize 就不能填sizeof
COMMCONFIG 了,我发现好象一定要把dwSize 设置为比 sizeof COMMCONFIG 对话框才能出
来,所以我用的代码中定义了一个足够大的缓冲区作为结构的地址:
_CommConfigDialog proc
local @stCC[256]:BYTE
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
_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
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
cmp al,'='
jz _BCD_Check
cmp al,','
_BCD_Check:
cmp al,'n'
;********************************************************************
; 扫描到 =n 或 ,n 则取消校验位
;********************************************************************
mov esi,_lpstDCB
and dword ptr [esi].fbits,not 0010b
_BuildCommDCB endp
4 Win32 通讯编程的一般流程
由于同步方式相对比较简单,在这里讲述的是异步方式的流程,在其他的很多文章里提到了
Windows 通讯 API 有二十多个,它们是:
BuildCommDCB
BuildCommDCBAndTimeouts
ClearCommBreak
ClearCommError
CommConfigDialog
EscapeCommFunction
GetCommConfig
GetCommMask
GetCommModemStatus
GetCommProperties
GetCommState
GetCommTimeouts
GetDefaultCommConfig
RS232技术文摘枕善居收集整理http://www.mndsoft.com
SetCommBreak
SetCommConfig
SetCommMask
SetCommState
SetCommTimeouts
SetDefaultCommConfig
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
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
WaitCommEvent 认为有 Event 发生,它就会马上返回,也许这并不是普遍的情况,但如果
你的程序也是停在了WaitCommEvent 的地方,不妨一试。
6 如何编写读线程中的循环
按照《Serial communications in Microsoft Win32》一文中的例程,读循环可以用:
#define READ_TIMEOUT 500 // milliseconds
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 creat abort.
if (!fWaitingOnRead) {
// Issue read operation.
if (!ReadFile(hComm, lpBuf, READ_BUF_SIZE, &dwRead, &osReader)) {
if (GetLastError() != ERROR_IO_PENDING) // read not delayed?
// Err report it.
fWaitingOnRead = TRUE;
// 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))
// Err report it.
// Read completed successfully.
HandleASuccessfulRead(lpBuf, dwRead);
RS232技术文摘枕善居收集整理http://www.mndsoft.com
// Reset flag so that another opertion can be issued.
fWaitingOnRead = FALSE;
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.
// Error in the WaitForSingleO abort.
// This indicates a problem with the OVERLAPPED structure's
// event handle.
这一段程序在 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
invoke ClearCommError,hCom,addr @dwError,addr @stComStat
.if eax == 0
invoke GetLastError
.if eax == ERROR_IO_PENDING
or dwFlag,IF_WAITING
RS232技术文摘枕善居收集整理http://www.mndsoft.com
;这里是线路状态的处理
;********************************************************************
; 如果没有在等待异步读的过程中,则读端口
;********************************************************************
.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
;这里是错误处理
and dwFlag,not IF_WAITING
mov eax,@dwBytesRead
.if eax != 0
;这里是接收到的数据处理
;********************************************************************
; 如果在异步读端口中,则等待一段时间
;********************************************************************
.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
;这里是接收到的数据处理
;这里是错误处理
invoke ClearCommError,hCom,addr @dwError,addr @stComStat
;这里是错误处理
RS232技术文摘枕善居收集整理http://www.mndsoft.com
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 根数据线传送数据信号。(可能还需要控制线和状态线,以及地
RS232技术文摘枕善居收集整理http://www.mndsoft.com
比如,计算机主机用串行接口连接显示终端,而显示终端带有键盘。这样,一方面键
盘上输入的字符送到主机内存;另一方面,主机内存的信息可以送到屏幕显示。通常,往键
盘上打入1个字符以后,先不显示,计算机主机收到字符后,立即回送到终端,然后终端再
把这个字符显示出来。这样,前一个字符的回送过程和后一个字符的输入过程是同时进行的,
即工作于全双工方式。
2、半双式方式(half duplex)
若使用同一根传输线既作接收又作发送,虽然数据可以在两个方向上传送,但通信双
方不能同时收发数据,这样的传送方式就是半双工制,如图2 所示。采用半双工方式时,通
信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,
会产生时间延迟。收/发开关实际上是由软件控制的电子开关。
当计算机主机用串行接口连接显示终端时,在半双工方式中,输入过程和输出过程使
用同一通路。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在
发送到主机的同时就被送到终端上显示出来,而不是用回送的办法,所以避免了接收过程和
发送过程同时进行的情况。
目前多数终端和串行接口都为半双工方式提供了换向能力,也为全双工方式提供了两
条独立的引脚。在实际使用时,一般并不需要通信双方同时既发送又接收,像打印机这类的
单向传送设备,半双工甚至单工就能胜任,也无需倒向。
浅析 PC 机串口通讯流控制
我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控
制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,
流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。
1.流控制在串行通讯中的作用
这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,
或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发
送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决
这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可
以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 PC机中常用
的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止),下面分
RS232技术文摘枕善居收集整理http://www.mndsoft.com
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’,其各位为:
由于干扰,可能使位变为1,这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,
叫“检错”。发现错误后,如何消除错误,叫“纠错”。
最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校
验或偶校验。
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
RS232技术文摘枕善居收集整理http://www.mndsoft.com
奇偶校验能够检测出信息传输过程中的部分误码(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的串口的编号
例用&19200,N,8,1&表示传输速率为19200bps,没有奇偶校验位,8 位数据位,1位停止位。
设置或返回通信参数。
Handshaking
0 没有握手协议,不考虑流量控制。
RS232技术文摘枕善居收集整理http://www.mndsoft.com
1XON/XOFF,即在数据流中嵌入控制苻来进行流控。
2RTS/CTS,既由信号线RTS/CTS自动进行流量控制(常用)。
3 两者皆可。
设置或返回硬件握手协议,指的是PC机MODEM之间为了控制流速而约定的内部协议。
True/False可以打开/关闭端口。
打开或关闭端口。
OutBufferSize
传输缓冲区的字节数,如选1024。
设置或返回传输缓冲区大小。
Variant 型变量。
向传输缓冲区写数据流。
传输文本数据时,应将String型数据放入Variant 变量,传输二进制数据(即按字节)时,应
将Byte 型数组数据放入Variant 变量
InBufferSize
接收缓冲区的字节数,如选1024。
设置或返回接收缓冲区大小。
0 用Input 属性接收文本型数据。
1 用Input 属性接收二进制数据。
设置或返回接收数据的数据类型。
InBufferCount
Integer 型
返回接收缓冲区中已传到但还未取走的字符个数。
当 InputMode 属性值为0(文本模式)时,变量中含String型数据。
当 InputMode 属性值为1(二进制模式)时,变量中含Byte 型数组数据。
将接收缓冲区中收到的数据读入变量。
DTREnabled
RTSEnabled
DSRHolding
CTSHolding
均取值TRUE/FALSE
用于读取或控制pc 机与modem之间的交互状态。需运用好。例如,应在读取到DSRHolding
属性值为TRUE 时再向MODEM 发出命令。应当在载波检测到以后(CDHolding 属性为TRUE)时
再向MODEM发送数据。
三、MSCOMM控件的触发事件
MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发
时机。主要有以下几个:
(1)CommEvent=1 时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)
RS232技术文摘枕善居收集整理http://www.mndsoft.com
(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
MSComm1.DTREnable=False
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
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
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&LF& '循环发送
If LF&-Loc(hSend)&BSIZE Then
BSIZE=LF&-Loc(hSend)
ReDim Sendarr(1 To BSIZE)
Get hSend ,, SENDARR '从文件取字节放入字节数组
Sendvar=Sendarr '转放到Variant 型变量
'当CTS 线及CD 线为高电平时才可发送,否则需等待。
T=Timer+60
If MSComm1.CTSHolding And MSComm1.CDHolding Then
MSComm1.Output=Sendvar '发送
Sum = Sum + BSIZE'累加计数
If Timer & T Then
Go To L '循环等待
Go To CLOSEFILE '等待时间超过60 秒则退出
'等待系统处理完
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
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)
MSComm1.InputLen=N
DATA=MSComm1.Input
'其它case情况略
End Select
7、关于接收到的数据的处理例程:
Public Static Sub HandleData (Disp As Control,N As Long,DATA As Variant)
'参数:Disp(文本框,用于显示接受数据)
'N 为本次接收到的字节数
'DATA(接收到的数据.Variant型)
If not mscomm1.InputMode=0 Then '接收的是字符串
Disp.SelStart = Len ( Disp.Text)
Disp.SelLength = 0
Disp.SelText = DATA '显示字符数据
If InStr(1,Disp.Text,S_FILESTAR,0)=0 Then '若没有开始标志就结束此过程
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
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 '本次已累计收到的字节数
接口技术的基本知识
CPU与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O 接
口,而后者则被称为存储器接口。存储器通常在CPU 的同步控制下工作,接口电路比较简
单;而I/O 设备品种繁多,其相应的接口电路也各不

我要回帖

更多关于 单片机简单I/O口控制 的文章

 

随机推荐