一种基于RS485多主机有线串行通讯的方法
技术领域
本发明涉及通讯技术领域,尤其涉及一种适用于智能家居系统中各设备的连接、基于RS485多主机有线串行通讯的方法。
背景技术
目前,使用RS485作为通讯介质进行设备通讯,一般通过主(Master)设备中转实现,这个主设备通常是PC,而且这种设备网中只允许存在一个主(Master)设备,其余全部是从(Slave)设备。
在这种主从多机通讯系统中,一台主机和多台从机连接到同一RS485总线上,如图1所示,主机①通过RS485与从机②、③、④、⑤相连,RS485总线由主机①进行管理和调度。其通讯的方法如下:主机①有消息需要发送到某从机时,先对此从机进行叫号;从机一般均处于被叫状态,等待主机叫号。从机收到主机RS485地址叫号后,如果与自己RS485地址相同,则接收后继总线上的信息数据,否则继续等待主机地址叫号。被叫号的从机收到一个完整的信息包后,如果有信息需发送给主机,则可以将信息数据发送到RS485总线上供主机接收。在主从多机通讯系统中,只有被叫号的从机才有权利发送信息数据给主机,主机必须轮流向各从机叫号。
上述主从多机通讯的方法存在着以下缺陷:
第一、从机②、③、④、⑤与主机①通讯时,需按照主机①的分时机制分成时间片,排队与主机①通讯。假如从机⑤排在队列最后,有可能要等待很长时间或者根本无法分到与主机①通讯的时间片,从而无法及时或根本得不到响应。从机越多,意味着队列越长,等待响应的时间也越长。
第二、两台从机不能直接通讯,必须通过主机才能通讯。例如从机②要发送信息给从机③,必须经由RS485总线先与主机①通讯,根据主机①查询提供的数据再与从机③通讯。这样便浪费了通讯线路和时间。
第三、对主机的依赖性强,所有的从机通讯都必须依赖主机。一旦主机崩溃,则整个通讯系统都随之崩溃。
发明内容
本发明的目的在于克服现有技术的不足,提供一种基于RS485总线、在链路层通过发送数据、接收数据、定时处理过程实现多主机有线串行通讯的方法,使得各连接设备相互间能够直接通讯,以提高通讯效率,并增强通讯系统的通用性和可靠性。
本发明的目的通过以下技术方案予以实现:
本发明提供的一种基于RS485多主机有线串行通讯的方法,每一台设备均为主机,通过RS485总线相互连接;各设备间的通讯,包括发送数据过程、接收数据过程和定时处理过程;
其中发送数据过程包括以下步骤:
(1-1)需要发送数据的发送方设备在发送数据前,首先判断要发送的数据包是一般数据包、点对点回复包还是重发包、广播数据包的回复包;
(1-2)如果要发送的数据包是一般数据包或者点对点数据包的回复包,如果当前发送状态忙,则判断是否在发送延时中,并且当前数据包的紧急发送标志是否置位,如果不是,则暂缓发送;如果当前发送状态空闲,则设置好发送指针、发送计数器,再判断网络是否空闲,若网络空闲,则启动发送;若网络忙,则设置发送延时及重发次数,延时结束后再发送;
(1-3)如果要发送的数据包是重发包或者广播数据包的回复包,则设置发送延时时间及重发次数,延时结束后发送;
接收数据过程包括以下步骤:
(2-1)判断当前是否处于数据包接收状态,若不是在数据包接收状态,则判断接收到的数据是否数据包起始标志,如果是起始标志,则将接收状态设置为数据包接收状态,并初始化接收缓冲区及接收指针,准备接收数据;
(2-2)在数据包接收状态,判断接收到的数据是否数据包结束标志,如果不是结束标志,则数据进行转义处理后存入接收缓冲区;
(2-3)在数据包接收状态下,接收到数据包结束标志,则判断数据包长度是否正确,长度正确则再判断数据包校验和是否正确,如果不正确的话,复位接收标志,返回接收空闲状态;
(2-4)接收到的数据包长度、校验都正确的话,判断该数据包是否回复包,如果是回复包,则判断是否对本机地址的回复,如果是,则清除本机等待回复标志,等待发送新的数据包;如果不是对本机地址的回复,则进行竞争回复处理;
(2-5)如果接收到的是一般数据包,则判断数据包的目的地址是否本机,如果是,则生成并发送回复包,并把接收到的数据交给上层程序进行处理;
定时处理过程包括以下步骤:
(3-1)判断当前发送状态是否在发送延迟;若在发送延时状态,则将发送延时减1,如果发送延时减少到0,则判断当前网络状态是否空闲,如果网络状态空闲,则发送数据包起始标志;否则,判断发送重试次数减1是否等于0,如果等于0,则发送出错;不等于0,则设置重发延时;
(3-2)判断当前发送状态是否在发送超时状态;如果是,则判断发送超时时间减1是否等于0,若等于0,则启动发送超时处理;
(3-3)判断是否处于等待ACK状态;如果是,则将等待时间减1,若等待时间等于0,则回复超时,将重发计数器减1;如果不等于0,重发数据包;否则,启动发送失败处理。
本发明使用RS485将多台设备连接,且每台设备都视为主机,在通讯上具有同等的地位。当多台设备需要与某台设备通讯时,则根据发送数据包的类型以及设备的发送状态、通信链路的状态,通过立即发送或者延时发送进行通讯。
在延时发送过程中,本发明遵循以下延时规则:设备类型优先级延时+随机延时,其中随机延时的时间小于优先级延时的时间。
发送方设备发送数据包后,收到回复包则通讯过程结束。对于广播数据包,收到数据包的所有设备均要产生回复包,并采用竞争回复机制向发送方设备发送回复信息,其步骤如下:
1)在实际发送广播数据包的回复信息前,首先设置延时;
2)在延时等待的过程中,检测有无别的设备对此广播数据包先进行了回复;如果有,则放弃对该广播数据包的回复;如果没有,则按照所述发送数据过程向发送方设备发送回复信息。
本发明可以具体通过以下方式检测有无别的设备对此广播数据包先进行了回复:设备在串行接收缓冲区中判断是否有新的数据包接收到,该数据包是否是回复包,回复的目的地址是否与分机待发的回复包的目的地址相同;如果待发的回复包与新接收到的数据包一致,则放弃回复,取消发送;如果没有,则按照所述发送数据过程向发送方设备发送回复信息。
本发明如果发送方设备没有收到回复信息,则必须重新发送数据。在重发数据包时,发送方设备必须产生一个超时等待时间来重新发送数据包,当超时等待时间到则按照所述发送过程发送数据包;发送方设备最多重发数据两次,两次发送的间隔时间为:超时等待时间加上发送延时时间。例如,必须等待350ms的超时等待时间,而且当延时时间到且通讯链路空闲才再次开始发送数据。
本发明具有以下有益效果:
(1)各设备通过RS485连接,无须依赖一台主机来进行调度和管理,每一台设备都是主机,通讯的地位是同等的,可以直接通过RS485相互通讯,增强了通讯系统的通用性。由于摆脱了对一台主机的依赖,因此即使连接的主机中有一台或多台崩溃,其余的设备也可以正常通讯。
(2)根据发送数据包的类型以及设备的发送状态、通信链路的状态进行通讯,节约了通讯时间和线路,提高了效率。
(3)对于广播数据包,接收方设备采用竞争回复机制,发送方设备如已收到回复信息,其余接收方设备则可以放弃回复,提高了通讯及处理效率。
(4)采用重发机制,确保数据的发送,提高了通讯系统的可靠性。
附图说明
下面将结合实施例和附图对本发明作进一步的详细描述:
图1是现有技术中RS485主从机有线串行通讯结构原理图;
图2是本发明实施例RS485多主机有线串行通讯结构原理图;
图3是本发明实施例中发送数据工作流程框图;
图4是本发明实施例中接收数据工作流程框图;
图5是本发明实施例中定时处理工作流程框图;
图6是本发明实施例中竞争回复机制的工作流程框图;
图7是本发明实施例中重发机制的工作流程框图。
具体实施方式
图2~图7所示为本发明的实施例。如图2所示,各设备通过RS485连接,每台设备均为主机,在通讯上具有同等的地位。例如:主机A发送数据给主机B,只需要通过RS485直接发送即可。这种结构摆脱了对一台主机的依赖,即使连接的主机中有一台或多台崩溃,其余的主机也可以正常通讯。如果主机B、C、D都要与主机A通信,则主机B、C、D在发送数据前,竞争总线控制权,一旦总线空闲,则可以启动发送,直到发送完毕。总线是否空闲的判断方法如下:在发送数据包前的一刻,本机是否在接收一个数据包的过程中?如果在接收一个数据包的过程中,则表示总线忙,不能发送干扰其他主机的数据。如果在发送的时候总线忙,则需要延时设定的时间,重试发送,直到发送出数据或者重试次数到达极限为止。
各设备间的通讯,包括发送数据过程、接收数据过程和定时处理过程。
如图3所示,发送数据过程包括以下步骤:
(1-1)需要发送数据的发送方设备在发送数据前,首先判断要发送的数据包是一般数据包、点对点回复包还是重发包、广播数据包的回复包;
(1-2)如果要发送的数据包是一般数据包或者点对点数据包的回复包,如果当前发送状态忙,则判断是否在发送延时中,并且当前数据包的紧急发送标志是否置位,如果不是,则暂缓发送;如果当前发送状态空闲,则设置好发送指针、发送计数器,再判断网络是否空闲,若网络空闲,则启动发送;若网络忙,则设置发送延时及重发次数,延时结束后再发送;
(1-3)如果要发送的数据包是重发包或者广播数据包的回复包,则设置发送延时时间及重发次数,延时结束后发送。
在延时发送过程中,遵循以下延时规则:设备类型优先级延时+随机延时,其中随机延时的时间小于优先级延时的时间。本实施例可以采用在内部制定的如表1所示的延时算法表,通过设备的地址,查找相应的延时时间(ms)。
表1 延时算法表
如图4所示,接收数据过程包括以下步骤:
(2-1)判断当前是否处于数据包接收状态,若不是在数据包接收状态,则判断接收到的数据是否数据包起始标志,如果是起始标志,则将接收状态设置为数据包接收状态,并初始化接收缓冲区及接收指针,准备接收数据;
(2-2)在数据包接收状态,判断接收到的数据是否数据包结束标志,如果不是结束标志,则数据进行转义处理后存入接收缓冲区(转义处理:若上一个接收的数据为0x7D,则当次接收到的数据需异或0x20);
(2-3)在数据包接收状态下,接收到数据包结束标志,则判断数据包长度是否正确,长度正确则再判断数据包校验和是否正确,如果不正确的话,复位接收标志,返回接收空闲状态;
(2-4)接收到的数据包长度、校验都正确的话,判断该数据包是否回复包,如果是回复包,则判断是否对本机地址的回复,如果是,则清除本机等待回复标志,等待发送新的数据包。如果不是对本机地址的回复,则进行竞争回复处理;
(2-5)如果接收到的是一般数据包,则判断数据包的目的地址是否本机,如果是,则生成并发送回复包,并把接收到的数据交给上层程序进行处理。
如图5所示,定时处理过程包括以下步骤:
(3-1)判断当前发送状态是否在发送延迟;若在发送延时状态,则将发送延时减1,如果发送延时减少到0,则判断当前网络状态是否空闲,如果网络状态空闲,则发送数据包起始标志;否则,判断发送重试次数减1是否等于0,如果等于0,则发送出错;不等于0,则设置重发延时;
(3-2)判断当前发送状态是否在发送超时状态;如果是,则判断发送超时时间减1是否等于0,若等于0,则启动发送超时处理;
(3-3)判断是否处于等待ACK状态;如果是,则将等待时间减1,若等待时间等于0,则回复超时,将重发计数器减1;如果不等于0,重发数据包;否则,启动发送失败处理。
发送方设备发送数据包后,收到回复包则通讯过程结束。对于广播数据包,收到数据包的所有设备均要产生回复包,并采用竞争回复机制向发送方设备发送回复信息,如图6所示,其步骤如下:
1)在实际发送广播数据包的回复信息前,首先设置延时;
2)在延时等待的过程中,检测(设备在串行接收缓冲区中判断是否有新的数据包接收到,该数据包是否是回复包,回复的目的地址是否与分机待发的回复包的目的地址相同)有无别的设备对此广播数据包先进行了回复;如果待发的回复包与新接收到的数据包一致,表明已有设备进行了回复,则放弃对该广播数据包的回复,取消发送;如果没有,则按照发送数据过程向发送方设备发送回复信息。
本实施例如果发送方设备没有收到回复信息,则必须重新发送数据。如图7所示,在重发数据包时,发送方设备必须产生一个超时等待时间来重新发送数据包,当超时等待时间(如350ms)到则按照发送过程发送数据包;发送方设备最多重发数据两次,两次发送的间隔时间为:350ms的超时等待时间加上发送延时时间。