当前位置:文档之家› 232-485串口通信详解

232-485串口通信详解

232-485串口通信详解
232-485串口通信详解

收集:https://www.doczj.com/doc/ae7710018.html,

欢迎工控人登录下载更多资料

串口通信详解

一、RS-232

RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-232-C 是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS 是英文“推荐标准”的缩写,232为标识号,C 表示修改次数。RS-232-C 总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232-C 标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。RS-232-C 标准规定,驱动器允许有2500pF 的电容负载,通信距离将受此电容限制,例如,采用150pF/m 的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m 以内的通信。

目前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适合本地设备之间的通信。

RS232C串口通信接线方法(三线制)

首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连

同一个串口的接收脚和发送脚直接用线相连 对9针串口和25针串口,均是2与3

直接相连;

两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)

上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接。

表1

二、RS485和RS422

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-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

RS-422电气规定

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

RS-485电气规定

由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,参见图6。

而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进, 无论四线还是二线连接方式总线上可多接到32个设备。参见图7。

图6 图7

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传输线上匹配的一些说明

对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,只有满足上述条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。以图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,网络中从机将把其解释为一个新的启动位,并试图读取后续字节,由于永远不会有停止位,产生一个帧错误结果,不再有设备请求总线,网络陷于瘫痪状态。除上述所述的总线空闲会造成两线电压差低于200mV的情况外,开路或短路时也会出现这种情况。故应采取一定的措施避免接收器处于不确定状态。

图13

通常是在总线上加偏置,当总线空闲或开路时,利用偏置电阻将总线偏置在一个确定的状态(差分电压≥-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、气体放电管等)将危害性的瞬态能量旁路到大地,优点是成本较低,缺点是保护能力有限,只能保护一定能量以内的瞬态干扰,持续时间不能很长,而且需要有一条良好的连接大地的通道,实现起来比较困

难。实际应用中是将上述两种方案结合起来灵活加以运用,如图14。在这种方法中,隔离接口对大幅度瞬态干扰进行隔离,旁路元件则保护隔离接口不被过高的瞬态电压击穿。

常见的I/O设备及其与PC间的连接方法

1、PC-Based设备

常见的PC-Based设备及其通讯连接方式见表。

常见的PC-Based设备及其通讯连接方式

2、PLC 设备

常见的PLC 设备及其通讯连接方式见表。

常见的PLC 设备及其通讯连接方式

3、智能指示、控制仪表及控制器

目前国内外的智能仪表厂商有数千家,产品种类繁多,难以归纳,其中数字指示仪、单(多)回路调节器、流量积算仪、智能终端、楼宇自控设备所占比重较大,这里不一一列举。这些仪表与计算机间的通讯方式以RS485居多,但越来越多的产品会增加现场总线的通讯接口,智能控制器、楼宇自控设备使用现场总线的较多(如LonWorks、C-Bus 等)。在这

方面较有影响的厂商有霍尼韦尔、横河、富士电机、山武、欧陆、慕尔、ABB、H&B、梅特勒-托利多、GEFRAN等。

计算机与PLC的通讯

可编程序控制器(PLC)都有一个编程口。以日本三菱公司生产的PLC为例(包括FX 系列和A系列),其编程口为RS-422格式,根据PLC型号不同又分为8针座编程口和25针座编程口。对于后者,可直接将SC—08编程电缆将PLC的编程口和微型计算机的RS—232口连接起来;对于后者,则还需要一根转换电缆将PLC 的8针座编程口和25针编程电缆相连。无论何种情况,一旦将PLC用户程序由微型计算机编程环境传到PLC 用户程序区,其编程口大多就没有被再利用。其实,这是一种浪费。也就是说,可利用此编程口实现微型计算机和PLC 的数据通讯,将PLC的工作状态纳入微型计算机管理之下。

编程口操作命令类型与通讯端口初始化

串行通讯是计算机与其它机器之间进行通讯的一种常用方法,在WINDOWS操作系统中提供了实现各种串行通讯的API函数。通过SC—08编程电缆或FX232AW模块,可将微型计算机的串行通讯口RS—232和PLC 的编程口连接起来,这样微型计算机就可对PLC的RAM 区数据进行读、写操作。由PLC本身所具有的特性,可对PLC进行以下四种类型的操作: (1)位元件或字元件状态读操作(CMD0);

(2)位元件或字元件状态写操作(CMD1);

(3)位元件强制ON操作(CMD7);

(4)位元件强制OFF操作(CMD8)。

另外,在进行上述四类操作以前,首先要对端口进行初始化操作,即设定通讯协议(包括设置通讯波特率、数据位数、数据停止位及奇偶校验)。在WINDOWS的SDK中定义了一个结构DCB,该结构详细地说明了如何对通讯端口进行控制,所以通讯端口的初始化也是围绕着对这个结构的正确设置为中心进行的。用VC++语言实现端口初始化如下: BOOL CSerial::Open(int nPort)

{

//nPort 为微型计算机串行通讯口端口号。nport=1为端口1;nPort=2为端口2。

char szPort\[15\];

DCB dob;

m_hIDComDev=CreateFile(szPort, GENERIC_READ│

GENERIC_WRITE,O,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL│

FILE_FLAG_OVERLAPPED,NULL);

dcb.DCB1ength=sizeof(DCB);

GetCommState(m_hIDComDev,&dcb);//取得通讯资源当前设置

dcb.BaudRate=9600;//设定波特率为9600

dcb.ByteSize=7;//7数据位

dcb.Parity=2;//偶校验

dcb.StopBits=0;//设定1个停止位

if(SetCommState(m_hIDComDev,&dcb)return(TRUE);

else return(FALSE);//设置端口,若设置成功则返回TRUE,否则返回FALSE

需要说明的是CSerial是一个用于串行通讯的类,它包含了进行串行通讯的所需的函

数。除上述端口初始化成员函数Open外,还包括另两个重要成员函数:一个是endData,把数据从一个缓冲区发送到串行端口。另一个是ReadData,从端口的接收缓冲区中读入数据。

其次,在每进行一次上述四类操作中的一种操作以前,还要进行握手联络。对PLC发请求讯号ENQ(代码为OX05),然后读PLC 的响应讯号。如果读到的响应讯号为ACK(代码为OX06),则表示PLC已准备就绪,等待接收通讯数据。握手联络VC++语言示PLC已准备就绪,等待接收通讯数据。握手联络VC++语言实现为:

BOOL CNTJD1g::ReadFromPLC(char *Read_char char *Read_address,int Read_bytes) {

CSerial Serial;//用于串行通讯的类

char read_BUFFER;

if(Serial.Open(2)//初始化串行口通讯口COM2

{ Serial.SendData(&ENQ_request,1);//发送联络讯号

Sleep(1000);//等待1秒钟

Serial.ReadData(&read_BUFFER,1);//读取PLC响应讯号

if(read_BUFFER==ACK)

{ 如果PLC响应讯号等于ACK,则进行上述四种操作:}}

Serial.Close()://操作完毕后,关闭通讯口

}

编程口命令操作

(1)位元件或字元件状态读操作

操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式:

说明:①为读命令起始标志STX,代码为OX02;

②为位元件或字元件状态读命令CMDO,命令代码为OX30;

③为读位元件或字元件的4位起始地址,高位先发,低位后发,且是以ASCII码的形式发送;

④为一次读取位元件或字元件的个数,最多一次可读取OXff个字节的元件,以ASCII 码的形式发送;

⑤为停止位标志ETX,代码为OX03;

⑥为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。

在发送完上述命令格式代码后,就可直接读取PLC响应的信息。响应信息格式如下:

VC++语言实现:

BOOL CNTJDlg::ReadFromPLC(char *Read_char char

*Read_address, int Read_bytes)

{

char senddatasum_CHECK\[2\];char readdatasum_CHECK\[2\]; char

total_DATABYTES\[2\];

char readdatasum_check\[2\];int readdata_sum;

int datasum_check=0; int i;

Serial.SendData(&STX_start,1);/向PLC发送“开始”标志代码

Serial.SendData(&CMDO_read,1);//发送“读”命令代码datasum_check+=CMDO_read;

for(i=0;i<4;i++){Serial.SendData(&Read_address\[i\],1);//发送起始元件地址的ASCII代码datasum_check+=Read_address\[i\];}

Change to ASCII(total DATABYTES,Read_bytes);//将字节数转化成ASCII代码

for (i=0;i<2;i++){Serial.SendData(&total_DATABYTES\[i\],1);//发送元件字节数的ASCII代码)datasum_check+total_DATABYTES\[i\];}

Serial.SendData(&ETX_end,1);//发送“结束”标志代码senddatasum_CHECK+ETX_end;

Change_to_ASCII(senddatasum_CHECK,senddatasum_CHECK);//将“和”转化成ASCII 码

for (i=0;i<2;i++) Serial.SendData(&senddatasum_CHECK\[i\],1);

Sleep(1000);//等待PLC响应

Serial.ReadData(&read_BUFFER,1);

if(read_BUFFER==STX_start){

readdata_sum=0;

for(i=0;i<2*Read_bytes;i++){Serial.ReadData(&Read_char\[i\],1);//读Read_bytes个字节readdata_sum+Read_char\[i\];}

Serial.ReadData(&read_BUFFER,1);

if(read_BUFFER==ETX_end){Serial.ReadData(readdatasum_CHECK,2);//读入的“和”的低2位ASCII码Readdata_sum+=ETX_end;}

Change_to_ASCII(readdatasum_check,readdata_sum);//将计算得到的“和”转化成ASCII码

if(*readdatasum_CHECK==*readdatasum_check)//“和”校验

{ AfxMessageBox(“数据读出成功!”)return TRUE;}

else { AfxMessageBox(“校验错误”)return FALSE.}

}

(2)位元件或字元件状态写操作

操作对象元件:同3(1);命令格式:

说明:①为写命令起始标志STX,代码为OX02;

②为位元件或字元件状态写命令CMD1,命令代码为OX31;

③为写位元件或字元件的4位起始地址,高位先发,低位后发,且是以ASCII码的形式发送;

④为一次写入位元件或字元件的个数,以ASCII码的形式发送;

⑤为待写到PLC RAM区的数据DATA,以ASCII码形式发送;

⑥为停止位标志ETX,代码为OX03;

⑦为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。

VC++语言实现:

BOOL CNTJDlg::WritePLC(char *data_ADDRESS,char *Write_ASC,int bytesnumber) {

char total_BYTES\[2\];char senddatasum_CHECK\[2\];

char read_BUFFER;char read_finishBUFFER;

int datasum_check=0; int i=0;

Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码

datasum_check=0;Serial.SendData(&CMD1_write,1);//发送“写”命令代码

datasum_check+CMD1_write;

for(i=0;i<4;i++) {Serial.SendData(&data_ADDRESS\[i\],1);//发送起始元件地址的ASCII码

datasum_check+=data_ADDRESS\[i\];

Change_to_ASCII(total_DATABYTES,bytesnumber);//将字节数转化成ASCII码 for(i=0;i<2;i++)

{

Serial.SendData(&total_BYTES\,1);//发送元件字节数的ASCII代码

datasum_check+=total_BYTES\[i\];}

for {i=0;i

{

Serial.SendData(&Write_ASC\[i\],1);//发送要写入的数据的ASCII码

datasum_check+=Write_ASC\[i\];}

Serial.SendData(&ETX_end,1);//发送“结束”标志代码

datasum_check+=ETX_end;

Change_to_ASCII(senddatasum_CHECK,datasum_check);//将“和”转化成ASCII码 Serial.SendData(&senddatasum_CHECK,2);

Sleep(1000); Serial.ReadData(&read_finishBUFFER,1);

if (read_finishBUFFER==ACK_reply)

{AfxMessageBox(“数据写入 OK”)return TRUE;}

else {AfxMessageBox(“数据写入失败”)return FALSE。}

(3)位元件强制ON操作

操作对象:X、Y、M、S、T、C元件;

命令格式:

说明:①为强制ON命令起始标志STX,代码为OX02;

②为强制ON命令CMD7,命令代码为OX37;

③为强制ON位元件4位起始地址,高位先发,低位后发,是以ASCII码形式发送;

④为停止位标志ETX, 代码为OX03;

⑤为2位和校验,和累计为②、③、④项代码,取其和低两位转化成ASCII码,高位先发,低位后发。

VC++语言实现:

void NTJDlg::ForceOnOperation (char *ON_Address)

{ int i;

char│syn_Check\[2\];

char read_buffer;

int Sum=0;

Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码

Serial.SendData(&CMD7_ForceON,1);//发送“ON”命令代码

Sum+=CMD7 ForceON;

for (i=0; i<4; i++) {Serial.SendData(&ON_Address\[i\],1)//发送起始元件地址的ASCII码

Sum+=ON_Address\[i\];}

Serial.SendData(&ETX_end,1);//发送“结束”标志代码Sum+=ETX_end;

Change_to_ASCII(Sum_Check,Sum);//将“和”转化成ASCII码

Serial.SendData(&Sum_Check,2);

Sleep(1000);

Serial.ReadData(&read_buffer,1);

if(read_finishBUFFER==ACK_reply) AfxMessageBox(“ON 操作 OK”);

else AfxMessageBox(“ON 操作失败”)。

}

(4)位元件强制OFF操作

操作对象L同3(3);命令格式:

说明:①为强制OFF命令起始标志STX,代码为OX02;

②为强制OFF命令CMD8,命令代码为OX38H;

③为强制OFF位元件4位起始地址,高位先发,低位后发,以ASCII码形式发送;

④为停止位标志ETX,代码为OX03;

⑤为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。

VC++语言实现:

void NTJDlg::ForceOffOperation (char *OFF_Address)

{

int i;

char Sum_Check\[2\];

char read_buffer;

int Sum=0;

Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码

Serial.SendData(&CMD8_ForceOFF,1);//发送“OFF”命令代码

Sum=CMD8_ForceOFF;

for (i=0;i<4;i++) {

Serial.SendData(&OFF_Address\[i\],1);//发送起始元件地址的ASCII码

Sum+=OFF_Address\[i\];}

Serial.SendData(&ETX_end,1);//发送“结束”标志代码

Sum+=ETX_end;

Change_to_ASCII(Sum_Check,Sum);//将“和”转化成ASCII码

Serial.SendData(&Sum_Check,2);

Skeeo(1000);

Serial.ReadData(&read_buffer,1);

if(read_fininhBUFFER==ACK_reply) AfxMessageBox(“OFF 操作 OK ”);

else AfxMessageBox(“OFF 操作失败”)。

注意:必须严格按照上述四种操作命令格式进行发送,在发送前,起始地址、数据、数据个数、校验和都必须按位转换成ASCII码。从PLC读到的数据亦是ASCII码形式,需要经过适当转换才能利用。另外,要注意强制命令地址与读写地址的顺序不是一样,且一次最多只能传送64个字节数据。

利用上述四种操作命令,就可对PLC的RAM区数据进行管理操作。将PLC的工作状态纳入微型计算机管理之下。在此基础上,用户可以应用VC很方便地设计自己的PLC人机接口界面,为监控与管理PLC的运行提供一种良好的方法。

收集:https://www.doczj.com/doc/ae7710018.html,

欢迎工控人登录下载更多资料

RS232串口通信详解

RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422) 通信原理知识2010-01-03 20:53 阅读1 评论0 字号:大中小RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422) 串口是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 信号方向来 9芯 缩写描述 自 1调制解调器CD载波检测 2调制解调器RXD接收数据 3PC TXD发送数据 4PC DTR数据终端准备好 5GND信号地 6调制解调器DSR通讯设备准备好 7PC RTS请求发送 8调制解调器CTS允许发送 9调制解调器RI响铃指示器

两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。 --------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: --------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。 b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一

用C#一步步写串口通信分析解析

我们来看具体的实现步骤。 公司要求实现以下几个功能: 1):实现两台计算机之前的串口通信,以16进制形式和字符串两种形式传送和接收。 2):根据需要设置串口通信的必要参数。 3):定时发送数据。 4):保存串口设置。 看着好像挺复杂,其实都是纸老虎,一戳就破,前提是你敢去戳。我尽量讲的详细一些,争取说到每个知识点。 在编写程序前,需要将你要测试的COM口短接,就是收发信息都在本地计算机,短接的方式是将COM口的2、3号针接起来。COM 口各针的具体作用,度娘是这么说的:COM口。记住2、3针连接一定要连接牢固,我就是因为接触不良,导致本身就不通,白白花掉了一大半天时间调试代码。 下面给出主要的操作界面,如下:

顺便,我将所有控件对应的代码名字也附上了,相信对初学者来说,再看下面的代码会轻松很多。控件名字命名的方法是“控件名+作用”的形式,例如“打开串口”的开关按钮,其名字是btnSwitch (btn就是button的简写了)。我认为这种命名控件的方式比较好,建议大家使用,如果你有好的命名方式,希望你能告诉我! 下面我们将各个功能按照从主到次的顺序逐个实现。(我分块给出代码实现,详细代码见链接:《C#串口通信工具》)

一、获取计算机的COM口总个数,将它们列为控件cbSerial的候选项,并将第一个设为cbSerial的默认选项。 这部分是在窗体加载时完成的。请看代码: (很多信息代码的注释里讲的很清楚,我就不赘述了。) [csharp]view plaincopyprint? 1.//检查是否含有串口 2. string[] str = SerialPort.GetPortNames(); 3. if (str == null) 4. { 5. MessageBox.Show("本机没有串口!", "Error"); 6. return; 7. } 8. 9. //添加串口项目 10. foreach (string s in System.IO.Ports.SerialPort.GetPortNames()) 11. {//获取有多少个COM口 12. cbSerial.Items.Add(s); 13. } 14. 15. //串口设置默认选择项

RS232串口通信详解

计 协议 --------------------------------- 9 来 缩写 1调 调 CD载 检测 2调 调 RXD 数 3PC TXD 数 4PC DTR数 终 5GND 6调 调 DSR 讯 7PC RTS请 8调 调 CTS 许 9调 调 RI 连 时 数 针 数 针 连 对应 --------------------------------- 1 RS-23 2 远 50 2 RS232 传 讯 传 20kbps 3 RS-232C 传 数 负逻辑 对称 逻辑1 -3 -15V 逻辑0 +3 +15V 单 连 时 转换

--------------------------------- 数 a RS-232-C标 规 数 传 为 50 75 100 150 300 600 1200 2400 4800 9600 19200 b 数 标 5 7 8 传 标 ASCII码 0 127 7 扩 ASCII码 0 255 8 c 单 为1 1.5 2 数 传 线 时 时 现 仅仅 传 结 计 时 d 验 简单 检错 对 验 验 数 传 数 逻辑 数 011 对 验 验 为0 证逻辑 数 数 验 验 1 这 3 逻辑 --------------------------------- 传 线 闲时 线 TTL RS232 数 开 RS232线 为 结 时Rs232为 数 传 读数时 数 对 16进 数 55aaH 当 8 数 1 传 时 线 图1(TTL ) 图 2(RS-232 ) 55H=01010101B 10101010B 1 0 55H 数 为1010101010B aaH=10101010B 01010101B 1 0 55H 数 为1101010100B

RS232串口通信

RS232串口通信小结 在Microsoft Windows下开发串口通信程序通常有如下几种方法: 利用wIndowsAPI 通信函数。 利用Windows 的读写端口函处_inp,-inpw,_inpd,_outp,_outpw,_outpd(Windows 95系列下)或开发驱动程序(Windows NT系列下)直接对串口进行操作。 利用第三方提供或自己编写的通信类. 使用串口通信组件,如ActiveX控件MSComm。 以下几种方法中第一种(即API函数法)使用面较广,但由于比较复杂,使用较困难。第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高。第三种方法使用面向对象技术封装W1n32API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方使地使用,但编写能普通应用的这种类相当困难。第四种方法较简单,只需要对串口进行简单配置,唯一比较困难的地方在于令人费解的V ARIANT类。 以下只简单介绍第一种(利用Windows API函数)和第四种(使用串口通信组件)方法API函数法(即第一种方法)可以说是在Windows环境下编写串口通信程序的基本方法,下面介绍的大部分内容对于其他3种方法都能适用。 第一种:API函数法 1.API函数法 与以往DOS下串口通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在WED32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win32提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。 API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列很复杂的函数和消息集合,它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。与串口通信有关的Windows API函数大概有20多个,如下所示: BuildCommDCB BuildCommDCBAndTimeouts ClearCommBreak ClearCommError CommConfigDialog EscapeCommFunction GetCommConfig GetCommMask GetCommModemStatus GetCommProperties GetCommState GetCommTimeouts GetDefaultCommConfig PurgeComm SetCommBreak SetCommConfig SetCommMask SetCommState

RS232串口通讯详解

串口通讯—RS-232-C详解 蓝鸟发表于 2005-9-22 16:19:34 串行通信接口标准经过使用和发展,目前已经有几种。但都是在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串口通信详解

串口就是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 9芯信号方向来自缩写描述 1调制解调器CD载波检测 2调制解调器RXD接收数据 3PC TXD发送数据 4PC DTR数据终端准备好 5GND信号地 6调制解调器DSR通讯设备准备好 7PC RTS请求发送 8调制解调器CTS允许发送 9调制解调器RI响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离就是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值就是5、7与8位,如何设置取决于您想传送的信息。比如,标准的ASCII码就是0~127(7位);扩展的ASCII码就是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1、5与2位。由于数就是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅就是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶与奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据就是011,那么对于偶校验,校验位为 0,保证逻辑高的位数就是偶数个。如果就是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式: 串行通信中,线路空闲时,线路的TTL电平总就是高,经反向 RS232的电平总就是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总就是从低位向高位一位一位的传输。示波器读数时,左边就是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)与图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

51单片机串口通信的原理与应用流程解析

51单片机串口通信的原理与应用流程解析 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。

WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下: 函数名作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口 用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、创建串口句柄,用CreateFile; 2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数; 4、读写结束后,要关闭串口句柄,用CloseFile。 下面依次讲述各个步骤的过程。

串行通讯原理说明--RS232_UART

串行通讯原理说明--RS232,UART电平等介绍 串行通讯:一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。 串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。 能够完成上述“串<- ->并”转换功能的电路,通常称为“通用异步收发器” (UART:Universal Asynchronous Receiver and Transmitter), 典型的芯片有:Intel 8250/8251,16550。 EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上:逻辑1(MARK) =-3V~-15V 逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压) = -3V~-15V 数据传输时,低位在前,高位在后 数据位:1位、2位 停止位:1位、1.5位、2位 .流控制在串行通讯中的作用 解决丢失数据的问题 .硬件流控制 硬件流控制常用的有RTS/CTS(请求发送/清除发送)流控制和DTR/DSR(数据终端就绪/ 数据设置就绪)流控制 .软件流控制 一般通过XON/XOFF来实现软件流控制。 奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 1 0110,0101 0 0110,0001 偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如: 1 0100,0101

串口通信原理

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC- 51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为: 波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则 TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取P0端口数据,并将读取数据返回PC机; 0xA2:单片机从PC机接收一段控制数据; 0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口

C#串口通信:MSComm控件使用详解

C#串口通信:MSComm控件使用详解 目次 MSComm 控件两种处理通讯的方式 CommPort 属性 RThreshold 属性 CTSHolding 属性 SThreshold 属性 CDHolding 属性 DSRHolding 属性 Settings 属性 InputLen 属性 EOFEnable 属性 Handshake 常数 OnComm 常数 InputMode 常数 错误消息 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 1.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。 1.2 查询方式 查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 2.MSComm 控件的常用属性 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述:

RS232串口通信详解

串口是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式:串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一 位一位的传输。示波器读数时,左边是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

RS232串口通信详解

串口是计算机上一种非常通用的 设备通信协议。 串口的电气特性: 1) RS-232串口通信最 远距离是50英尺 2) RS232可做到双向 传输,全双工通 讯,最高 传输速率20kbps 3) RS-232C 上传送的数字量采用 负逻辑,且与地 对称 逻辑1 : -3?- 15V 逻辑0 : +3?+15V 所以与单片机连接时常常需要加入 电平转换芯片: 9芯 信号方向来自 缩写 描述 1 调制解调器 CD 载波检测 2 调制解调器 RXD 接收数据 3 PC TXD 发送数据 4 PC DTR 数据终端准备好 5 GND 信号地 6 调制解调器 DSR 通讯设备准备好 7 PC RTS 请求发送 8 调制解调器 CTS 允许发送 9 调制解调器 RI 响铃指示器 两个串口连接时,接收数据 针脚与发送数据针脚相连,彼此交叉,信号地 对应相接即可。 串口的引脚定义:

串口通信参数: a )波特率: RS-232-C 标准 规定的数据传输速率 为每秒50、75、 100、150、300、600、1200、2400、 4800、9600、19200波特。b )数据位:标准的值是5、7和8位,如何 设置取决于你想 传送的信息。比如, 标准的 ASCII 码是0?127 ( 7位);扩 展的ASCII 码是0?255 ( 8位)。 c )停止位:用于表示 单个包的最后一位,典型的 值为1, 1.5和2位。由于数是在 传输线 上定时的,并且 每一个设备 有其自己的 时钟,很可能在通信中两台 设备间出现了小小的不同 步。因此停止位不 仅仅是表示传输的结束,并且提 供计算机校正 时钟同步的机会。 d )奇偶校 验位:在串口通信中一 种简单的检错方式。对于偶和奇校 验的情况,串 口会设置校验位(数据位后面的 一位),用一个 值确保传输的数据有偶个或者奇个 逻辑高位。例如,如果数据是 011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校 验,校验位位1 ,这样就有3个逻辑高位。 ---------------------- 串口通信的传输格式: 串行通信中, 线路空闲时,线路的TTL 电平总是高,经反向 RS232的电平总是低。一个数据的 开始RS232线路为高 电平,结束时Rs232为低电平。数据 总是从低位向高位一 位一位的 传输。示波器 读数时,左边是数据的高位。 例如,对于16进制数据55aaH ,当采用8位数据位、1位停止位 传输时,它在信号 线上的波形如 图1(TTL 电平)和图 2(RS-232电平)所示。 55H=01010101B ,取反后10101010B ,加入一个起始位 1,一个停止位 0, 55H 的数据格式 为1010101010B ; aaH=10101010B ,取反后01010101B ,加入一个起始位 1, 一个停止位 0 , 55H 的数据格式 为1101010100B ; OJu - IC7 2 15 —T ——V+ VOC — C2+ C1+ d GND 5 NC 4 NC r~Nc 3 RXD 7 NC rfxp 6 NC - NC14 NC13 C2- Cl- Tlout Tlin T2oirt T2in Rlin 尺 lout 11 NC 10 TXD 12 NC V- GND MAX232 K6 9 RXD R2i n R2ou t +5V CU O.lu 土中 I'

串口通信原理

串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波

特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB 设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。 c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时 也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile; ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

RS232串口通信基本知识与实例

1,RS232串口通信基本知识 (1)目前较为常用的串口是9针串口(DB9。通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口;若距离较远,需附加调制解调器(MOD EM)。 (2)RS232C串口通信接线方法(三线制) 接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接 (3)DB9接口三线引脚定义 2 ---- RXD 接收数据 3 ---- TXD 发送数据 5 ---- GND 信号地 (4)串行通信方式 1)单工:信息只能单向传送 2)半双工:信息可双向传送但不能同时进行 3)全双工:信息可同时进行双向传送 (5)RS232逻辑电平 逻辑0电平规定为+5 ~ +15V之间;逻辑1是电平为-5 ~ -15V之间,因此在与单片机进行通信时需要进行电平转换 (6)RS232串行通信接口电路设计 (7)51单片机串行通信接口软件设计 1)两个重要指标:可靠性和速度,可靠性是第一位。 2)与串口通信相关的几个寄存器和控制位 TMOD:可以用它来设置定时器工作方式(如果在MCU中使用的是定时器来产生波特率,就需要对这个寄存器进行设置,通常设为0x20,即设置定时器1为8位自动重装定时器,即工作方式1) TH1和TL1:定时器1初始值(可通过波特率计算软件获得) TR1:开启定时器1 SCON:串口控制寄存器,通常设为0x50,即10位异步传输,由定时器1

产生波特率,无奇偶校验位,允许接收 PCON:这个寄存器主要用到它的最高位SMON,当最高位设为1时,原波特率加倍 ES:串口中断使能位 EA:全局中断使能位 3)波特率计算方法(使用一个名为“51波特率初值计算.exe”的小软件)第1步:选择定时器工作方式(方式2) 第2步:输入晶振值(11.0592) 第3步:选择波特率(9600) 第4步:设置SMOD值(0) 第5步:点击确定 第6步:将软件上显示值赋给TH1和TL1 4)串口初始化程序 void Initial_RS232(unsigned char rate) { //默认晶振值为11.0592MHz unsigned char Reload1; switch(rate) //根据拨码器设置波特率 { case 0: Reload1 = 0xE8; //2400bps break; case 1: Reload1 = 0xF4; //4800bps break; case 2: Reload1 = 0xFA; //9600bps break; case 3: Reload1 = 0xFD; //19200bps break; default: Reload1 = 0x00; break; } PCON = PCON|0x80; //SMOD = 1 ;波特率加倍 TMOD = 0x20; //0011,00010设置定时器1为8位自动重装计数器 SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位 TH1 = Reload1; //设置定时器1自动重装数 TL1 = Reload1; TR1 = 1; //开定时器1 ES = 1; //允许串口中断 EA = 1; //开总中断 }

51单片机串口通信(相关例程)

51单片机串口通信 1./*打开串口调试程序,将波特率设置为9600,无奇偶校验 晶振11.0592MHz,发送和接收使用的格式相同,如都使用 字符型格式,在发送框输入hello,I Love MCU ,在接 收框中同样可以看到相同字符,说明设置和通信正确*/ #include /*主程序*/ void main (void) { SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload*/ TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ ES = 1; /*打开串口中断*/ while (1) /*主循环不做任何动作*/ { } } void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于观察 SBUF=Temp; //把接收到的值再发回电脑端 } if(TI) //如果是发送标志位,清零 TI=0; } 2.51单片机与电脑串口通信的C程序,最好是中断方式的 #include #include unsigned char ch; bit read_flag= 0 ; void init_serialcom( void ) //串口通信初始设定 { SCON = 0x50 ; //UART为模式1,8位数据, 允许接收 TMOD |= 0x20 ; //定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz IE |= 0x90 ; //Enable Serial Interrupt TR1 = 1 ; // timer 1 run

RS232串口通信的问题

串口调试工具中的DTR和RTS是什么意思 RS-232C接口定义(DB9) 引脚定义符号 1 载波检测 DCD(Data Carrier Detect 数据载波检测) 2 接收数据 RXD(Received Data) 3 发送数据 TXD(Transmit Data) 4 数据终端准备好 DTR(Data Terminal Ready 数据终端准备好) 5 信号地 SG(Signal Ground) 6 数据准备好 DSR(Data Set Ready 数据准备好) 7 请求发送 RTS(Request To Send 请求发送) 8 清除发送 CTS(Clear To Send 清除发送) 9 振铃提示 RI(Ring Indicator) 串口大师右下方的几个指示灯DTR、RTS、DSR、CTS、RI、CD的含义?红表示什么,绿表示什么? 绿表示完成,红表示错误。 DTR表示数据终端准备好

RTS表示请求发送 DSR表示数据准备好 CTS表示清除发送 RI表示振铃提示 CD代表小型镭射盘 串口DCD、DTR、DSR、RTS、CTS分别是什么意思? DCD(Data Carrier Detect 数据载波检测) DTR(Data Terminal Ready 数据终端准备好) DSR(Data Set Ready 数据准备好) RTS(Request To Send 请求发送) CTS(Clear To Send 清除发送) 在这五个控制信号中,DTR和RTS是DTE设备(数据终端设备,在实际应用中就是路由器)发出的,DSR、CTS和DCD是DCE设备(数据电路终结设备,在实际中就是各种基带MODEM)发出的。 在数字电路中(如计算机),设备甲和设备乙交换信息(通讯),双方采用某个通讯规范(协议)来交换数据,它们的联络过程就叫“握手”,用来联络的信号就叫“握手信号”,单向联络通常用两根联络线:请求,应答,双向则四条。

相关主题
文本预览
相关文档 最新文档