一路向前走

其中的代码,如果您有更好的改进,请一定提出您的宝贵意见及建议

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

【转】RS-232/RS-485/RS-422 接口简介与编程

最近在调试两款产品时,问题都是出在了串口通信上。今天加班好不容易跟着把其中一款产品的串口接收数据的错误给调好了!

回宿舍特地查了下资料,发现这篇文章对RS-232/RS-485/RS-422 的介绍还可以拿来一看。



一、什么是RS-232 接口?

(1) RS-232 的历史和作用

在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。(“RS-232-C”中的“-C”只不过表示RS-232的版本,所以与“RS-232”简称是一样的)它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25 个脚的DB-25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来IBM的PC 机将RS-232 简化成了DB-9 连接器,从而成为事实标准。而工业控制的RS-232 口一般只使用RXD、TXD、GND 三条线。

(2)RS-232 接口的电气特性

在RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻辑"1"为-3 到-15V;逻辑"0"为+3 到+15V 。RS-232-C 最常用的9 条引线的信号内容如下所示

DB-9 1 2 3 4 5 6 7 8 9

DB-25 8 3 2 20 7 6 4 5 22

定义DCD RXD TXD DTR GND DSR RTS CTS RI

(3) RS-232 接口的物理结构

RS-232-C 接口连接器一般使用型号为DB-9 插头座,通常插头在DCE端,插座在DTE端.

PC 机的RS-232 口为9 芯针插座。而波士RS-232/RS-485转换器的RS-232 为DB-9 孔插头。一些设备与PC 机连接的RS-232 接口,因为不使用对方的传送控制信号,只需三条接口线,即"发送数据TXD"、"接收数据RXD"和"信号地GND"。RS-232 传输线采用屏蔽双绞线。

(4)RS-232 传输电缆长度

由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50 英尺,其实这个4%的码元畸变是很保守的,在实际应用中,约有99%的用户是按码元畸变10-20%的范围工作的,所以实际使用中最大距离会远超过50英尺,美国DEC公司曾规定允许码元畸变为10%而得出下面实验结果。其中1 号电缆为屏蔽电缆,型号为DECP.NO.9107723 内有三对双绞线,每对由22# AWG 组成,其外覆以屏蔽网。2 号电缆为不带屏蔽的电缆。型号为DECP.NO.9105856-04是22#AWG 的四芯电缆。

DEC 公司的实验结果

波特率bps 1号电缆传输距离(米) 2号电缆传输距离(米)

110 1500 900

300 1500 900

1200 900 900

2400 300 150

4800 300 75

9600 75 75

经过许多年来RS-232 器件以及通信技术的改进,RS-232 的通信距离已经大大增加。波士电子的RS-232 增强器可以将普通的RS-232 口的通信距离直接延长到1000米。

二、什么是RS-485 接口?

(1)RS-485 的电气特性:

发送端:逻辑"1"以两线间的电压差为+(2 至6) V 表示;逻辑"0"以两线间的电压差为-(2 至6)V 表示。接收端:A比B高200mV以上即认为是逻辑"1",A 比B 低200mV 以上即认为是逻辑"0"。

(2)RS-485(或 RS-422)的接线:

RS-485(或 RS-422)通信建议一定要接地,因为RS-485(或 RS-422)通信要求通信双方的地电位差小于1V。即:半双工通信接3根线(+A、-B、地),全双工通信接5根线(+发、-发、+收、-收、地)。为了安全起见,建议通信机器的外壳接大地。RS-485(或 RS-422)光隔转换器的所有外接电源的“地”必须全部连在一起但不要与计算机外壳地相连,因为电源“地”同时也是RS-485或 RS-422的信号“地”。当通信距离超过100米时建议最好使用光电隔离的通信接口转换器。

(3)RS-485 的数据最高传输速率为10Mbps。但是由于RS-485 常常要与PC 机的RS-232口通信,所以实际上一般最高115.2Kbps。又由于太高的速率会使RS-485 传输距离减小,所以往往为9600bps 左右或以下。

(4)RS-485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。

(5)RS-485接口的最大传输距离标准值为1200米(9600bps时),实际上可达3000米,RS-485 接口在总线上是允许连接多达128个收发器、即RS-485 具有多机通信能力,这样用户可以利用单一的RS-485 接口方便地建立起设备网络。因RS-485 接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485 接口组成的半双工网络,一般只需二根信号线,所以RS485 接口均采用屏蔽双绞线传输。RS-485 的国际标准并没有规定RS485 的接口连接器标准、所以采用接线端子或者DB-9、DB-25 等连接器都可以。波士RS-485 接口是事实工业标准。

(6)采用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。RS-485的远距离通信建议采用屏蔽电缆,并且将屏蔽层作为地线。

三、什么是RS-422 接口?

RS-422 的电气性能与RS-485完全一样。主要的区别在于:

RS-422 有4 根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422 的收与发是分开的所以可以同时收和发(全双工)。RS-485 有2 根信号线:发送和接收都是A 和B。由于RS-485 的收与发是共用两根线所以不能够同时收和发(半双工)。能否将RS-422 的Y-A 短接作为RS-485 的A、将RS-422 的Z-B 短接作为RS-485 的B呢?回答:不一定。条件是RS-422 必须是能够支持多机通信的。波士电子的所有接口转换器的RS-422 口都能够支持全双工多机通信,所以可以这样简单转换为RS-485。

四、RS-485 比RS-232接口相比有何特点?

由于RS-232 接口标准出现较早,难免有不足之处,主要有以下四点:

(1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL 电路连接。 //这点我们有“惨痛”的教训,带电拔插操作,使得芯片被烧毁,结果串口收发数据就会出现问题

(2) 传输速率较低,在异步传输时,波特率为20Kbps。现在由于采用新的UART 芯片16C550 等,波特率达到115.2Kbps。

(3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

(4) 传输距离有限,最大传输距离标准值为50 米,实际上也只能用在15米左右。

(5) RS-232 只允许一对一通信,而RS-485 接口在总线上是允许连接多达128个收发器。

五、串口通信功能的实现

利用VC++实现串口通信的方法有多种,我们采取直接调用Window API中的一系列标准的串口通信函数,直接用这些标准函数来完成Windows下面的串口通信编程[11]。利用WindowsAPI函数控制利用API函数实现对RS232串口通信的访问,在实现控制通信中,我们必定要调动3个函数来实现对串口的控制:

CreatFile()函数实现串口初始化并打开串口;
ReadFile()函数接收串口传递过来的二进制流并返回数据到接收缓冲区中;
WriteFile()把应用程序发出的指令送到发送缓冲区以供串口接收

(1) 打开串口

以下程序用于以同步方式打开串口COM1;

HANDLE hCom;

DWORD dwErrorHcomm=CreateFile(“COM1”,GENERIC_READGENERIC_WRITE

,0, NULL,OPEN_EXISTING, 0, NULL);

if (hComm==(HANDLE)0Xffff)

{

dwError=GetLastError();

MessageBox(dwError);

}

(2) 配置串口

配置串口是通过改变设备控制块DCB(Device Control Block)的成员变量值来实现的,程序实现如下:

DCB dcb

dcb.BaudRate=9600;//波特率为9600bps

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

dcb.Parity=EVENPARTTY;//有校验

dcb.StopBits=ONESTOPRTT; //一个停止位

SetCommState(hCom,&dcb);

(3) 数据读写

对串口进行读写与对文件进行读写所用的函数相同,具体为可采用查询、同步、异步或事件驱动等方法对串口进行读写所用函数如下所示:

bReadStatus=ReadFile(hCom,buffer,length,&length &m_lpOverlapped);

if(!bReadStatus)

{

if(GetLastError()=ERROR_IO_PENDING)

{

WaitForSingleObject(m_lpOverlapped,hEvent,1000);

return((char)length);

}

return 0;

}

//写入函数程序为:

bWriteStatus=WriteFile(hCom,buffer,length,&length,&m_lpOverlapped)

if(!bWriteStatus)

{

if(GetLastError()=ERROR_IO_PENDING)

{

WaitForSingleObject(m_lpOverlapped, hEvent,1000);

return((char)length);

}

return 0;

}

(4) 程序的编制

用VC++进行程序的编制首先要对串口进行初始化,设定端口,通信速率和校验方式,并在使用前打开串口,程序部分如下:

{

Cdialog::OnInitDialog();//TODO: Add extra initialization here

m_comm.SetCommPort(1);//选择串口1

if(! m_comm.GetPortOpen())

m_comm.SetPortOpen(TRUE);//打开串口1

m_comm.SetSettings(“9600,n,8,1”); //设置串口参数

m_comm.SetRThreshold(1);

m_comm.SetInputMode(1);//设置二进制模式

return TRUE;

}

除了串口的位置和基本串口参数(数据传输速率9600bps,1位开始位,8位数据位,1位停止位,一位奇偶校验)设置外,为了实现实时数据采集功能,接受数据的读写要尽可能的快速,则设置RTHreshold=1即接收缓冲区收到一个字节产生OnComm事件InputLen=1每次读取一个字节。如果PC上位机在一定时间内不能将数据处理完,接收缓冲区会滞留数据,数据会产生丢失现象,我们必须对接受缓冲区进行适当的设置。我们利用API函数实现串口通信的方法,实现了罗经及发射机对上位机串行通信的功能。


转自:http://www.qiuxianli.cn/programming/2007/09/rs-232rs-485rs-422.html

posted on 2008-05-12 09:42  Adair  阅读(5361)  评论(0编辑  收藏  举报