基于RS485桥电路装置的通信方法与流程

文档序号:11177084阅读:932来源:国知局
基于RS485桥电路装置的通信方法与流程

本发明涉及串行通信技术,特别涉及一种基于rs485桥电路装置的通信方法。



背景技术:

rs485是两线制、半双工、差分信号通讯接口(物理层)。参见图1,传统rs485总线允许多个设备连接到同一条总线上,这些设备通常使用modbus协议格式通讯,每个设备预先设置一个485id。主机采用轮询的方式跟总线上的设备交互,通过485id区分各个设备。主机发送请求时所有设备均会收到,但是只有485id相匹配的那个设备应答,485总线是半双工的,同一时间只能有一个数据发送者。传统rs485总线的所有传感器接在一根数据线上,线越长,信号衰减越严重,通讯就越容易受到外界电磁干扰。

此外,根据传统的rs485总线技术,还存在如下缺点:广播式通讯总线上垃圾信息过多,时不时会遇到因为繁忙而死机的传感器;遇到因出现故障而乱发数据的传感器时,拖累整条总线不能正常通讯;维护每个传感器的id并不容易,特别是以后增加新传感器的时候;很难实现“自动识别”总线上传感器的数量和类型(也就是即插即用)。

因此,现有技术中存在对一种能够基于rs485采用新的通信方式以消除现有技术存在的缺陷的通信方法的需要。



技术实现要素:

有鉴于此,本发明提供一种基于rs485桥电路装置的通信方法,可以克服现有技术存在的问题。

本发明的技术方案具体是这样实现的:

一种基于rs485桥电路装置的通信方法,其中,m个桥电路装置通过rs485总线串联在一起并连接到主机,一个桥电路装置包括处理器;作为p端的第一rs485串口,用于通过总线连接上一个桥电路装置;作为n端的第二rs485串口,用于通过总线连接下一个桥电路装置;以及作为桥电路装置的l端的第三串口,用于连接类型匹配的传感器,所述处理器与第一rs485串口、第二rs485串口和第三串口进行信号交互,该方法包括:

桥电路装置从总线上开始接收到数据包时,判断数据包中的命令开始符是否表明数据包为携带自动分配地址的命令代码的数据包;

如果确定数据包不是携带自动分配地址的命令代码的数据包,桥电路装置将从它的p端口收到的所述数据包时立即开始逐单位信息长度的先转发到它的n端口以传递到下一个桥电路装置;

桥电路装置从它的p端口接收到数据包中的结束符时,解析所接收的通讯数据包以得到解析的uid和命令代码;将解析的uid与该桥电路装置的uid比较,如解析的uid与该桥电路装置的uid相同,则该桥电路装置执行该数据包中的命令代码所代表的命令以进行与主机的通信;如不相同则忽略所述命令;

其中,所述数据包是由主机向rs485总线上发送的,该数据包的格式为:依次按序排列的命令开始符、桥电路装置的uid、命令代码、第一内容和结束符;其中,命令开始符和结束符之间的数据被转码,命令开始符的最高位为“1”,用于表示一个数据包的开始,其它字节都是以“0”开始的字节;所述转码为将8比特一字节的数据转换为以7比特为一字节的数据。

较佳地,所述的方法还包括步骤:

如果确定数据包是携带自动分配地址的命令代码的数据包,桥电路装置向给该桥电路装置发送数据包的发包方发送响应信息以通知发包方已收到所述数据包;其中,发包方为在所述桥电路装置之前的、最近的一个装置,即为主机和与其相邻的上一个桥电路装置之一;

所述桥电路装置将收到的数据包中的uid值加“1”更新数据包中的uid值,然后将该数据包发送给与其相邻的下一个桥电路装置,并将更新后的uid值作为它的地址;

所述桥电路装置如接收到与其相邻的下一个桥电路装置发送的响应数据包,则将该响应数据包转发给与其相邻的发包方;

如桥电路装置没有接收到响应信息,则向与其相邻的发包方发送响应数据包,该响应数据包中携带有该桥电路装置的uid值。

其中,如解析的uid与该桥电路装置的uid相同,则该桥电路装置执行该数据包中的命令代码所代表的命令包括:

如果该命令为针对该桥电路装置的自动读取传感器数据指令,则该桥电路装置记住该自动读取传感器数据指令并自动的重复向与该桥电路装置连接的传感器发送,以自动从该传感器取数据,并将读取的数据进行转码后保存。

其中,如解析的uid与该桥电路装置的uid相同,则该桥电路装置执行该数据包中的命令代码所代表的命令包括:

如该命令为针对该桥电路装置的开启直接通道指令,则该桥电路装置开启它的l端口到p端口的双向转发通道,并且关闭它的n端口;

桥电路装置将主机发送的数据包反转码后发送给它的传感器,并将来自它的传感器进行转码的数据后转发给主机。

进一步,所述的方法包括:

所述桥电路装置完成将来自它的传感器的数据转发给主机后,如果接收来来自主机的数据包并从数据包解析出不同于开启直接通道指令的指令时,该桥电路装置关闭它的l端口到p端口的双向转发通道,并且开启它的n端口。

进一步,所述的方法包括:

如果所述桥电路装置从它的n端接收到请求重新分配地址的信号,则将该请求重新分配地址的信号转发到它的发包方;

其中,如果所述桥电路装置具有最大地址值,则使该桥电路装置的n端口处于读状态。

较佳地,所述桥电路装置在上电时处于p和n端口双向数据转发状态。

其中,所述单位信息长度为1字节或者1比特。

此外,所述的方法还包括:

所述桥电路装置利用命令代码所代表的命令判断它是否处于空闲状态;

如果是,所述桥电路装置向具有大于它的地址的桥电路装置发送通信请求以进行通信。

其中,所述响应数据包具有与所述数据包相同的格式,所述响应数据包中的命令代码是所回应的数据包中的命令代码数值的反码。

如上可见,在本发明中的基于rs485桥电路装置的通信方法,提供了可以用于基于rs485桥电路装置的新通信方式。由于传感器并不是直接连接到总线上,而是通过桥电路装置连接到总线上,因此可以避免了现有技术中的垃圾信息过多;此外,每一个桥电路装置与主机的通信都是相对独立的,而且由于桥电路装置采用“先转发后处理”的方式,即使某一个桥电路装置连接的传感器有问题,也不影响总线的运行;而且,新的桥电路装置增加后,主机还可以自动识别并且重新自动分配地址。

附图说明

图1是现有技术中的基于rs485的传统总线电路示意图。

图2为本发明实施例中的基于rs485的桥电路装置的组成示意图。

图3为本发明实施例中的基于rs485的桥电路装置的总线电路示意图。

图4为本发明实施例中的基于rs485桥电路装置的通信方法的流程图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。

本发明中,基于rs485的桥电路装置具有三个端口,分别为l端,p端和n端,p端和n端分别用于连接上一个和下一个桥电路装置,l端用于连接到传感器。基于rs485的桥电路装置直接连接到rs485总线上。这样,传感器不再直接连接到rs485总线上,主机不再直接与传感器交互,而是使用485总线协议与桥电路装置交互。桥电路装置及与其连接的传感器可以称为rs485总线上的一个节点。rs485总线上的每两个桥电路装置之间都是一段独立的数据线,甚至基于rs485的桥电路装置连接传感器的那段线即l端也是一段独立的数据线,基于rs485的桥电路装置通过接力的方式在节点之间传递数据。可见,采用本发明,节点之间的数据线长度变短了,因此信号衰减小了,信号线上的信号抗干扰能力也相应变强。

本发明中,总线上的基于rs485的桥电路装置是数据搬运工即数据转发设备,rs485总线也是使用rs485物理接口,但不使用modbus协议,而是使用自定义协议。自定义协议在本发明中不是必须的,本发明也可以由本领域技术人员采用其它协议,因此在此略去对自定义协议的介绍。桥电路装置是主机跟传感器通讯的桥梁,它为主机和传感器提供一条不同与传统rs485总线的通讯线路。rs485总线上只连接基于rs485的桥电路装置,不像传统rs485总线那样直接连接传感器。使用rs485总线时,主机不再直接跟传感器交互,而是使用rs485桥协议跟桥电路装置交互。桥协议提供命令供主机将打包后的“传感器指令”转发给传感器来实现主机跟传感器的交互。

下面结合图2和图3对本发明的基于rs485的桥电路装置进行详细介绍。

图2示出了根据本发明实施例的基于rs485的桥电路装置的组成示意图。桥电路装置包括处理器,第一rs485串口和第二rs485串口。第一rs485串口用于通过总线连接上一个桥电路装置的第二rs485串口,第二rs485串口用于通过总线连接下一个桥电路装置的第一rs485串口。所述桥电路装置进一步包括作为桥电路装置的l端的第三串口,用于提供多种类型的接口以供连接类型匹配的传感器。

本发明中,第一rs485串口作为桥电路装置的p端,用于通过总线连接上一个桥电路装置;第二rs485串口作为桥电路装置的n端,用于通过总线连接下一个桥电路装置。所述处理器与第一rs485串口、第二rs485串口和第三串口进行信号交互。其中,所述第三串口为rs485、rs422和rs232串口的集合串口,用于连接基于rs485工作的传感器,基于rs422工作的传感器和基于rs232工作的传感器。较佳地,所述桥电路装置进一步包括辅助串口,用于连接期望类型的传感器。较佳地,所述处理器为c51芯片,所述第一rs485串口和第二rs485串口为rj45接口。根据本发明的实施例,第一rs485串口,第二rs485串口和第三串口是彼此独立的,能够彼此独立地同时进行数据通信。较佳地,桥电路装置还包括位于l端的干节点端口,用于连接干节点。

本发明的实施例中,虽然基于rs485的接口是半双工通讯的,但基于rs485的桥电路装置内部的三个接口是独立的,它们可以同时进行数据通讯,也就是说桥电路装置在将p端的数据转发到n端时,仍然可以跟l端连接的传感器进行通讯。这种工作方式比半双工通讯的传统rs485总线更高效。

传统rs485总线只能接rs485接口的传感器,而且通常只能以modbus协议进行通讯。而本发明中,基于rs485的桥电路装置的l端可以支持多种类型的传感器,这些传感器的协议可以是任意的。作为选择,l端也可以配置成仅连接一种类型的传感器。在rs485桥总线上,主机与这些不同类型传感器之间通讯不会产生任何冲突,因为实际直接跟传感器通讯的桥电路装置仅限于它所连接的那个rs485桥电路装置。

图3示出了根据本发明实施例的基于rs485的桥电路装置的总线电路示意图。如图4所示,基于rs485的总线电路包括m个串联连接在rs485总线上的节点和主机,m为正整数。每一个节点均为如前所述的桥电路装置,第一个节点的p端与所述主机连接,第m个节点的l端悬空,第i个节点的p端连接到第i-1个节点的l端,i为2,3,4,…,m-1。第k个节点和第k-1个节点之间的数据线为独立数据线段,k为2,3,4,…,m。较佳地,节点的p端、l端和n端中的每一个端口配置有4根线,其中2根线为信号线,另外2根线一根为地线,一根为5v电源线。较佳地,所述主机通过桥电路装置与传感器进行数据交互。较佳地,在主机通过桥电路装置与传感器进行数据交互,所述桥电路装置还可以与其后的桥电路装置通信。

参见图3,基于rs485的总线电路中,每两个桥电路装置即节点之间都是一段独立的数据线,甚至基于rs485的桥电路装置即l端连接传感器的那段线也是一段独立的数据线,桥电路装置通过接力的方式在节点之间传递数据。显然,由于节点之间的数据线长度变短了,因而信号衰减变小,抗干扰能力也就变强了。

根据本发明的实施例,主机发送给桥电路装置的数据包基本格式如下:

【命令开始符】+【桥模块uid】+【命令代码】+【内容】+【结束符】

桥协议要求【命令开始符】和【结束符】之间的数据要进行转码,以免这些数据中出现跟开始符、结束符冲突的字符。本发明中,转码规则是8bit转7bit,计算机每个字节由8个比特位组成,转码是将一组字节以每7个比特位重新组织,然后形成一组新的数据,新数据每个字节只使用低7位,最高位总是0(最高位为1是桥协议的特殊控制符,例如命令开始符和结束符),转码后的数据字节会比原数据字节多,但可以保证不会跟桥协议的特殊控制符冲突。

桥电路装置回应的数据包中可能会包含两份【内容】数据。因为rs485通讯是半双工的,一问一答式的,为了避免冲突,桥电路装置不能主动向主机发送数据包。有时候桥电路装置需要向主机报告一些事件,例如总线上新接入了一个桥电路装置,这个事件会在主机发出命令并等待回应时,桥电路装置将事件放在第2份【内容】数据中汇报给主机。

下面介绍本发明中的主要的rs485桥通讯命令代码和功能。

主机通过uid指定与某个桥电路装置通讯,每个桥电路装置都有一个自动分配的uid。本发明中,【命令代码】是单字节数值,命令需要的参数放在【内容】字段中。桥电路装置回应的数据包,【命令代码】是所回应命令的命令代码数值的反码。

主要的rs485桥通讯命令和功能如下:

1、要求总线上的桥电路装置自动分配地址(即uid)。

2、取“指定桥电路装置”的硬件信息(版本号、类型、出厂日期等信息)。

3、要求“指定桥电路装置”原样回复命令中携带的数据,用于测试线路通讯质量。

4、用一条命令获取总线所有桥电路装置的io输入状态(例如干节点输入状态)。

5、取“指定桥电路装置”的指定io的输入状态(例如干节点输入状态)。

6、将传感器指令告诉“指定桥电路装置”。桥电路装置记住指令并自动的重复向传感器发送这些指令,实现自动从传感器取数。该命令适合固定不变的传感器指令。

7、读取“指定桥电路装置”收到的传感器应答数据。桥电路装置自动从传感器取到数据后,先将数据存放到自己的内存区中,能保存多少条历史数据要看单条数据的大小。主机发送该命令从桥电路装置中读取这些传感器历史数据。这条命令跟上一条命令即第条命令是成对的。

8、要求“指定桥电路装置”开启主机到传感器的直接通讯通道。有些传感器通讯需要多次交互,或则,传感器数据量太大,桥电路装置无法对这样的传感器执行自动取数。主机可以用这条命令跟传感器建立直接通讯通道,桥电路装置负责主机和传感器之间的双向数据转发。

9、桥电路装置内部事件通知,主要是用于桥电路装置之间的一些事件沟通。

参见图4,示出了本发明实施例中的基于rs485桥电路装置的通信方法的流程图。在步骤10,主机向总线上发送数据包,总线上的桥电路装置开始接收数据包。本发明中,总线上的任何一个桥电路装置开始接收到数据包时,均先判断数据包中的命令开始符是否表明数据包为携带自动分配地址的命令代码的数据包。根据本发明的实施例,所述数据包是由主机向rs485总线上发送的,该数据包的格式为:依次按序排列的命令开始符、桥电路装置的uid、命令代码、第一内容和结束符;其中,命令开始符和结束符之间的数据被转码,命令开始符的最高位为“1”,用于表示一个数据包的开始,其它字节都是以“0”开始的字节;所述转码为将8比特一字节的数据转换为以7比特为一字节的数据。较佳地,本发明的实施例是以命令开始符的值来判断该数据包所包含的命令代码是否是自动分配地址的命令,并且命令开始符所在的字节的值表示是何种类型的命令代码。

如果确定数据包不是携带自动分配地址的命令代码的数据包,桥电路装置将从它的p端口收到的所述数据包时立即开始逐单位信息长度的先转发到它的n端口以传递到下一个桥电路装置,步骤20。p和n端口间的数据转发可以“字节为单位”或“比特位为单位”进行。本发明中,单位信息长度为1字节或者1比特。本发明的实施例中,大部分时候基于rs485的桥电路装置处于p和n端口双向数据转发状态(一般来说上电后就进入这个状态),p端口收到的数据会转发到n端口,反之亦然。l端口是封闭的,数据不发给传感器,也不会把传感器发出的数据转发到485总线上,即不会发到p端口和n端口。

以字节为单位转发数据时,数据每经过一个桥模块需要延迟约1字节时间(例如9600波特率通讯每秒可传输960字节,1字节时间是1/960秒)。以比特位为单位转发数据时,数据每经过一个桥模块需要延迟约1比特位时间(例如9600波特率每传输1位的时间是1/9600秒)。

在步骤30,桥电路装置从它的p端口接收到数据包中的结束符时,解析所接收的通讯数据包以得到解析的uid和命令代码。接下来,桥电路装置将解析的uid与该桥电路装置的uid比较,如解析的uid与该桥电路装置的uid相同,则该桥电路装置执行该数据包中的命令代码所代表的命令以进行与主机的通信;如不相同则忽略所述命令,步骤40。

主机发出的命令总是需要rs485总线上的某个桥电路装置做出响应,为减少数据传递时间,桥电路装置采取先转发后执行的方式处理命令请求。主机发出的命令由多个字节组成,在数据线上总是一个字节一个字节的顺序传输,桥电装置收到数据后(收到1字节或1比特位)直接传递给下一个桥电路装置。当主机命令传输完成时,也就是桥电路装置收到命令结束符时,总线上的所有桥电路装置都收到了该命令的副本。然后,所有桥电路装置都开始解写这条命令,只有uid跟自己匹配的那个桥电路装置会执行这条命令,其他桥电路装置则忽略这条命令。

本发明的实施例中,如解析的uid与该桥电路装置的uid相同,桥电路装置将判断数据包中的命令代码所代表的命令,并执行相应的命令。如果该命令为针对该桥电路装置的自动读取传感器数据指令,则该桥电路装置记住该自动读取传感器数据指令并自动的重复向与该桥电路装置连接的传感器发送,以自动从该传感器取数据,并将读取的数据进行转码后保存。

如该命令为针对该桥电路装置的开启直接通道指令,则该桥电路装置开启它的l端口到p端口的双向转发通道,并且关闭它的n端口;桥电路装置将主机发送的数据包反转码后发送给它的传感器,并将来自它的传感器进行转码的数据后转发给主机。桥电路装置完成将来自它的传感器的数据转发给主机后,如果接收来来自主机的数据包并从数据包解析出不同于开启直接通道指令的指令时,该桥电路装置关闭它的l端口到p端口的双向转发通道,并且开启它的n端口。

连接到桥电路装置的多数传感器使用固定的指令进行取数,例如温度传感器,向传感器发送固定指令来获取当前温度数据。桥电路装置可以自动对这样的传感器取数,主机通过rs485总线和桥电路装置将温度传感器取数指令告诉桥电路装置,例如温度传感器取数指令被打包到数据包里经总线发送出去。接收到包含温度传感器取数指令的数据包后,桥电路装置就可以自动获取温度数据了,并且可以保存最近数次的历史数据。桥电路装置并不需要理解从传感器取得的数据,它只是将数据存储到内存中,当主机向它索取这些数据时再回应给主机。这种取数方式不需要建立一个主机到传感器的直接数据传输通道。

有些传感器不能由桥电路装置自动取数,比如传感器取数指令不是固定不变的,或则,传感器指令数据量过大,超出了桥电路装置的缓存能力。与这种传感器通讯,需要让桥电路装置建立一条主机到传感器的直接通讯通道。

例如,参见图3,主机向rs485总线发送命令,要求节点3建立一条主机到传感器的直接数据通道,节点3将开启主机和它所接传感器的直接双向数据转发(其实是开启节点3左边串口和l端口间的数据转发),节点3不会再转发后续的数据到它右边的串口(也就是停止继续向后转发数据),因为将主机跟传感器的数据通讯转发给后边的桥电路装置是没有意义的。节点1和2仍然处于左边和右边串口的双向数据转发状态,因为主机和节点3的数据需要它们做转发。

建立主机到传感器的直接数据通道后,数据在rs485总线上的传输仍然是以数据包格式打包并进行8bit到7bit的数据格式转换。传感器实际收到的是经过桥电路装置解包的原始传感器指令。完成传感器取数后,主机不需要显式的关闭这条直接通道,只要主机向rs485总线上的其他桥电路装置发送命令,节点3会自动关闭这条直接通道。

如果确定数据包是携带自动分配地址的命令代码的数据包,桥电路装置向给该桥电路装置发送数据包的发包方发送响应信息以通知发包方已收到所述数据包,步骤50。其中,发包方为在该桥电路装置之前的、最近的一个装置,即为主机和与其相邻的上一个桥电路装置之一。

接下来,桥电路装置将收到的数据包中的uid值加“1”更新数据包中的uid值,然后将该数据包发送给与其相邻的下一个桥电路装置,并将更新后的uid值作为它的地址,步骤60。

根据本发明的实施例,桥电路装置uid用来唯一标识总线上的节点,uid是自动分配的。当主机向总线发送“自动分配地址”命令时,数据包内的数值初始值为0,离主机最近的桥电路装置收到数据包后,将值+1,此值便是该桥电路装置的uid,也是它在总线上的顺序号。桥电路装置将+1后的数据包发送给下一个桥电路装置,以此类推,直到总线上的最后一个桥电路装置。此时,总线的所有桥电路装置都分配了uid,桥电路装置也知道了自己在总线上的位置。对于桥电路装置来说,收到命令的那个串口就是p端(连接上一个模块),另外一边的串口便是n端(连接下一个模块)。

接下来,桥电路装置判断是否接收到与其相邻的下一个桥电路装置发送的响应数据包。如果所述桥电路装置接收到与其相邻的下一个桥电路装置发送的响应数据包,则将该响应数据包转发给与其相邻的发包方,步骤70;如桥电路装置没有接收到响应信息,则向与其相邻的发包方发送响应数据包,该响应数据包中携带有该桥电路装置的uid值,步骤80。具体地,桥电路装置接收到“自动分配地址”命令后,先回应上一个节点,告诉它收到这条命令了,然后再向前转发后边桥电路装置回应的数据,末端桥电路装置很容易判断它后边没有节点了,因为没有桥电路装置向它回应“收到”。末端桥电路装置负责向主机发送命令的回应包,包的内容包含它自己的uid,这个uid也等于总线上节点的数量。回应包被传递回主机后,主机和总线上所有桥电路装置都知道总线节点的数量了。桥电路装置知道总线上节点数量是有益的,例如主机向一个不存在的节点发送请求时,这条请求到达第一个桥电路装置就被拦截了,然后桥电路装置向主机回应数据来报告错误。桥电路装置主动向主机报告错误能减少不必要的等待时间,因为通常情况下,主机需要设置一个比较夸张的等待时间来判断响应超时。

根据本发明的实施例,如果桥电路装置具有最大地址值,则使该桥电路装置的n端口处于读状态。本发明中,可以在总线上增加桥电路装置。一般地,新增的桥电路装置连接到末端的桥电路装置的n端。任何时候,桥电路装置被连接到末端的桥电路装置的n端时,它会发送请求重新分配地址的信号。

本发明的实施例中,如果一个桥电路装置从它的n端接收到请求重新分配地址的信号,则将该请求重新分配地址的信号转发到它的发包方。

根据本发明,桥电路装置在上电时处于p和n端口双向数据转发状态。

根据本发明,桥电路装置在工作过程中,可以利用命令代码所代表的命令判断它是否处于空闲状态;如果是,所述桥电路装置向具有大于它的地址的桥电路装置发送通信请求以进行通信。

具体地,rs485总线上的每段线路都是独立的,可以并行传输数据。而rs485本身是半双工的,收发不能同时进行,为了避免冲突,桥电路装置必须按照一些规则来并行传输数据:

1、通过解读总线上的命令,桥电路装置可以判断出空闲路段。

2、空闲路段上的节点必须由前边的节点先发起请求。例如,参见图3,节点4可以主动向节点5发起请求,反过来则不行,因为节点4可以决定它右边的串口什么时候空闲,而节点5不能确定什么时候节点4会向它发数据,所以节点5不能主动向节点4发起请求。

3、末端节点(图3中的节点5)不能向右边串口发数据,右边串口要留着接收数据。因为新接入的桥电路装置要发送一个接入信号(模块上电后向p和n两个端口都发这个信号),末端节点右边的串口为了接收这个接入信号,必须处于读状态。

此外,参见图3,根据本发明的实施例,当主机与节点3的传感器通讯时,从主机到节点3的线路“忙”,而节点3到节点5的线路是空闲的,节点4和节点5的桥电路装置在必要的时候就可以利用空闲路段进行数据通讯,例如执行“自动传感器取数”或“节点间状态交换”等操作。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1