RS485通信和Modbus协议
RS485和MODBUS的区别(包你明白)

RS485和MODBUS的区别(包你明白)Modbus是一种通讯协议,需要硬件作为实现平台。
不同的硬件平台具有不同的电气特性和连接方式,比如RS232和RS485.可以将Modbus比作英语,RS232比作印度人,RS485比作美国人。
印度人之间讲英语时,理解为基于RS232的Modbus通信,美国人之间讲英语时,理解为基于RS485的Modbus通信。
RS485是一个物理接口,简单来说是硬件。
Modbus是一种国际标准的通讯协议,用于不同厂商之间的设备交换数据,一般用于工业用途。
协议也可以理解为“语言”,是软件。
一般情况下,两台设备通过Modbus协议传输数据,最早是用RS232C作为硬件接口,也有用RS422的,但常用的是RS485,因为这种接口传输距离远,在一般工业现场用的比较多。
Modbus协议又分为Modbus RTU、Modbus ASCII和后来发展的Modbus TCP三种模式。
其中前两种(Modbus RTU、Modbus ASCII)所用的物理硬件接口都是串行(Serial)通讯口(RS232、RS422、RS485)。
而Modbus TCP则是为了顺应当今世界发展潮流,来连接,传送数据。
因此,又有ModbusTCP模式,该模式的硬件接口就是以太网()口了,也就是我们电脑上一般用的网络口。
协议分为硬件协议和软件协议,而通讯协议属于软件协议,它包含报头包围的格式。
Modbus是应用层的通讯协议,主要用于传送和接收文件包的格式。
RS232、RS485是物理层的串行接口,可以支持几十种通讯协议,Modbus只是其中的一种。
Modbus可分为Modbus RTU/ACSI、Modbus +(也叫Modbus PLUS)和Modbus TCP/IP等。
前两种是在串行链路上使用的通讯协议(串口通讯),后一种是在以太网口基于TCP/IP协议的Modbus通讯协议。
在工业控制场合,RS485总线因其接口简单、组网方便、传输距离远等特点而得到广泛应用。
RS485通讯 modbus 协议

使用说明书 - 1 -_MODBUS 通讯协议说明一.通讯说明控制器采用RS-485总线,协议符合ModBus RTU 规约。
数据传输均采用8位数据位、1位停止位、无奇偶校验位。
波特率可设为1200-9600 bit/s 。
通讯传送分为独立的信息头,和发送的编码数据。
以下的通讯传送方式定义与RTU 通讯规约相初始结构 = >=4字节的时间地址码 = 1 字节功能码 = 1 字节数据区 = N 字节错误校检 = 16位CRC 码结束结构 = >=4字节的时间地址码:地址码为通讯传送的第一个字节。
这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。
并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。
主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
功能码:通讯传送的第二个字节。
ModBus 通讯规约定义功能号为1到127。
本控制器利用其中的一部分功能码。
作为主机请求发送,通过功能码告诉从机执行什么动作。
作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。
如果从机发送的功能码的最高位(比如功能码大于127),则表明从机没有响应操作或发送出错。
数据区:数据区是根据不同的功能码而不同。
CRC 码:二字节的错误检测码。
当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。
返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。
如果出错就不发送任何信息。
1 2.信息帧格式:(1) 地址码: 地址码是信息帧的第一字节(8位),从0到255。
这个字节表明由用户设置地址的从机将接收由主机发送来的信息。
每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。
当从机回送信息时,相当的地址码表明该信息来自于何处。
rs485通讯

RS485通讯1. 引言RS485是一种串行通信协议,用于在多个设备之间进行双向数据传输。
它是一种高性能的通讯协议,常用于工业自动化、仪器仪表、门禁系统等领域。
本文将介绍RS485通讯的基本原理、使用方法以及常见的应用场景。
2. 基本原理RS485通讯使用差分信号传输,可以抵抗电磁干扰和噪声。
它采用两条相对独立的传输线(A线和B线),通过不同的电平表示逻辑1或逻辑0。
其中,逻辑1对应线A为高电平,线B为低电平;逻辑0对应线A为低电平,线B为高电平。
通过这种方式,数据可以在多个设备之间进行可靠的传输。
3. 硬件连接在使用RS485通讯时,需要将所有设备连接到一个共享的总线上。
每个设备都需要两条连接线(A线和B线)以及一个共享的地线。
通常,可以使用终端电阻来匹配总线阻抗并提高信号质量。
4. 传输方式RS485通讯可以采用两种传输方式:全双工和半双工。
4.1 全双工通讯在全双工通讯中,设备可以同时发送和接收数据。
发送数据的设备需要将数据发送到总线上,并通过差分信号传输给其他设备。
同时,接收数据的设备可以监听总线上的数据并将其解析。
4.2 半双工通讯在半双工通讯中,设备的发送和接收操作是交替进行的。
设备在发送数据时,需要先将总线设置为发送模式,并将数据发送到总线上。
其他设备在接收数据时,将总线设置为接收模式,并监听数据。
5. 通讯协议RS485通讯可以使用多种协议进行数据交换,常见的有MODBUS、DMX512等。
这些协议定义了数据的传输格式、通讯方式和功能码等。
5.1 MODBUS协议MODBUS是一种常用的通讯协议,适用于工业自动化领域。
它定义了数据的传输格式,并提供了读写寄存器等功能。
MODBUS协议支持点对点和多点通讯。
5.2 DMX512协议DMX512是一种用于舞台灯光控制的通讯协议。
它定义了数据的传输格式和通讯方式。
DMX512通讯一般采用全双工方式进行。
6. 应用场景RS485通讯在许多领域都有广泛的应用。
pci总线定时协议一文搞懂Modbus与RS485通信协议

pci总线定时协议一文搞懂Modbus与RS485通信协议在工业自动化领域中,Modbus与RS485通信协议是非常常见且广泛应用的一种通信方式。
而PCI总线定时协议则是与Modbus与RS485通信协议密切相关的一种技术。
本文将从Modbus与RS485通信协议的基本概念入手,逐步介绍PCI总线定时协议的相关知识,帮助读者全面了解这两个重要的通信协议。
1. Modbus与RS485通信协议的概念Modbus是一种串行通信协议,通常用于将工业设备与控制系统进行连接和通信。
它最早由Modicon公司于1979年开发,并逐渐成为工业自动化领域中的通信标准。
Modbus协议简单、可靠,支持主从模式和多主模式,广泛应用于工业控制系统、能源管理系统等领域。
RS485通信协议是一种串行通信协议的物理层标准,用于在数字设备之间进行数据传输。
它是一种差分信号传输方式,支持多点通信,通信距离可达1200米,具有抗干扰能力强等特点。
RS485通信协议常用于远距离的数据传输,适用于工业环境中对可靠性和稳定性要求较高的场合。
2. Modbus与RS485通信协议的关系Modbus协议本身并不规定通信的物理层标准,而是通过串行通信接口与物理层进行连接。
RS485通信协议可以提供满足Modbus协议要求的物理层连接方式。
因此,Modbus通常使用RS485作为物理层接口进行数据传输。
RS485通信协议提供了一种可靠而高效的物理层传输方式,可以满足Modbus协议的通信需求。
通过RS485通信协议,Modbus协议可以实现远距离的数据传输,并且具备良好的抗干扰性能。
因此,Modbus与RS485通信协议经常同时使用,成为工业自动化领域中常见的通信组合方式。
3. PCI总线定时协议的原理与应用PCI总线定时协议是一种用于Modbus与RS485通信协议的时序控制技术。
它在PCI总线上实现了定时控制,确保Modbus协议在RS485通信中的稳定传输。
RS232RS485RJ45以及Modbus协议

RS232,RS485,RJ45,以及Modbus协议设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。
相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。
这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。
这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。
这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。
在有关计算机信息交换的ISO/OSI模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。
一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。
注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也即对讲机的通话型式,这叫做半双工。
RS422接口和RS232接口是全双工接口,而RS485则是半双工接口。
对于半双工接口,显然需要有通信的发起者,所以RS485接口和网络一定具有主站和若干从站,并且从站的数量也有规定。
一般地,从站的数量是32个。
RS485主站与从站的关系问题,看似只是通信工作制的不同,其本质是通信各方对通信总线控制权的合理分配。
我们再看总线连接问题。
我们还是以电源为例。
我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。
只要满足电源的功率要求,显然这是可行的。
MODBUS 485与RS485区别

MODBUS 485 与RS485 区别Modbus 协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
它已经成为一通用工业标准。
有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和内容的公共格式。
当在一Modbus 网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。
如果需要回应,控制器将生成反馈信息并用Modbus 协议发出。
在其它网络上,包含了Modbus 协议的消息转换为在此网络上使用的帧或包结构。
这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
MODBUS485=rs458RS-485 具有以下特点:1). RS-485 的电气特性:逻辑1 以两线间的电压差为+(26)V 表示;逻辑0 以两线间的电压差为-(26)V 表示。
接口信号电平比RS-232-C 降低了,就不易损坏接口电路的芯片,且该电平与TTL 电平兼容,可方便与TTL 电路连接。
2). RS-485 的数据最高传输速率为10Mbps3). RS-485 接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
4). RS-485 接口的最大传输距离标准值为4000 英尺,实际上可达3000 米,另外RS-232-C 接口在总线上只允许连接1 个收发器,即单站能力。
而RS-485 接口在总线上是允许连接多达128 个收发器。
即具有多站能力,这样用户可以利用单一的RS-485 接口方便地建立起设备网络。
因RS-485 接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。
RS-485和Modbus通信协议及工作原理

RS-485和Modbus通信协议及工作原理在(工业控制)、电力通讯、(智能)仪表等领域,通常情况下是采用串口(通信)的方式进行数据交换。
最初采用的方式是(RS)232接口,由于(工业)现场比较复杂,各种(电气)设备会在环境中产生比较多的电磁千扰,会导致(信号)传输错误。
1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus 协议,所以今天我们来了解下RS485通信和Modbus通信协议。
什么是串口通信串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并目可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
(RS-485)协议概述RS-485和RS-232一样,都是审行通信标准,现在的标准名称是(TI)A485/EIA-485-A,但是人们会习惯称为RS485标准,RS-485常用在工业、自动化、汽车和建筑物管理等领域。
RS-485总线弥补了RS-232通信距离短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米;RS-485和RS-232的单端传输不一样是差分传输,使用一对双绞线,其中一根线定义为A,另一个定义为B。
通常情况下,RS485的信号在传送出去之前会先分解成正负对称的两条线路(即我们常说的A、B信号线),当到达接收端后,再将信号相减还原成原来的信号。
拓扑结构RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点RS-485总线同12C总线一样支持主从模式,支持点对点单从机模式,也支持多从机模式,不支持多主机模式。
【总线】UART、Modbus、I2C、SPI、RS232、RS485及串口通讯常用参数

【总线】UART、Modbus、I2C、SPI、RS232、RS485及串⼝通讯常⽤参数⼀、UART异步收发传输,作为集成于微处理器中的周边设备,把并⾏输⼊信号转成串⾏输出信号,(⼀般是RS-232C规格的,与类似Maxim的MAX232之类的标准信号幅度变换芯⽚进⾏搭配)作为连接外部设备的接⼝。
该总线双向通信,可以实现全双⼯传输和接收。
在嵌⼊式设计中,UART⽤于主机与辅助设备通信,如与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
⼀个字符接着⼀个字符传输,⼀个字符的信息由起始位、数据位、奇偶校验位和停⽌位组成。
传输时低位在前⾼位在后。
发送端和接收端必须按照相同的字节帧格式和波特率进⾏通信。
UART的设计采⽤模块化的设计思想,主要分为 3个模块:数据发送模块、数据接收模块及波特率发⽣器控制模块。
发送模块实现数据由并⾏输⼊到串⾏输出,接收模块实现数据由串⾏输⼊到并⾏输出,波特率发⽣器模块控制产⽣UART时钟频率。
发送逻辑对从发送FIFO读取的数据执⾏“并→串”转换。
控制逻辑输出起始位在先的串⾏位流,并且根据控制寄存器中已编程的配置,后⾯紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和停⽌位。
在检测到⼀个有效的起始脉冲后,接收逻辑对接收到的位流执⾏“串→并”转换。
此外还会对溢出错误、奇偶校验错误、帧错误和线中⽌(line-break)错误进⾏检测,并将检测到的状态附加到被写⼊接收FIFO的数据中。
需要两根信号线和⼀根地线。
⼆、Modbus1、ASCII模式与RTU模式的区别(1)ASCII:消息中每个ASCII字符都是⼀个⼗六进制字符组成(2)RTU:消息中每个8位域都是两个⼗六进制字符组成在同样波特率下,RTU可⽐ASCII⽅式传输更多的数据三、RS232、RS485(1)RS232RS232接⼝可以实现点对点的通信⽅式,但这种⽅式不能实现联⽹功能。
个⼈计算机上的通讯接⼝之⼀,异步传输标准接⼝。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200米,并且允许多个收发设备接到同一条总线上。
随着工业应用通信越来越多,1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus协议,本节课我们要讲解一下RS485通信和Modbus协议。
单单使用一块KST-51开发板是不能够进行RS485实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB转485通信模块。
18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。
3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
而RS485就是一种差分通信方式,它的通信线路是两根,通常用A和B或者D+和D-来表示。
逻辑“1”以两线之间的电压差为+(0.2~6)V表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。
2、RS485通信速度快,最大传输速度可以达到10Mb/s以上。
3、RS485内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增加。
4、传输距离最远可以达到1200米左右,但是他的传输速率和传输距离是成反比的,只有在100Kb/s以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。
5、可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的RS485芯片来看,有可以挂32、64、128、256等不同个设备的驱动器。
RS485的接口非常简单,和RS232所使用的MAX232是类似的,只需要一个RS485转换器,就可以直接和我们单片机的UART串行接口连接起来,并且完全使用的是和UART一致的异步串行通信协议。
但是由于RS485是差分通信,因此接收数据和发送数据是不能同时进行的,也就是说它是一种半双工通信。
那我们如何判断什么时候发送,什么时候接收呢?RS485类的芯片很多,这节课我们以MAX485为例讲解RS485通信,如图18-1所示。
图18-1 MAX485硬件接口MAX485是美信(Maxim)推出的一款常用RS485转换器。
其中5脚和8脚是电源引脚,6脚和7脚就是485通信中的A和B两个引脚,而1脚和4脚分别接到我们单片机的RXD和TXD引脚上,直接使用单片机UART进行数据接收和发送。
而2脚和3脚就是方向引脚了,其中2脚是低电平使能接收器,3脚是高电平使能输出驱动器。
我们把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让MAX485处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。
为了提高RS485的抗干扰性能,需要在靠近MAX485的A和B 引脚之间并接一个电阻,这个电阻阻值从100欧到1K都可以。
在这里我们还要介绍一下如何使用KST-51单片机开发板进行外围扩展实验。
我们的开发板只能把基本的功能给同学们做出来提供实验练习,但是同学们学习的脚步不应该停留在这个实验板上。
如果想进行更多的实验,就可以通过单片机开发板的扩展接口进行扩展实验。
大家可以看到蓝绿色的单片机座周围有32个插针,这32个插针就是把单片机的32个IO引脚全部都引出来了。
在原理图上体现出来的就是我们的J4、J5、J6、J7这4个器件,如图18-2所示。
图18-2 单片机扩展接口这32个IO口不是所有的IO口都可以用来对外扩展,其中既作为数据输出,又可以作为数据输入的引脚是不可以用的,比如P3.2、P3.4、P3.6引脚,这三个引脚是不可用的。
比如P3.2这个引脚,如果我们用来扩展,发送的信号如果和DS18B20的时序吻合,会导致DS18B20拉低引脚,影响通信。
除这3个IO口以外的其他29个IO口,都可以使用杜邦线接上插针,扩展出来使用。
当然了,如果把当前的IO口应用于扩展功能了,板子上的相应的功能就实现不了了,也就是说需要扩展功能和板载功能二选一。
在进行RS485实验中,我们通信用的引脚必须是P3.0和P3.1,此外还有一个方向控制引脚,我们使用杜邦线将其连接到P1.7上去。
RS485的另外一端,大家可以使用一个USB转485模块,用双绞线把开发板和模块上的A和B分别对应连起来,USB那头插入电脑,然后就可以进行通信了。
学习了第13章的实用串口通信的方法和程序后,做这种串口通信的方法就很简单了,基本是一致的。
我们使用实用串口通信的思路,做了一个简单的程序,通过串口调试助手下发任意个字符,单片机接收到后在末尾添加“回车+换行”符后再送回,在调试助手上重新显示出来,先把程序贴出来。
程序中需要注意的一点是:因为平常都是将485设置为接收状态,只有在发送数据的时候才将485改为发送状态,所以在UartWrite()函数开头将485方向引脚拉高,函数退出前再拉低。
但是这里有一个细节,就是单片机的发送和接收中断产生的时刻都是在停止位的一半上,也就是说每当停止位传送了一半的时候,RI或TI就已经置位并且马上进入中断(如果中断使能的话)函数了,接收的时候自然不会存在问题,但发送的时候就不一样了:当紧接这向SBUF写入一个字节数据时,UART硬件会在完成上一个停止位的发送后,再开始新字节的发送,但如果此时不是继续发送下一个字节,而是已经发送完毕了,要停止发送并将485方向引脚拉低以使485重新处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半,还没有完全完成,所以就有了UartWrite()函数内DelayX10us(5)这个操作,这是人为的增加了延时50us,这50us的时间正好让剩下的一半停止位完成,那么这个时间自然就是由通信波特率决定的了,为波特率周期的一半。
/***********************RS485.c文件程序源代码*************************/#include <reg52.h>#include <intrins.h>sbit RS485_DIR = P1^7; //RS485方向选择引脚bit flagOnceTxd = 0; //单次发送完成标志,即发送完一个字节bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令unsigned char cntRxd = 0;unsigned char pdata bufRxd[40]; //串口接收缓冲区void ConfigUART(unsigned int baud) //串口配置函数,baud为波特率{RS485_DIR = 0; //RS485设置为接收方向SCON = 0x50; //配置串口为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2TH1 = 256 - (11059200/12/32) / baud; //计算T1重载值TL1 = TH1; //初值等于重载值ET1 = 0; //禁止T1中断ES = 1; //使能串口中断TR1 = 1; //启动T1}unsigned char UartRead(unsigned char *buf, unsigned char len) //串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度{unsigned char i;if (len > cntRxd) //读取长度大于接收到的数据长度时,{len = cntRxd; //读取长度设置为实际接收到的数据长度}for (i=0; i<len; i++) //拷贝接收到的数据{*buf = bufRxd[ i];buf++;}cntRxd = 0; //清零接收计数器return len; //返回实际读取长度}void DelayX10us(unsigned char t) //软件延时函数,延时时间(t*10)us{do {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} while (--t);}void UartWrite(unsigned char *buf, unsigned char len) //串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len{RS485_DIR = 1; //RS485设置为发送while (len--) //发送数据{flagOnceTxd = 0;SBUF = *buf;buf++;while (!flagOnceTxd);}DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定RS485_DIR = 0; //RS485设置为接收}void UartDriver() //串口驱动函数,检测接收到的命令并执行相应动作{unsigned char len;unsigned char buf[30];if (cmdArrived) //有命令到达时,读取处理该命令{cmdArrived = 0;len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中buf[len++] = '\r'; //在接收到的数据帧后添加换车换行符后发回buf[len++] = '\n';UartWrite(buf, len);}}void UartRxMonitor(unsigned char ms) //串口接收监控函数{static unsigned char cntbkp = 0;static unsigned char idletmr = 0;if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间{if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 {cntbkp = cntRxd;idletmr = 0;}else{if (idletmr < 30) //接收计数器未改变,即总线空闲时,累积空闲时间{idletmr += ms;if (idletmr >= 30) //空闲时间超过30ms即认为一帧命令接收完毕{cmdArrived = 1; //设置命令到达标志}}}}else{cntbkp = 0;}}void InterruptUART() interrupt 4 //UART中断服务函数{if (RI) //接收到字节{RI = 0; //手动清零接收中断标志位if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时,{bufRxd[cntRxd++] = SBUF; //保存接收字节,并递增计数器 }}if (TI) //字节发送完毕{TI = 0; //手动清零发送中断标志位flagOnceTxd = 1; //设置单次发送完成标志}}/***********************main.c文件程序源代码*************************/ #include <reg52.h>unsigned char T0RH = 0; //T0重载值的高字节unsigned char T0RL = 0; //T0重载值的低字节void ConfigTimer0(unsigned int ms);extern void ConfigUART(unsigned int baud);extern void UartRxMonitor(unsigned char ms);extern void UartDriver();void main (){EA = 1; //开总中断ConfigTimer0(1); //配置T0定时1msConfigUART(9600); //配置波特率为9600while(1){UartDriver();}}void ConfigTimer0(unsigned int ms) //T0配置函数{unsigned long tmp;tmp = 11059200 / 12; //定时器计数频率tmp = (tmp * ms) / 1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时器重载值tmp = tmp + 34; //修正中断响应延时造成的误差T0RH = (unsigned char)(tmp >> 8); //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0; //清零T0的控制位TMOD |= 0x01; //配置T0为模式1TH0 = T0RH; //加载T0重载值TL0 = T0RL;ET0 = 1; //使能T0中断TR0 = 1; //启动T0}void InterruptTimer0() interrupt 1 //T0中断服务函数{TH0 = T0RH; //定时器重新加载重载值TL0 = T0RL;UartRxMonitor(1); //串口接收监控}现在看这种串口程序,是不是感觉很简单了呢?串口通信程序我们反反复复的使用,加上随着我们学习的模块越来越多,实践的越来越多,原先感觉很复杂的东西,现在就会感到简单了。