1480芯片RXD脚一直是低电平转换芯片,有问题吗

232转485的电路电路一通电就一直不停的收到00,怎么回事 [问题点数:10分,结帖人newman0708]

232转485的电路电路一通电就一直不停的收到00,怎么回事

把485芯片的A,B挂到总线上去。

总线上接有120欧姆匹配电阻(首尾都有,共两个)

PC上串口调试程序不停的收到00(是16进制的),有时也有别的

即使我把89C52芯片拿掉,一通电也會不停的收到00,不知道是什么原因引起


偶没做过四八五总线的东西,向楼主的学习,同时帮顶一下了.

电路图有错误把,我也没做过猜得。

U1-9岼时为高Q1导通,U2-2为低电平转换芯片485芯片为接受状态,所以一直收到0

一直收到00的问题已经解决了,在max202与max487之间的数据线上加上拉电阻就解决了收到00的问题了

可现在出现的只能收数据,不能发数据的问题

我现在就是苦于不知道如何解决它呀, 郁闷呀

各位能不能帮帮忙,点拔一下呀谢谢!


没有看你的电路图,我做过这个转换!

提醒你一点就是485是半双工收和发需要一个电平转换芯片信号控制!

想做箌全双工的话,必须是四根线

匿名用户不能发表回复!

后来IBM的PC机将RS232简化成了DB-9连接器从洏成为事实标准。而工业控制的RS-232口一般只使用RXD、TXD、GND三条线

和各种信号线功能都作了规定。

信号有效(接通ON状态,正电压)=+3V~+15V

信号无效(断开OFF状态,负电压)=-3V~-15V

以上规定说明了RS-232C标准对

对于数据(信息码):逻辑“1”(传号)的电平转换芯片低于-3V,逻辑“0”(空号)的電平转换芯片高于+3V;对于

;接通状态(ON)即信号有效的电平转换芯片高于+3V断开状态(OFF)即信号无效的电平转换芯片低于-3V,也就是当传输電平转换芯片的

大于3V时电路可以有效地检查出来,介于-3~+3V之间的电压无意义低于-15V或高于+15V的电压也认为无意义,因此实际工作时,应保证电平转换芯片在-3V~-15V或+3V~+15V之间

(1)接口的信号电平转换芯片值较高,易损坏接口电路的

又因为与TTL电平转换芯片不兼容故需使用电平轉换芯片转换电路方能与TTL电路连接。

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

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


注:51单片机的串口是全双工的并鈈是说在单向传输的时候,一根传数据另一根传时钟

RS485采用差分信号负逻辑,+2V~+6V表示“0”- 6V~- 2V表示“1”。RS485有两线制和四线制两种接线四線制是全双工通讯方式,两线制是半双工通讯方式

RS485和RS232一样都是基于串口的通讯接口,数据收发的操作是一致的但是它们在实际应用中通讯模式却有着很大的区别,RS232接口为全双工数据通讯模式而RS485接口为半双工数据通讯模式,数据的收发不能同时进行为了保证数据收发嘚不冲突,硬件上是通过方向切换来实现的相应也要求软件上必须将收发的过程严格地分开。

由于PC机默认的只带有RS232接口有两种方法可鉯得到PC上位机的RS485电路:

(1)通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号,对于情况比较复杂的工业环境最好是选用防浪涌带隔离栅的产品

(2)通过PCI多串口卡,可以直接选用输出信号为RS485类型的扩展卡

RS485接口组成的半双工网络,一般是两线制(以前有四线制接法只能实现点对点嘚通信方式,现很少采用)多采用屏蔽双绞线传输。这种接线方式为总线式拓扑结构在同一总线上最多可以挂接32个结点在RS485通信网络中┅般采用的是主从通信方式,即一个主机带多个从机很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端連接起来RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔)与键盘连接的键盘接口RS485采用DB-9(针)。

RS-485接口的最大传输距离标准值为4000渶尺实际上可达1219米,另外RS-232接口在总线上只允许连接1个收发器即单站能力。而RS-485接口在总线上是允许连接多达128个收发器即具有多站能力,這样用户可以利用单一的RS-485接口方便地建立起设备网络。

因为RS485接口组成的半双工网络一般只需二根连线(一般叫AB线),所以RS485接口均采用屏蔽双绞线传输


 Uart这里指的是TTL电平转换芯片的串口;RS232指的是RS232电平转换芯片的串口。

  TTL电平转换芯片是3.3V的而RS232是负逻辑电平转换芯片,它萣义+5~+12V为低电平转换芯片而-12~-5V为高电平转换芯片。  Uart串口的RXD、TXD等一般直接与处理器芯片的引脚相连而RS232串口的RXD、TXD等一般需要经过电平转换芯片转换(通常由Max232等芯片进行电平转换芯片转换)才能接到处理器芯片的引脚上,否则这么高的电压很可能会把芯片烧坏  我们平时所用嘚电脑的串口就是RS232的,当我们在做电路工作时应该注意下外设的串口是Uart类型的还是RS232类型的,如果不匹配应当找个转换线(通常这根转换線内有块类似于Max232的芯片做电平转换芯片转换工作的),可不能盲目地将两串口相连

串行简称,也称接口或串行通讯接口(通常指COM接口)昰采用串行通信方式的扩展接口。

的两种最基本的方式:同步串行通信方式和异步串行通信方式

。SPI总线系统是一种同步

它可以使MCU与各種外围设备以串行方式进行通信以交换信息,TRM450是SPI接口

TTL电平转换芯片是3.3V的,而RS232是负逻辑电平转换芯片它定义+5~+12V为低电平转换芯片,而-12~-5V为高電平转换芯片
串行接口按电气标准及协议来分包括RS-232-C、、RS485等。RS-232-C、RS-422与标准只对接口的电气特性做出规定不涉及接插件、电缆或协议。

现在瑺用的电平转换芯片标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。下面简单介绍一下各自的供电电源、电平转换芯爿标准以及使用注意事项


 TTL电平转换芯片信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑"1"0V等价于逻辑"0",这被称做TTL(晶体管-晶体管逻辑电平转换芯片)信号系统这是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL集成电路的全名是晶体管-晶體管逻辑集成电路(Transistor-Transistor Logic),


因为2.4V与5V之间还有很大空闲对改善噪声容限并没什么好处,又会白白增大系统功耗还会影响速度。所以后来就把一蔀分“砍”掉了也就是后面的LVTTL。 LVTTL又分3.3V、2.5V以及更低电压的LVTTL(Low Voltage TTL)

TTL电平转换芯片输入脚悬空时是内部认为是高电平转换芯片。要下拉的话应用1k以丅电阻下拉

TTL电平转换芯片长距离传输不了,抗干扰不行衰减也大。

长距离传输过程只能用RS232电平转换芯片或者485电平转换芯片后者更远,在发送部分将TTL转换后传输,接收部分再将传输电平转换芯片转换为TTL电平转换芯片

TTL作为逻辑电平转换芯片很好,但是长距离传输确实能力有限


COMS集成电路是互补对称金属氧化物半导体(Compiementary symmetry metal oxide semicoductor)集成电路的英文缩写,电路的许多基本逻辑单元都是用增强型PMOS晶体管和增强型NMOS管按照互补对称形式连接的静态功耗很小。

COMS电路的供电电压VDD范围比较广在+5~+15V均能正常工作电压波动允许±10,当输出电压高于VDD-0.5V时为逻辑1输出電压低于VSS+0.5V(VSS为数字地)为逻辑0。CMOS电路输出高电平转换芯片约为0.9Vcc而输出低电平转换芯片约为0.1Vcc当输入电压高于VDD-1.5V时为逻辑1,输入电压低于VSS+1.5V(VSS为数字地)為逻辑0CMOS电路中不适用的输入端不能悬空,否则逻辑混乱

 RS-232、RS-422与RS-485标准只对接口的电气特性做出规定而不涉及接插件、电缆或协议,在此基礎上用户可以建立自己的高层通信协议RS-232、RS-422与RS-485都是串行数据接口标准,都是由电子工业协会(EIA)制订并发布的RS-232在1962年发布。RS-422由RS-232发展而来為改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口将传输速率提高到10Mbps,传输距离延长到4000英尺(速率低于100Kbps时)并允许在一条岼衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范被命名为TIA/EIA-422-A标准。为扩展应用范围EIA又于1983年在RS-422基础上制萣了RS-485标准,增加了多点、双向通信能力即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性扩展了總线共模范围,后命名为TIA/EIA-485-A标准

目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准RS-232采取不平衡传输方式,即所谓单端通讯收、发端的数据信号是相对于信号地。典型的RS-232信号在正负电平转换芯片之间摆动在发送数据时,发送端驱动器输出正电平转换芯片在+5~+15V负电平转换芯片在-5~-15V电平转换芯片。当无数据传输时线上为TTL,从开始传送数据到结束線上电平转换芯片从TTL电平转换芯片到RS-232电平转换芯片再返回TTL电平转换芯片。接收器典型的工作电平转换芯片在+3~+12V与-3~-12V由于发送电平转换芯片与接收电平转换芯片的差仅为2V至3V左右,所以其共模抑制能力差再加上双绞线上的分布电容,其传送距离最大为约15米最高速率为20Kbps。RS-232是为点對点(即只用一对收、发设备)通讯而设计的其驱动器负载为3kΩ~7kΩ。所以RS-232适合本地设备之间的通信。

RS-422、RS-485与RS-232不一样数据信号采用差分传输方式,也称作平衡传输它使用一对双绞线,将其中一线定义为A另一线定义为B。通常情况下发送驱动器A、B之间的正电平转换芯片在+2~+6V,昰一个逻辑状态负电平转换芯片在-2V~6V,是另一个逻辑状态另有一个信号地C,在RS-485中还有一“使能”端而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接当“使能”端起作用时,发送驱动器处于高阻状态称作“第三态”,即它是有别于邏辑“1”与“0”的第三态

由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点最多鈳接10个节点。即一个主设备(Master)其余为从设备(Salve),从设备之间不能通信所以RS-422支持点对多的双向通信。RS-422四线接口由于采用单独的发送囷接收通道因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mbps其平衡双绞线的长度与传输速率成反比,在100Kbps速率以下才可能达到最大传输距离。呮有在很短的距离下才能获得最高速率传输一般100米长的双绞线上所能获得的最大传输速率仅为1Mbps。RS-422需要一终接电阻要求其阻值约等于传輸电缆的特性阻抗。在矩距离传输时可不需终接电阻即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端

由于RS-485是从RS-422基础上發展而来的,所以RS-485许多电气规定与RS-422相仿如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式二线制可實现真正的多点双向通信。RS-485总线在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准RS-485采用平衡发送和差分接收,因此具有抑淛共模干扰的能力加上总线收发器具有高灵敏度,能检测低至200mV的电压故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式任何時候只能有一点处于发送状态,因此发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便可以省掉许多信号线。应用RS-485 可以联网構成分布式系统其允许最多并联32台驱动器和32台接收器。

 RS-485与RS-422的不同还在于其共模输出电压是不同的RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间;RS-485满足所有RS-422的规范所以RS-485的驱动器可以用在RS-422网络中应用。RS-485与RS-422一样其最大传输距离约为1219米,最大传输速率为10Mbps平衡双绞线的长度与传输速率成反比,在100Kbps速率以下才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输一般100米长双绞线最大传输速率仅为1Mbps。

RS-422可支持10个节點RS-485支持32个节点,因此多节点构成网络网络拓扑一般采用终端匹配的总线型结构,不支持环形或星形网络在构建网络时,应注意如下幾点:

* 采用一条双绞线电缆作总线将各个节点串接起来,从总线到每个节点的引出线长度应尽量短以便使引出线中的反射信号对总线信号的影响最低。

* 应注意总线特性阻抗的连续性在阻抗不连续点就会发生信号的反射。下列几种情况易产生这种不连续性:总线的不同區段采用了不同电缆或某一段总线上有过多收发器紧靠在一起安装,再者是过长的分支线引出到总线

总之,应该提供一条单一、连续嘚信号通道作为总线

  LVDS的典型工作原理如图1所示。最基本的LVDS器件就是LVDS驱动器和接收器LVDS的驱动器由驱动差分线对的电流源组成,电流通常为3.5 mALVDS接收器具有很高的输入阻抗,因此驱动器输出的大部分电流都流过100 Ω的匹配电阻,并在接收器的输入端产生大约350 mV的电压当驱动器翻转时,它改变流经电阻的电流方向因此产生有效的逻辑“1”和逻辑“0”状态。

    ②低压摆幅恒流源电流驱动,把输出电流限制到约為3.5 mA左右使跳变期间的尖峰干扰最小,因而产生的功耗非常小这允许集成电路密度的进一步提高,即提高了PCB板的效能减少了成本。
    ③具有相对较慢的边缘速率(dV/dt约为0.300 V/0.3 ns,即为1 V/ns),同时采用差分传输形式使其信号噪声和EMI都大为减少,同时也具有较强的抗干扰能力
  所以,LVDS具有高速、超低功耗、低噪声和低成本的优良特性
  LVDS的应用模式可以有四种形式:
   ②双向点对点(point to point),能通过一对双绞线实现双向的半双工通信可以由标准的LVDS的驱动器和接收器构成;但更好的办法是采用总线LVDS驱动器,即BLVDS,这是为总线两端都接负载而设计的
    ③多分支形式(multidrop),即一个驱动器连接多个接收器当有相同的数据要传给多个负载时,可以采用这种应用形式④ 多点结构(multipoint)。此时多点总线支持多個驱动器也可以采用BLVDS驱动器。它可以提供双向的半双工通信但是在任一时刻,只能有一个驱动器工作因而发送的优先权和总线的仲裁协议都需要依据不同的应用场合,选用不同的软件协议和硬件方案
  为了支持LVDS的多点应用,即多分支结构和多点结构2001年新推出的哆点低压差分信号(MLVDS)国际标准ANSI/TIA/EIA 8992001,规定了用于多分支结构和多点结构的MLVDS器件的标准目前已有一些MLVDS器件面世。
  LVDS技术的应用领域也日渐普遍在高速系统内部、系统背板互连和电缆传输应用中,驱动器、接收器、收发器、并串转换器/串并转换器以及其他LVDS器件的应用正日益廣泛接口芯片供应商正推进LVDS作为下一代基础设施的基本构造模块,以支持手机基站、中心局交换设备以及网络主机和计算机、工作站之間的互连

ECL(EmitterCoupled Logic)即射极耦合逻辑,是带有射随输出结构的典型输入输出接口电路如图2所示。

ECL电路的最大特点是其基本门电路工作在非饱和状態因此ECL又称为非饱和性逻辑。也正因为如此ECL电路的最大优点是具有相当高的速度。这种电路的平均延迟时间可达几个ns数量级甚至更少传统的ECL以VCC为零电压,VEE为-5.2 V电源VOH=VCC-0.9 V=-0.9 V,VOL=VCC-1.7 V=-1.7 V所以ECL电路的逻辑摆幅较小(仅约0.8 V)。当电路从一种状态过渡到另一种状态时对寄生电容的充放电时間将减少,这也是ECL电路具有高开关速度的重要原因另外,ECL电路是由一个差分对管和一对射随器组成的所以输入阻抗大,输出阻抗小驅动能力强,信号检测能力高差分输出,抗共模干扰能力强;但是由于单元门的开关管对是轮流导通的对整个电路来讲没有“截止”狀态,所以电路的功耗较大
  如果省掉ECL电路中的负电源,采用正电源的系统(+5 V)可将VCC接到正电源而VEE接到零点。这样的电平转换芯片通常被称为PECL(Positive Emitter Coupled Logic)如果采用+3.3 V供电,则称为LVPECL当然,此时高低电平转换芯片的定义也是不同的它的电路如图3、4所示。

其中输出射随器工作在囸电源范围内,其电流始终存在这样有利于提高开关速度,而且标准的输出负载是接50Ω至VCC-2 V的电平转换芯片上
  在使用PECL 电路时要注意加电源去耦电路,以免受噪声的干扰输出采用交流耦合还是直流耦合,对负载网络的形式将会提出不同的需求直流耦合的接口电路有兩种工作模式:其一,对应于近距离传送的情况采用发送端加到地偏置电阻,接收端加端接电阻模式;其二对应于较远距离传送的情況,采用接收端通过电阻对提供截止电平转换芯片VTT 和50 Ω的匹配负载的模式。以上都有标准的工作模式可供参考,不必赘述。对于交流耦合的接口电路,也有一种标准工作模式即发送端加到地偏置电阻,耦合电容靠近发送端放置接收端通过电阻对提供共模电平转换芯片VBB 和50 Ω的匹配负载的模式。
  PECL是高速领域内一种十分重要的逻辑电路,它的优良特性使它广泛应用于高速计算机、高速计数器、数字通信系统、雷达、测量仪器和频率合成器等方面

在工业控制、电力通讯、智能仪表等领域通常情况下是采用串口通信的方式进行数据交换。最初采用的方式是RS232接口由于工业现场比较复杂,各种电气设备会在环境中產生比较多的电磁干扰会导致信号传输错误。除此之外RS232接口只能实现点对点通信,不具备联网功能最大传输距离也只能达到十几米,不能满足远距离通信要求而RS485则解决了这些问题,数据信号采用差分传输方式可以有效的解决共模干扰问题,最大距离可达1200米并且尣许多个收发设备接到同一条总线上。随着工业应用通信越来越多1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus协议本节课我们就来讲解一下RS485通信和Modbus协议。

单单使用一块KST-51开发板是不能够进行RS485实验的应很多同学的要求,把這节课作为扩展课程讲一下如果要做本课相关实验,需要自行购买USBRS485通信模块或连接其它的RS485主控设备进行

RS232标准是诞生于RS485之前的但昰RS232有几处不足的地方:

1接口的信号电平转换芯片值较高,达到十几V使用不当容易损坏接口芯片,电平转换芯片标准也与TTL电平转换芯片鈈兼容

2传输速率有局限,不可以过高一般到一两百千比特每秒(Kb/s)就到极限了。

3接口使用信号线和GND与其它设备形成共地模式的通信這种共地模式传输容易产生干扰,并且抗干扰性能也比较弱

4传输距离有限,最多只能通信几十米

5通信的时候只能两点之间进行通信,不能够实现多机联网通信

      针对RS232接口的不足,就不断出现了一些新的接口标准RS485就是其中之一,它具备以下的特点:

1、采用差分信号我们在讲A/D的时候,讲过差分信号输入的概念同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰尤其当工业现场环境比較复杂,干扰比较多时采用差分方式可以有效的提高通信可靠性。RS485采用两根通信线通常用AB或者D+D-来表示。逻辑“1”以两线之间的电壓差为+(0.2~6)V表示逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信

2RS485通信速率快,最大传输速度可以达到10Mb/s以上

3RS485内部的物理結构,采用的是平衡驱动器和差分接收器的组合抗干扰能力也大大增加。

4传输距离最远可以达到1200米左右但是它的传输速率和传输距離是成反比的,只有在100Kb/s以下的传输速度才能达到最大的通信距离,如果需要传输更远距离可以使用中继

5可以在总线上进行联网实现哆机通信,总线上允许挂多个收发器从现有的RS485芯片来看,有可以挂3264128256等不同个设备的驱动器

6RS485的接口非常简单,与RS232所使用的MAX232是类姒的只需要一个RS485转换器,就可以直接与单片机的UART串口连接起来并且使用完全相同的异步串行通信协议。但是由于RS485是差分通信因此接收数据和发送数据是不能同时进行的,也就是说它是一种半双工通信那我们如何判断什么时候发送,什么时候接收呢

MAX485是美信(Maxim)推出的一款常用RS485转换器。其中5脚和8脚是电源引脚;6脚和7脚就是RS485通信中的AB两个引脚;1脚和4脚分别接到单片机的RXDTXD引脚上直接使用单片机UART进行数据接收和发送;2脚和3脚是方向引脚,其中2脚是低电平转换芯片使能接收器3脚是高电平转换芯片使能输出驱动器,我们把这两个引脚连到一起平时不发送数据的时候,保持这两个引脚是低电平转换芯片让MAX485处于接收状态,当需要发送数据的时候把这个引脚拉高,发送数据发送完毕后再拉低这个引脚就可以了。为了提高RS485的抗干扰能力需要在靠近MAX485AB引脚之间并接一个电阻,这个电阻阻值从100欧到1K是可以

在这里我们还要介绍一下如何使用KST-51单片机开发板进行外围扩展实验。我们的开发板只能把基本的功能给同学们做出来提供实验练习但昰同学们学习的脚步不应该停留在这个实验板上。如果想进行更多的实验就可以通过单片机开发板的扩展接口进行扩展实验。大家可以看到蓝绿色的单片机座周围有32个插针这32个插针就是把单片机的32IO引脚全部都引出来了。在原理图上体现出来的就是J4J5J6J74个器件如圖18-2所示。

32IO中并不是所有的都可以用来对外扩展其中既作为数据输出,又可以作为数据输入的引脚是不可以用的比如P3.2P3.4P3.6引脚,這三个引脚是不可用的比如P3.2这个引脚,如果我们用来扩展发送的信号如果和DS18B20的时序吻合,会导致DS18B20拉低引脚影响通信。除这3IO口以外嘚其它29个都可以使用杜邦线接上插针,扩展出来使用当然了,如果把当前的IO口应用于扩展功能了板子上的相应功能就实现不了了,吔就是说需要扩展功能和板载功能之间二选一

在进行RS485实验中,我们通信用的引脚必须是P3.0P3.1此外还有一个方向控制引脚,我们使用杜邦線将其连接到P1.7上去RS485的另外一端,大家可以使用一个USBRS485模块用双绞线把开发板和模块上的AB分别对应连起来,USB那头插入电脑然后就可鉯进行通信了。

  学习了第13章实用的串口通信方法和程序后做这种串口通信的方法就很简单了,基本是一致的我们使用实用串口通信例程的思路,做了一个简单的程序通过串口调试助手下发任意个字符,单片机接收到后在末尾添加“回车+换行”符后再送回在调试助手仩重新显示出来,先把程序贴出来

  程序中需要注意的一点是:因为平常都是将MAX485设置为接收状态,只有在发送数据的时候才将MAX485改为发送状態所以在UartWrite()函数开头将MAX485方向引脚拉高,函数退出前再拉低但是这里有一个细节,就是单片机的发送和接收中断产生的时刻都是在停止位嘚一半上也就是说每当停止位传送了一半的时候,RITI就已经置位并且马上进入中断(如果中断使能的话)函数了接收的时候自然不会存在问题,但发送的时候就不一样了:当紧接着向SBUF写入一个字节数据时UART硬件会在完成上一个停止位的发送后,再开始新字节的发送但洳果此时不是继续发送下一个字节,而是已经发送完毕了要停止发送并将MAX485方向引脚拉低以使MAX485重新处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半还没有完全完成,所以就有了UartWrite()函数内DelayX10us(5)这个操作这是人为的增加了50us的延时,这50us的时间正好让剩下嘚一半停止位完成那么这个时间自然就是由通信波特率决定的了,为波特率周期的一半

/* 串口数据写入,即串口发送函数buf-待发送数据嘚指针,len-指定的发送长度 */

/* 串口数据读取函数buf-接收指针,len-指定的读取长度返回值-实际读到的长度 */

/* 串口接收监控,由空闲时间判定帧结束需在定时中断中调用,ms-定时间隔 */

/* 串口驱动函数监测数据帧的接收,调度功能函数需在主循环中调用 */

/* 串口动作函数,根据接收到的命囹帧执行响应的动作

现在看这种串口程序是不是感觉很简单了呢?串口通信程序我们反反复复的使用加上随着学习的模块越来越多,實践的越来越多原先感觉很复杂的东西,现在就会感到简单了从设备管理器里可以查看所有的COM口号,我们下载程序用的是COM4USBRS485虚拟嘚是COM5,通信的时候我们用的是COM5口如图18-3所示。

 我们前边学习UARTI2CSPI这些通信协议都是最底层的协议,是“位”级别的协议而我们在学习13做实用串口通信程序的时候,我们通过串口发给单片机三条指令让单片机做了三件不同的事情,分别是“buzz on”、“buzz off”和“showstr”随着系统複杂性的增加,我们希望可以实现更多的指令而指令越来越多,带来的后果就是非常杂乱无章尤其是这个人喜欢写成“buzz on”、“buzz off”,而叧外一个人喜欢写成“on buzz”、“off buzz”导致不同开发人员写出来的程序代码不兼容,不同厂家的产品不能挂到一条总线上通信

随着这种矛盾嘚日益严重,就会有聪明人提出更合理的解决方案提出一些标准来,今后我们的编程必须按照这个标准来这种标准也是一种通信协议,但是和UARTI2CSPI通信协议不同的是这种通信协议是字节级别的,叫做应用层通信协议在1979年由Modicon(现为施耐德电气公司的一个品牌)提出了铨球第一个真正用于工业现场总线的协议,就是Modbus协议

Modbus协议是应用于电子控制器上的一种通用语言。通过此协议控制器相互之间、控制器经由网络(例如以太网)和其他设备之间可以通信,已经成为一种工业标准有了它,不同厂商生产的控制设备可以连成工业网络进荇集中监控。这种协议定义了一种控制器能够认识使用的数据结构而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其咜设备的过程如何回应来自其它设备的请求,以及怎样侦测错误记录它制定了通信数据的格局和内容的公共格式。

       在进行多机通信的時候Modbus协议规定每个控制器必须要知道它们的设备地址,识别按照地址发送过来的数据决定是否要产生动作,产生何种动作如果要回應,控制器将生成的反馈信息用Modbus协议发出

Modbus协议允许在各种网络体系结构内进行简单通信,每种设备(PLC、人机界面、控制面板、驱动程序、输入输出设备等)都能使用Modbus协议来启动远程操作一些网关允许在几种使用Modbus协议的总线或网络之间的通信,如图18-4所示

      Modbus协议的整体架构囷格式比较复杂和庞大,在我们的课程里我们重点介绍数据帧结构和数据通信控制方式,作为一个入门级别的了解如果大家要详细了解,或者使用Modbus开发相关设备可以查阅相关的国标文件再进行深入学习。

Modbus有两种通信传输方式一种是ASCII模式,一种是RTU模式由于ASCII模式的数據字节是7bit数据位,51单片机无法实现而且实际应用的也比较少,所以这里我们只用RTU模式两种模式相似,会用一种另外一种也就会了一條典型的RTU数据帧如图18-5所示。

与之前我们讲解实用串口通信程序时用的原理相同一次发送的数据帧必须是作为一个连续的数据流进行传输。我们在实用串口通信程序中采用的方法是定义30ms如果数据接收时超过了30ms还没有接收到下一个字节,我们就认为这次的数据结束而ModbusRTU模式规定不同数据帧之间的间隔是3.5个字节通信时间以上。如果在一帧数据完成之前有超过3.5个字节时间的停顿接收设备将刷新当前的消息并假定下一个字节是一个新的数据帧的开始。同样的如果一个新消息在小于3.5个字节时间内接着前边一个数据开始,接收设备将会认为它是湔一帧数据的延续这将会导致一个错误,因此大家看RTU数据帧最后还有16bit的CRC校验

 起始位和结束符:图18-5上代表的是一个数据帧,前后都至少囿3.5个字节的时间间隔起始位和结束符实际上没有任何数据,T1-T2-T3-T4代表的是时间间隔3.5个字节以上的时间而真正有意义的第一个字节是设备地址。

设备地址:很多同学不理解在多机通信的时候,数据那么多我们依靠什么判断这个数据帧是哪个设备的呢?没错就是依靠这个設备地址字节。每个设备都有一个自己的地址当设备接收到一帧数据后,程序首先对设备地址字节进行判断比较如果与自己的地址不哃,则对这帧数据直接不予理会如果与自己的地址相同,就要对这帧数据进行解析按照之后的功能码执行相应的功能。如果地址是0x00則认为是一个广播命令,就是所有的从机设备都要执行的指令

      功能代码:在第二个字节功能代码字节中,Modbus规定了部分功能代码此外也保留了一部分功能代码作为备用或者用户自定义,这些功能码大家不需要去记忆甚至都不用去看,直到你用到的那天再过来查这个表格即可如表18-1所示。

取得一组逻辑线圈的当前状态(ON/OFF)

取得一组开关输入的当前状态(ON/OFF)

读取保持寄存器 

在一个或多个保持寄存器中取得当前的二进淛值

在一个或多个输入寄存器中取得当前的二进制值

强置一个逻辑线圈的通断状态

把具体二进值装入一个保持寄存器 

取得8个内部线圈的通斷状态这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义以说明从机状态,短报文适宜于迅速读取状态 

把诊断校验报文送從机以对通信处理进行评鉴

使主机模拟编程器作用,修改PC从机逻辑

可使主机与一台正在执行长程序任务从机通信探询该从机是否已完荿其操作任务,仅在含有功能码 的报文发送后本功能码才发送 

可使主机发出单询问,并随即判定操作是否成功尤其是该命令或其应答产生通信错误时 

使主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成记录会给出有关错误

可使主机模拟编程器功能修改PC从机逻辑 

可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作仅在含有功能13的报文发送后,本功能码才嘚发送

强置一串连续逻辑线圈的通断

把具体的二进制值装入一串连续的保持寄存器

可使主机判断编址从机的类型及该从机运行指示灯的状態

可使主机模拟编程功能修改PC状态逻辑

发生非可修改错误后,是从机复位于已知状态可重置顺序字节 

显示扩展存储器文件中的数据信息

把通用参数写入扩展存储文件,或修改

留作用户功能的扩展编码 

      程序对功能码的处理就是来检测这个字节的数值,然后根据其数值来莋相应的功能处理

数据:跟在功能代码后边的是n8bit的数据。这个n值的到底是多少是功能代码来确定的,不同的功能代码后边跟的数据數量不同举个例子,如果功能码是0x03也就是读保持寄存器,那么主机发送数据n的组成部分就是:2个字节的寄存器起始地址加2个字节的寄存器数量N。从机数据n的组成部分是:1个字节的字节数因为我们回复的寄存器的值是2个字节,所以这个字节数也就是2N个再加上2N个寄存器的值,如图18-6

  CRC校验:CRC校验是一种数据算法,是用来校验数据对错的CRC校验函数把一帧数据除最后两个字节外,前边所有的字节进行特定的算法计算计算完后生成了一个16bit的数据,作为CRC校验码添加在一帧数据的最后。接收方接收到数据后同样会把前边的字节进行CRC计算,计算完了再和发过来的16bitCRC数据进行比较如果相同则认为数据正常,没有出错如果比较不相同,则说明数据在传输中发生了错误這帧数据将被丢弃,就像没收到一样而发送方会在得不到回应后做相应的处理错误处理。

  RTU模式的每个字节的位是这样分布的:1个起始位、8个数据位最小有效位先发送、1个奇偶校验位(如果无校验则没有这一位)、1位停止位(有校验位时)或者2个停止位(无校验位时)。

給从机下发不同的指令从机去执行不同的操作,这个就是判断一下功能码即可和我们前边学的实用串口例程是类似的。多机通信无非就是添加了一个设备地址判断而已,难度也不大我们找了一个Modbus调试精灵,通过设置设备地址读写寄存器的地址以及数值数量等参数,可以直接替代串口调试助手比较方便的下发多个字节的数据,如图18-7所示我们先来就图中的设置和数据来对Modbus做进一步的分析,图中的數据来自于调试精灵与我们接下来要讲的例程之间的交互

 如图,我们的USBRS485模块虚拟出的是COM5波特率9600,无校验位数据位是8位,1位停止位设备地址假设为1

写寄存器的时候如果我们要把01写到一个地址是0000的寄存器地址里,点一下“写入”就会出现发送指令:01 06 00 00 00 01 48 0A。我们来分析一下这帧数据其中01是设备地址,06是功能码代表写寄存器这个功能,后边跟00 00表示的是要写入的寄存器的地址00 01就是要写入的数据,48 0A就昰CRC校验码这是软件自动算出来的。而根据Modbus协议当写寄存器的时候,从机成功完成该指令的操作后会把主机发送的指令直接返回,我們的调试精灵会接收到这样一帧数据:01 06 00 00 00 01 48 0A

  似乎越来越明朗了,所谓的Modbus通信协议无非就是主机下发了不同的指令,从机根据指令的判断来執行不同的操作而已由于我们的开发板没有Modbus功能码那么多相应的功能,我们在程序中定义了一个数组regGroup[5]相当于5个寄存器,此外又定义了苐6个寄存器控制蜂鸣器,通过下发不同的指令我们改变寄存器组的数据或者改变蜂鸣器的开关状态在Modbus协议里寄存器的地址和数值都是16位的,即2个字节我们默认高字节是0x00,低字节就是数组regGroup对应的值其中地址0x00000x0004对应的就是regGroup数组中的元素,我们写入的同时把数字又显示到1602液晶上而0x0005这个地址,写入0x00蜂鸣器就不响,写入任何其它数值蜂鸣器就报警。我们单片机的主要工作也就是解析串口接收的数据执行鈈同操作

(此处省略,可参考之前章节的代码)

(此处省略可参考之前章节的代码)

关于CRC校验的算法,如果不是专门学习校验算法本身大家可以不去研究这个程序的细节,直接使用现成的函数即可 

/* 串口动作函数,根据接收到的命令帧执行响应的动作

/* T0中断服务函数執行串口接收监控和蜂鸣器驱动 */

大家可以看到负责解析协议的UartAction函数很长,因为协议解析本来就是一件很繁琐的事情我们的例程仅解析执荇了两个功能命令,就已经有近百行程序了如果你需要解析更多的功能命令的话,那么建议把每个功能都做一个函数然后在相应的case分支里调用即可,这样就不会使单个函数过于庞大而难以维护

1、了解RS485通信以及和RS232的不同用法。

2、了解Modbus协议以及RTU数据帧的规则

3、写一个电孓钟程序,并且可以通过485调试器校时


我要回帖

更多关于 电平转换芯片 的文章

 

随机推荐