一种RS485总线实现多主机间的通信方法
文献发布时间:2024-04-18 19:58:26
技术领域
本发明涉及RS485总线通信技术领域,具体是一种RS485总线实现多主机间的通信方法。
背景技术
RS485总线是标注RS485网络中实现通信的所必备的线缆,通过传统的RS485总线实现RS485网络通信中,只能实现单个主机与多个从机之间的通信。在包括多个从机的通信中,若某一个从机希望向主机发送信息,只能等待主机通过轮询方式向该从机请求数据,才能够使得该从机使用总线向主机发送信息。由于采用轮询方式,导致数据的实时性较差,并且需要主机多次向从机询问是否有进行上报,增加了总线的通信负担,通信的效率低下。
为了实现多主机间通信,现有技术通常采用CAN总线的通信方式,但是CAN总线的通信方式对于硬件设计和软件开发都需要使用到CAN通信协议,CAN通信协议较为复杂,门槛较高,导致所设计的CAN芯片相比于RS485芯片成本更高,不易于推广使用。
综上,希望能够基于RS485实现多主机通信,并避免采用轮询方式,以提高通信的效率,成本更低。
发明内容
针对现有技术的不足,本发明的目的是提供一种RS485总线实现多主机间的通信方法,其能够解决背景技术描述的问题。
实现本发明的目的的技术方案为:一种RS485总线实现多主机间的通信方法,应用于RS485通信网络,所述RS485通信网络包括主节点和若干次节点,为在总线上的每一个次节点配置占领码和总线占领码变量,占领码表征当前总线是否分配到自身次节点,总线占领码变量表征总线当前是否被次节点所控制,所述通信方法包括以下步骤:
步骤1:若当前次节点需要向主节点发送数据,则先判断当前总线占领码变量是否为0,若是,则向主节点发送包括占领帧的占领总线请求,占领帧包括占领码和校验码;
步骤2:发送占领帧后等待t时间,在t时间内,判断是否接收到主节点响应于占领总线请求所返回的总线状态返回码,
若否,则随机延时一段时间后,再次向主节点发送占领帧,直至获得总线返回的总线占返回码;
若是,则判断总线状态返回码中的占领码与本次发送的占领码是否一致,
若是,则执行步骤3,
若否,则判断总线状态返回码中的占领码是否为0,
若是,则随机延时一段时间后,重新向总线发送占领帧,
若否,则跳转至步骤1,重新判断当前总线占领码变量是否为0;
步骤3:当前次节点向主节点发送数据,数据全部发送完毕后,向主节点发送释放帧,主节点接收到释放帧后,解除当前次节点对总线的控制,并重新跳转至步骤1。
进一步地,在步骤1中,若当前总线占领码变量不为0,则继续判断当前总线占领码变量是否为0。
进一步地,在步骤2中,t的取值按公式①得到:
------①
式中,c表示光速,τ表示TTL电平转换时间加上处理器处理一帧数据帧的时间。
进一步地,在步骤3中,当主节点接收到数据后,若所接收到的数据为占领帧,则判断占领帧中的占领码和校验码是否正确,
若不正确,则返回总线状态返回码,并将总线状态返回码中的占领标志设为1,占领码设为0,以表示主节点接收到的占领帧有误,
若正确,则发送相应的总线状态返回码给当前次节点,并开启定时器开始计时,
若所接收到的数据为数据帧,则对数据帧进行CRC校验,若正确,则将定时器的计时重置为0,若CRC校验错误且连线超过预设次数,则判断当前占领总线的占领码异常并进行上报,
若所接收到的数据既非数据帧,也非占领帧,而是异常帧,并且异常帧接收不超过预设次数,则重新接收数据,
若异常帧超过预设次数,则判断为总线中某个次节点出现故障,上报总线异常。
进一步地,在步骤2之后,步骤3之前,还包括步骤S:
步骤S:在当前次节点占领总线时刻起,定时器开始计时,在当前次节点占领总线期间,每当接收到一帧有效数据帧,则定时器重置为0,若定时器从开始计时到当前时间的时长超过预设时长,均未接收到有效数据帧,则向当前节点发送总线返回状态码,并将总线返回状态码中的占领码设为0,以便以释放总线,并关闭定时器。
本发明的有益效果为:本发明可实现当某一节点在需要向总线发送数据的时候,需要向总线发送总线占领码,以尝试占领总线,在数据发送结束时发送总线释放码进行释放总线,进而实现多主通信,对于次节点异常检测,则可通过使用定时器对占领总线的节点进行定时检测,进而保证该通信的健壮性和稳定性。本发明可实现多主通行,避免传统的RS485总线通信中的轮询策略,并提高了通信的健壮性和稳定性。
附图说明
图1为本发明的流程示意图。
具体实施方式
下面结合附图及具体实施方案,对本发明做进一步描述:
如图1所示,一种RS485总线实现多主机间的通信方法,应用于RS485通信网络,所述RS485通信网络包括主节点和若干次节点,为在总线上的每一个次节点配置占领码和总线占领码变量,占领码表征当前总线是否分配到自身次节点,总线占领码变量表征总线当前是否被次节点所控制,所述通信方法包括以下步骤:
步骤1:若当前次节点需要向主节点发送数据,则先判断当前总线占领码变量是否为0,若为0,则向主节点发送包括占领帧的占领总线请求,占领帧包括占领码和校验码,若不是(即不为0),则继续判断当前总线占领码变量是否为0。占领码为0,也就意味着当前总线没有被任何一个次节点所控制,允许向主节点发送占领帧,以尝试占领总线。
步骤2:发送占领帧后等待t时间,在t时间内,判断是否接收到主节点响应于占领总线请求所返回的总线状态返回码,若未接收到总线状态返回码,表明当前次节点可能与其他次节点同时向总线发送占领帧而导致数据冲突,使得主节点无法正确接收到数据,则需要随机延时一段时间后,再次向主节点发送占领帧,直至获得总线返回的总线占返回码。
在本步骤中,等待t时间的目的在于通过延时t时长,使得在满足从次节点传输到主节点,再从主节点传回到次节点所需要的时间之后再判断是否接收到总线状态返回码,以避免数据还在传输过程中就先行判断。
设置一个随机延时时间,目的在于减小下次多个次节点同时向总线发送占领帧的概率,从而可以减小总线冲突的发生概率。
其中,t的取值可以按公式①来得到:
------①
式中,c表示光速,τ表示TTL电平转换时间加上处理器处理一帧数据帧的时间,τ可以根据实际情况做适当的延长。
若接收到总线状态返回码,则判断总线状态返回码中的占领码与本次发送的占领码是否一致,若一致,则执行步骤3;若不一致,则判断总线状态返回码中的占领码是否为0,若为0,表明主节点所接收到的占领码错误或校验错误(例如CRC校验出错),可能的原因是当前次节点与其他次节点同时向总线发送占领帧所导致的数据冲突。故随机延时一段时间后,重新向总线发送占领帧。若不为0,则跳转至步骤1,重新判断当前总线占领码变量是否为0。
其中,总线状态返回码中的占领码与本次发送的占领码不一致,表明当前次节点虽与其他次节点同时向主节点发送占领码,但主节点首先接收到来自其他次节点的占领码,故还需要继续判断线状态返回码中的占领码是否为0,以等待总线空闲。总线状态返回码中的占领码与本次发送的占领码一致,表明当前节点拥有对总线的控制权,可以进入到下一步骤直接发送数据。
步骤3:当前次节点向主节点发送数据,数据全部发送完毕后,向主节点发送释放帧,主节点接收到释放帧后,解除当前次节点对总线的控制,并重新跳转至步骤1,等待下一个次节点对总线的控制,以向主节点发送数据。
在一个可选的实施方式中,在步骤3中,当主节点接收到数据后,若所接收到的数据为占领帧,则判断占领帧中的占领码和校验码是否正确,若不正确,不正确的原因可能是多个占领帧同时发送导致数据冲突引发的错乱,则返回总线状态返回码,并将总线状态返回码中的占领标志设为1,占领码设为0,以表示主节点接收到的占领帧有误。若正确,则发送相应的总线状态返回码给当前次节点,并开启定时器开始计时。若所接收到的数据为数据帧,则对数据帧进行CRC校验,若正确,则将定时器的计时重置为0,若CRC校验错误且连线超过5次(具体次数可以根据实际情况来调整),则判断当前占领总线的占领码异常并进行上报,以便以工程师对该节点进行检查。若所接收到的数据既非数据帧,也非占领帧,而是异常帧,并且异常帧接收不超过5次,则重新接收数据;若异常帧超过5次,则判断为总线中某个次节点出现故障,上报总线异常。
在一个可选的实施方式中,为了避免某个次节点在成功占领总线后一直被无效占领现象的发生,也即拥有对总线的控制权后,在长时间内既无发送数据,也没有释放对总线的控制权,从而导致总线一直被无效占领,故在步骤2之后,步骤3之前,还包括步骤S:
步骤S:在当前次节点占领总线时刻起,定时器开始计时,在当前次节点占领总线期间,每当接收到一帧有效数据帧,则定时器重置为0。若定时器从开始计时到当前时间的时长超过预设时长,均未接收到有效数据帧,则向当前节点发送总线返回状态码,并将总线返回状态码中的占领码设为0,以便以释放总线,并关闭定时器。从而可以避免当前次节点长期无效的占领总线。
本发明可实现当某一节点在需要向总线发送数据的时候,需要向总线发送总线占领码,以尝试占领总线,在数据发送结束时发送总线释放码进行释放总线,进而实现多主通信,对于次节点异常检测,则可通过使用定时器对占领总线的节点进行定时检测,进而保证该通信的健壮性和稳定性。本发明可实现多主通行,避免传统的RS485总线通信中的轮询策略,并提高了通信的健壮性和稳定性。
本说明书所公开的实施例只是对本发明单方面特征的一个例证,本发明的保护范围不限于此实施例,其他任何功能等效的实施例均落入本发明的保护范围内。对于本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及变形,而所有的这些改变以及变形都应该属于本发明权利要求的保护范围之内。
- 一种实现主机设备间通信的方法和网络侧设备
- 一种实现主机设备间通信的方法和网络侧设备